一、从“数字指纹”理解 Embedding 向量

想象一下,我们想用计算机理解“苹果”这个词。最简单的方式是给它一个独热编码,比如一个很长的向量,只有“苹果”对应的位置是1,其他都是0。但这种方式无法表达“苹果”和“水果”、“红色”之间的关系。Embedding 向量 的诞生就是为了解决这个问题。

我们可以把 Embedding 理解为一种 “数字指纹” 或 “语义坐标”。它通过一个稠密的、低维的向量(比如一个有300个浮点数的列表)来表示一个词、一句话甚至一张图片。关键在于,这个向量不是随机生成的,而是通过模型在海量数据上训练得到的。训练的目标是让具有 相似语义 的内容,其向量在空间中的距离更近;反之,语义不同的内容,其向量距离更远。

提示:不要把Embedding想象成一个神秘的黑盒。它的核心作用就是将非结构化的数据(文本、图像)映射到一个可计算的向量空间,从而将语义问题转化为一个数学上的距离计算问题。

二、为什么我们需要语义检索?

传统的检索,比如数据库的 LIKE 搜索或搜索引擎的关键词匹配,主要依赖 字面匹配。如果用户搜索“快乐时光”,它可能无法找到包含“开心岁月”的文档,尽管二者意思相近。这种基于字面的检索方式在召回率和准确率上存在明显瓶颈。

语义检索 则完全不同。它首先将查询(Query)和所有文档都转化为 Embedding 向量,然后通过计算向量之间的 相似度(如余弦相似度)来返回最相关的结果。它的核心优势在于:

三、Embedding 是如何生成的?

生成高质量 Embedding 的核心是 预训练语言模型。当前主流的架构是 Transformer,像 BERT、RoBERTa、Sentence-BERT(SBERT)以及各种开源大语言模型(如 Llama、ChatGLM)都基于此。

这些模型的训练通常分为两步:

  1. 无监督预训练:在海量文本数据上,通过“完形填空”(MLM)或“预测下一个词”等任务,让模型学习基础的语法和世界知识。
  2. 有监督微调:为了得到适用于句子或段落级别语义的Embedding,通常需要在自然语言推理(NLI)或语义相似度任务的数据集上进行进一步微调,让模型学会区分句子间的语义关系。

最终,模型的某个中间层(通常是倒数第二层)的输出向量,就可以作为我们使用的 Embedding。选择哪个层、是否进行池化操作(将多个 token 的向量合并为一个句子向量)会影响最终向量的质量和用途。

四、构建语义检索系统的关键组件

一个完整的语义检索系统主要包括以下几个部分:

五、动手实践:用代码实现一个简单语义检索

下面我们使用 sentence-transformers 这个流行的库来快速体验。

from sentence_transformers import SentenceTransformer, util
import numpy as np

# 1. 加载预训练的 Embedding 模型
model = SentenceTransformer('all-MiniLM-L6-v2') # 一个轻量高效的多语言模型

# 2. 准备一些“文档”
corpus = [
    "机器学习是人工智能的一个子领域。",
    "深度学习使用多层神经网络进行复杂模式识别。",
    "今晚的月亮真圆啊。",
    "TensorFlow和PyTorch是主流的深度学习框架。",
    "我热爱编程和学习新知识。"
]

# 3. 将文档编码成向量
corpus_embeddings = model.encode(corpus, convert_to_tensor=True)

# 4. 用户查询
query = "什么是AI的技术?"
query_embedding = model.encode(query, convert_to_tensor=True)

# 5. 计算查询向量与所有文档向量的余弦相似度
cos_scores = util.cos_sim(query_embedding, corpus_embeddings)[0]

# 6. 找到相似度最高的Top 3结果
top_results = np.argpartition(-cos_scores, range(3))[:3]

print(f"查询: {query}")
print("最相关的文档:")
for idx in top_results:
    print(f"  相似度: {cos_scores[idx]:.4f} | 文档: {corpus[idx]}")

运行这段代码,你会看到查询“什么是AI的技术?”最匹配的文档是关于“机器学习”和“深度学习”的,而不是包含“AI”这个字母的句子,这完美体现了语义检索的威力。

提示:在实际生产环境中,你需要考虑模型的推理速度、向量数据库的性能以及如何将新文档实时添加到索引中。FAISS、Milvus、Weaviate 等是常用的向量数据库选择。