Skip to content

5.1.3 为什么 Embedding 能支持语义检索? ​

先给结论:因为 Embedding 试图把文本映射到一个可比较的向量空间里,让语义接近的内容在空间里也尽量接近。这样系统就能通过相似度比较,找回字面不同但含义相关的内容。

这就是语义检索最核心的基础。

它和关键词检索最大的区别是什么 ​

如果是关键词检索,系统更像在问:

  • 这些词有没有出现
  • 这些词出现了几次
  • 这些词是不是精确命中

而 Embedding 支持的语义检索更像在问:

  • 这段内容和当前问题在意义上是否接近

这也是为什么,下面两句话即使字面不同,也可能被判定为相关:

  • “如何取消自动续费?”
  • “怎么关闭会员自动扣款?”

关键词层面它们并不完全一样,但语义上可能很接近。

为什么向量空间能帮助比较语义 ​

这里可以先用一个足够粗但实用的理解:

  • 每段文本经过 embedding 后,会变成一个向量点
  • 语义相近的点,通常更靠近
  • 语义不相关的点,通常更远

后面检索时,系统会:

  1. 把用户问题也转成向量
  2. 计算它和知识库向量之间的相似度
  3. 找出更接近的那些对象

一个最小示意可以写成这样:

python
query = "怎么关闭自动续费?"
query_vector = embed(query)

docs = [
    "如何取消会员自动扣款?",
    "定制类商品不支持无理由退货。",
    "收货地址修改后多久生效?"
]

doc_vectors = [embed(doc) for doc in docs]
scores = [cosine_similarity(query_vector, v) for v in doc_vectors]

这里真正关键的是:

  • 第一条文本虽然不完全同词,但可能得到更高相似度
  • 后两条主题不同,通常应该得分更低

为什么它能找“近义表达” ​

因为 embedding 模型训练时,目标之一就是让模型学到:

  • 不同表述之间的语义关联
  • 常见近义说法的接近关系
  • 句子、短语、问题之间的主题相似性

这并不意味着模型“完全理解了世界”,但通常足够支持检索任务里的第一步召回。

也就是说,它不要求两段文字长得像,而更在意:

  • 它们是不是在说接近的事情

为什么它又不是万能的 ​

这里也要把边界说清楚。

Embedding 能支持语义检索,不代表它天然适合所有类型的问题。

它常见的局限包括:

  • 精确编号、型号、术语不一定稳
  • 非常短的字符串有时语义信号不足
  • 多义词和上下文不足时可能误召回
  • 业务边界、权限边界不是靠语义相似就能判断

所以它很适合做“语义上先找一批候选”,但往往还需要:

  • metadata 过滤
  • BM25 或关键词补充
  • 重排或后处理

一个更实际的理解方式 ​

你可以把语义检索理解成:

  • 先不要求检索器精确判断“最终答案是谁”
  • 先要求它尽量把“有可能相关的内容”拉进候选集

在这个目标下,Embedding 很有价值,因为它比纯关键词更能覆盖表达差异。

但它也因此更像:

  • 一个强大的语义召回器

而不是:

  • 最终判决器

一个常见误区 ​

很多人会觉得:

  • 既然是语义检索,那只要 embedding 模型足够强,就能完全替代其他检索方式

这通常不成立。

因为真实检索里经常同时需要:

  • 找近义表达
  • 找精确术语
  • 找当前有效版本
  • 找有权限的数据

只有第一项主要是 embedding 的强项,其他几项还需要别的机制配合。

一句话总结 ​

Embedding 能支持语义检索,是因为它把文本映射到一个可比较的向量空间里,让语义接近的内容在空间里也更接近。这样系统就能通过相似度比较,找回字面不同但意思相关的候选内容。但语义相近不等于业务正确,所以它通常只是检索链路的一层。