一、什么是 Embedding 向量?

想象一下,你想让电脑理解“苹果”这个词。对于电脑,它只是一个字符串。但人类知道,“苹果”可以是一种水果,也可能是一家科技公司。Embedding 向量 就是将这种人类可感知的、复杂的语义信息,转换成机器可以高效计算和比较的稠密数字向量的技术。它本质上是一个数学映射,将单词、句子、图片甚至整个文档,映射到一个高维的向量空间中。

在向量空间里,一个点就代表一个“概念”。它的神奇之处在于,语义相似的对象,其对应的向量在空间中的位置也相近。例如,“国王”和“王后”的向量距离,会比“国王”和“汽车”的向量距离近得多。这种表示方式,远比传统的离散编码(如One-Hot编码)更能捕捉事物之间的内在关联。

提示: Embedding 有时也被称为“词嵌入”(词级)或“向量表示”。你可以把它理解为每个词/句的“数字DNA”,这个DNA包含了它的核心语义。

二、为什么需要它?从关键词检索到语义检索

传统的搜索引擎或数据库检索,主要依赖关键词匹配(Bag-of-Words)。它简单高效,但存在根本性缺陷:它无法理解“意思”。比如,用户搜索“笔记本电脑保养方法”,就很可能错过标题为“如何维护你的个人电脑”的文档,尽管它们讨论的是同一回事。

语义检索则尝试直接理解查询和文档的“意思”。通过将查询和文档库中的所有内容都转换为Embedding向量,我们可以在向量空间中直接计算它们的语义相似度。这带来了革命性的优势:

三、Embedding 向量是如何生成的?

早期的经典方法是 Word2Vec,它通过分析海量文本中词语的上下文共现关系来学习词向量。例如,它发现“国王”和“王后”经常出现在相似的上下文中(如“登基”、“统治”),因此赋予它们相近的向量。其核心思想是“一个词的含义由其周围的词定义”(分布式假设)。

现代更强大的模型,如基于Transformer架构的 BERT 及其变体(Sentence-BERT, E5, GTE等),能够生成上下文相关的Embedding。同一个词“苹果”在“吃苹果”和“苹果手机”这两个句子中,会生成不同的向量。这解决了多义词的问题。这些模型通常通过预训练在大规模语料上学习语言通用表示,再通过微调适配到具体的下游任务(如语义检索)。

四、语义检索的核心流程

一个典型的语义检索系统工作流程如下:

  1. 离线索引:将文档库中每篇文档(或切分后的段落)通过Embedding模型转换为向量,并存入向量数据库
  2. 在线查询:当用户输入查询时,用同一个Embedding模型将查询转换为向量。
  3. 相似度计算:在向量数据库中,快速找到与查询向量最相似(如余弦相似度最高)的Top-K个文档向量。
  4. 结果返回:将Top-K向量对应的原始文档返回给用户。
提示: 文档太长直接生成Embedding效果可能不佳,通常需要先将其切分成较小的语义单元(如段落或句子)。

五、动手实践:用Python体验语义检索

下面我们使用流行的 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)

# 4. 计算第一个句子与其它所有句子的相似度
query_embedding = embeddings[0]
cosine_scores = util.cos_sim(query_embedding, embeddings[1:])[0]

# 5. 打印相似度结果
for i, score in enumerate(cosine_scores):
    print(f"'{sentences[0]}' 与 '{sentences[i+1]}' 的相似度: {score:.4f}")

运行这段代码,你会发现“如何保养笔记本电脑?”与“怎样维护个人电脑?”以及“笔记本电脑的维护技巧”的相似度分数会非常高,而与“今天天气真好”的分数则非常低。这直观展示了Embedding向量捕捉语义的能力。

六、关键总结与注意事项

理解Embedding与语义检索,要抓住几个核心要点:

在实际应用中,需注意: