一、从“符号”到“含义”:为什么需要Embedding?
在传统的信息检索中,比如搜索引擎早期的关键词匹配,系统处理的是符号本身。用户查询“苹果手机”和“iPhone”是两个完全不同的字符串,系统除非有同义词词典,否则很难关联它们。这种基于字面匹配的模式,我们称为词汇匹配,它无法理解“苹果手机”和“iPhone”在语义上是近义词。
为了打破这一瓶颈,我们需要一种能将文本(词、句子、段落乃至整篇文章)转换为计算机可理解的“含义”的数学表示。Embedding(嵌入向量)技术应运而生。它的核心思想是:将离散、高维的文本符号,映射到一个连续、低维的向量空间中。在这个空间里,语义相近的文本,其对应的向量在空间中的距离也相近。这样一来,检索“苹果手机”时,模型就能找到空间中距离它最近的“iPhone”向量,实现语义检索。
二、向量空间中的几何直觉
想象一个二维平面,我们把“国王”的向量放在(1, 2)点,“女王”的向量放在(1, -2)点,“男人”的向量在(2, 0),“女人”的向量在(0, -2)。一个有趣的向量关系出现了:国王向量 - 男人向量 + 女人向量 ≈ 女王向量。这个著名的例子展示了Embedding向量能捕捉到词与词之间的语义关系(如性别、国家关系等)。
在实际的高维空间(例如768维或1024维)中,这种关系变得更加复杂和强大。通过复杂的模型训练,相似概念的向量会聚集在一起,形成“语义簇”。例如,所有描述“快乐”的句子向量,可能会聚集在空间的某个区域。余弦相似度是衡量两个向量夹角最常用的指标,夹角越小(余弦值越接近1),说明两个向量越相似,语义越接近。
提示:你不必在脑海里真正“看到”768维空间,只需理解它是一个数学结构,其中的“距离”和“方向”蕴含了丰富的语义信息。
三、语义检索的完整流程
基于Embedding的语义检索,通常分为三个步骤:
- 编码:使用一个预训练好的文本编码模型(如BERT、Sentence-BERT、OpenAI的text-embedding-ada-002等),将数据库中的每一篇文档和用户的查询文本,分别转换为固定长度的向量。
- 索引:将生成的文档向量存入一个向量数据库或使用近似最近邻算法库(如FAISS)进行高效索引。这一步至关重要,因为暴力在所有文档向量中计算距离是非常耗时的。
- 检索:计算查询向量与索引中所有文档向量的相似度(如余弦相似度),返回相似度最高的Top-K个文档。
# 一个使用 Sentence-BERT 进行语义相似度计算的简单示例
from sentence_transformers import SentenceTransformer, util
# 加载一个预训练模型
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 准备句子
sentences = [
"如何学习编程?",
"怎样入门软件开发?",
"今天天气真不错。",
"学习写代码的途径有哪些?"
]
# 将句子编码为向量
embeddings = model.encode(sentences)
# 计算第一个句子与所有其他句子的相似度
query_embedding = embeddings[0]
scores = util.cos_sim(query_embedding, embeddings[1:])[0]
print("查询: ", sentences[0])
for i, score in enumerate(scores):
print(f" 与 “{sentences[i+1]}” 的相似度: {score.item():.4f}")
# 输出示例:
# 查询: 如何学习编程?
# 与 “怎样入门软件开发?” 的相似度: 0.8159
# 与 “今天天气真不错。” 的相似度: 0.0598
# 与 “学习写代码的途径有哪些?” 的相似度: 0.7903
四、关键选择:Embedding模型与相似度度量
构建语义检索系统时,有两个核心选择需要你做出决策:
- Embedding模型的选择:模型决定了向量质量。对于中文场景,
text2vec-base-chinese、bge系列等模型表现优异。你需要考虑模型的维度(影响精度和计算开销)、推理速度以及在你的任务数据上的效果。 - 相似度度量方法:常用的方法除了余弦相似度,还有欧氏距离和点积。对于归一化后的向量,余弦相似度与点积等价。在实际应用中,余弦相似度因其对向量长度不敏感,是最常用的选择。
五、超越基础检索:实际应用中的考量
在将理论付诸实践时,你可能会遇到以下问题:
- 长文本处理:大多数Embedding模型有最大长度限制(如512个token)。对于长文档,需要先进行分块,然后为每个文本块生成向量。
- 索引更新与维护:当有新文档加入或旧文档删除时,向量索引需要动态更新。选择支持增量索引的向量数据库(如Milvus、Pinecone)会方便很多。
- 参数调优:返回结果的数量(Top-K)、相似度阈值等参数需要根据业务场景进行调整,以达到最佳的召回率和精确率。
六、总结与要点回顾
- 核心思想:Embedding将语义信息编码为向量,语义相似度转化为向量空间中的几何距离。
- 核心优势:解决了词汇不匹配问题,支持跨语言检索,能理解上下文和意图。
- 关键组件:一个高质量的文本编码模型 + 一个高效的向量索引/数据库。
- 应用领域:语义搜索、问答系统、推荐系统、知识图谱补全、聚类分析等。
最终提醒:语义检索并非万能。对于高度依赖精确关键词(如产品型号、错误代码)的场景,传统关键词检索可能依然有效。混合检索(同时考虑关键词匹配和语义相似度)常常是工业实践中最稳妥的方案。