一、从词袋模型到语义鸿沟:为什么需要 Embedding?
在传统的信息检索中,我们最熟悉的是关键词匹配。系统将文本切分成一个个独立的词(token),统计它们出现的频率,构建一个巨大的“词袋”(Bag-of-Words)。这种方法简单高效,但存在一个根本性问题:语义鸿沟。它无法理解“苹果”和“水果”的关系,也无法知道“汽车”和“轿车”几乎指代同一事物。用户搜索“便宜的车”时,可能无法召回标题中只含有“高性价比轿车”的文档。
为了跨越这条鸿沟,我们需要一种能量化语义的方法,让计算机不仅能计算字面匹配,还能理解“意思”上的相似度。这正是 Embedding(嵌入)技术的核心价值:将离散的、高维的符号(如单词、句子、图片)映射到一个连续的、低维的向量空间中,并且语义相近的对象,在这个空间中的距离也相近。
二、什么是 Embedding 向量?一个形象的理解
你可以把 Embedding 向量 想象成一个“语义坐标”。就像我们在地球仪上用经纬度定位一个地点,在语义空间里,一个词或句子被一个由数百甚至数千个数字组成的向量所“定位”。这个向量并非随机生成,它是由模型在海量文本数据上学习得来的,编码了该词或句子的丰富上下文信息。
举个例子:
- “国王” 的向量可能是
[0.2, 0.5, -0.1, ...] - “女王” 的向量可能是
[0.3, 0.6, -0.1, ...] - “苹果”(水果)的向量可能是
[-0.4, 0.1, 0.7, ...]
计算两个向量之间的距离(如余弦相似度),就能得到它们的语义相似度。“国王”和“女王”的向量距离很近,而它们与“苹果”的向量距离则很远。这种距离直接反映了语义上的关联性。
三、如何生成 Embedding?核心原理简述
生成 Embedding 的核心是训练一个神经网络模型。这个模型的目标不是完成分类或预测等具体任务,而是学习一个有效的转换函数。在自然语言处理(NLP)领域,最经典的范式是通过预测上下文来学习。
以 Word2Vec 算法为例,它有两种主要结构:
- CBOW(连续词袋):给定上下文词,预测中心词。
- Skip-gram:给定中心词,预测上下文词。
在训练过程中,模型不断调整其内部参数(即词向量),使得对于训练语料中真实出现的“词-上下文”对,预测概率最大。训练完成后,模型隐藏层的权重矩阵,就对应着我们所需的词向量表。如今,BERT、Sentence-BERT 等更先进的预训练模型,能够生成上下文相关的句子或篇章 Embedding,质量更高。
四、动手实践:使用模型生成 Embedding
理论说再多,不如一次实践。下面我们使用流行的 sentence-transformers 库,将几个句子转换为向量,并计算它们之间的相似度。
from sentence_transformers import SentenceTransformer, util
# 1. 加载一个预训练好的句子 Embedding 模型
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 2. 待编码的句子列表
sentences = [
"如何学习深度学习?",
"深度学习入门指南",
"今天天气真不错",
"我想找一篇关于机器学习的教程"
]
# 3. 生成句子的 Embedding 向量
embeddings = model.encode(sentences)
# 输出向量的形状和第一个句子向量的前5维
print(f"生成了 {len(embeddings)} 个向量,每个向量维度:{embeddings[0].shape}")
print(f"第一个句子的向量(前5维): {embeddings[0][:5]}")
# 4. 计算第一个句子与其它句子的余弦相似度
cosine_scores = util.cos_sim(embeddings[0], embeddings[1:])
print("\n相似度得分:")
for i, score in enumerate(cosine_scores[0]):
print(f" ‘{sentences[0]}’ 与 ‘{sentences[i+1]}’:{score:.4f}")
输出可能如下:
生成了 4 个向量,每个向量维度:(384,)
第一个句子的向量(前5维): [ 0.0303, -0.0499, 0.0263, 0.0788, -0.0104]
相似度得分:
‘如何学习深度学习?’ 与 ‘深度学习入门指南’:0.8521
‘如何学习深度学习?’ 与 ‘今天天气真不错’:0.0912
‘如何学习深度学习?’ 与 ‘我想找一篇关于机器学习的教程’:0.6478
提示:相似度得分范围为 -1 到 1。值越大,表示两个句子在语义上越接近。从结果可以看出,前两个句子意思高度相关,与天气句子无关,与机器学习教程句子有较强关联(都属于 AI 学习范畴)。
五、语义检索:基于 Embedding 的智能搜索
有了 Embedding 向量,实现语义检索就变得水到渠成。其基本流程分为两步:
- 离线索引:将文档库中所有文档(或句子、段落)的 Embedding 向量预先计算好,并存入专门的向量数据库(如
FAISS、Milvus、Pinecone)或索引结构中。 - 在线查询:当用户输入查询时,实时将查询文本编码为 Embedding 向量,然后在向量索引中快速查找与其距离最近的
Top-K个文档向量,最后返回对应的文档。
这个过程完全绕开了关键词匹配,直接基于语义相似性进行检索。即使用户的查询表述与文档原文完全不同(如用“怎么入门”匹配“入门指南”),只要语义一致,也能被有效召回。
六、优势、挑战与个人思考
语义检索的优势显而易见:召回率高、抗表述多样性强、支持多语言和跨模态检索(如果模型支持)。但它也面临挑战:计算成本高于倒排索引;对模型依赖性强,模型好坏直接影响效果;且有时会召回“语义相关但意图不符”的结果,需要结合关键词检索进行混合检索(Hybrid Search) 来优化。
关键提示:在实际工程中,纯向量检索往往不是最终方案。一个成熟的搜索系统通常是混合架构:先用关键词匹配保证相关性的下限(特别是精确匹配场景),再用向量检索拓展语义相关的候选集,最后用一个精排模型对所有候选结果进行综合打分和排序。理解这一点,才算真正理解了 Embedding 在工业级搜索中的定位。
总而言之,Embedding 向量是连接符号世界和语义世界的桥梁。它让机器能够“理解”语言,是实现智能搜索、推荐系统、问答系统等众多 AI 应用的基石。掌握其原理,是深入学习现代 NLP 和 AI 工程的重要一步。