Embedding 与向量相似度:让机器理解语义

什么是 Embedding

Embedding(嵌入)是把离散的符号(如单词、句子、文档)映射为连续稠密向量的技术。向量是一串浮点数,例如一个 768 维或 1536 维的数组。关键在于:语义相近的文本,其向量在空间中距离也更近。这与「独热编码」等稀疏表示不同,稠密向量把语义压缩进少量维度,使机器能用几何距离衡量语义关系。

从 Word2Vec 到 BERT

早期代表是 Word2Vec(Mikolov et al., 2013,arXiv:1301.3781)。它用 Skip-gram 与 CBOW 两种架构,从大规模语料中训练词向量,并展现出「国王 - 男人 + 女人 ≈ 女王」这样的语义代数性质。但 Word2Vec 一个词只有固定向量,无法处理一词多义。

BERT(Devlin et al., 2018,arXiv:1810.04805)改用双向 Transformer 编码器,根据上下文动态生成词表示,解决了多义问题。现代 Embedding 模型多基于这类预训练语言模型,把整句或整段「编码」成一个句向量,作为语义表征。

余弦相似度怎么算

衡量两个向量语义接近程度,最常用的是余弦相似度:它看两个向量的夹角,而非绝对长度。公式如下。

cos(A, B) = (A · B) / (||A|| × ||B||)

其中 A·B 是点积,||A|| 是向量模长。结果范围在 -1 到 1 之间,越接近 1 表示语义越相似。实际计算可用 Python:

import numpy as np

def cosine(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# 假设 vec_q 为查询向量,vec_d 为文档向量
score = cosine(vec_q, vec_d)
print(score)

现代 Embedding 模型

现代通用文本 Embedding 模型多为句级、对比学习训练,直接输出可比较的稠密向量。

OpenAI 提供第三代文本嵌入模型 text-embedding-3-small(默认 1536 维)与 text-embedding-3-large(默认 3072 维),官方定义嵌入为「浮点数列表组成的向量」,用于衡量文本字符串的相关度(OpenAI 官方文档)。

中文与多语言场景常用 BAAI 的 BGE 系列,由智源研究院(BAAI)发布,对应论文 C-Pack(Xiao et al., 2023,arXiv:2309.07597)。BGE 在中文嵌入基准 C-MTEB 上显著领先,并提供 base/large 等多种规模与多语言版本(如 BGE-M3,arXiv:2402.03216),定位是检索与语义匹配场景的开源通用嵌入。

它支撑了什么

基于向量相似度,Embedding 支撑了多项基础能力:

  • 语义检索(RAG):把知识库文档向量化建索引,查询时取最相近的若干篇,而非关键词匹配,可理解同义改写。
  • 聚类:按向量将文本自动分组,用于话题发现或去噪。
  • 去重:计算两两相似度,超过阈值则判为重复内容。
  • 分类与推荐:用向量最近邻实现轻量归类。

小结

Embedding 把文本变成可计算距离的稠密向量,余弦相似度衡量其语义接近程度。从 Word2Vec 的词向量到 BERT 的上下文编码,再到 OpenAI text-embedding 与 BAAI BGE 等现代句向量模型,这一技术成为语义检索、聚类、去重的底层支柱。

参考与延伸阅读

本文累计阅读