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 等现代句向量模型,这一技术成为语义检索、聚类、去重的底层支柱。
参考与延伸阅读
- Mikolov et al. (2013). Efficient Estimation of Word Representations in Vector Space. arXiv:1301.3781. https://arxiv.org/abs/1301.3781
- Devlin et al. (2018). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. arXiv:1810.04805. https://arxiv.org/abs/1810.04805
- OpenAI 官方 Embeddings 指南(text-embedding-3 系列). https://platform.openai.com/docs/guides/embeddings
- Xiao et al. (2023). C-Pack: Packaged Resources To Advance General Chinese Embedding(BGE 系列). arXiv:2309.07597. https://arxiv.org/abs/2309.07597
- Chen et al. (2024). BGE M3-Embedding: Multi-Lingual, Multi-Functionality, Multi-Granularity Text Embeddings. arXiv:2402.03216. https://arxiv.org/abs/2402.03216
- BGE 模型卡与代码库 FlagEmbedding. https://github.com/FlagOpen/FlagEmbedding