跳到主要内容

K3.1 关键词检索:别急着看不起老将

老将也有它的主场​

K1 把关键词检索批判了一番——换个说法就抓瞎,一词多义分不清。这些都对,但要是就此把它一棍子打死,你会栽跟头。

因为在精确匹配的战场上,关键词检索比语义检索更靠谱。

你在电商搜「iPhone 15 Pro Max」,要的就是这个精确型号,而不是「和它意思相近」的一堆手机。你在法律库搜「第十九条」,要的就是这一条,不是「意思差不多」的第十八条。关键词检索——按字面匹配,查询词一个不差地出现在文档里才算命中——恰恰是这类场景的主力。

它的主场清单,全是「一字不差才对」的东西:

  • 产品型号、SKU、订单号(「X9-2000」不是「X9-3000」);
  • 专有名词、人名、缩写(「BM25」「RRF」「GDPR」);
  • 法条编号、合同条款号;
  • 代码里的函数名、变量名、报错信息;
  • 罕见术语——越罕见,字面命中越说明问题。

这些场景里,语义检索追求的「意思相近」反而成了缺点:它会把精确的东西模糊掉。

BM25:几十年不倒的老将​

关键词检索最经典的算法叫 BM25,是搜索引擎用了几十年、至今不倒的主力。它怎么给文档打分?两句话就能讲清直觉:

  • 一个查询词,在这篇文档里出现得越多,这篇文档越可能相关(词频高 → 加分);
  • 但这个词如果在整个知识库里到处都是(比如「的」「和」「公司」),它就不值钱(太普通 → 降权)。

合起来就是:罕见词命中 = 强信号,常见词命中 = 弱信号。你搜「陪产假 天数」,「陪产假」是个罕见词,哪篇文档里出现它,哪篇就八成相关;而「天数」到处都有,权重就低。BM25 把这两个直觉揉成一个分数——数学细节在深入层,但直觉就这么简单。

它还有个语义检索比不了的优点:快、省、可解释。一个叫「倒排索引」的结构,能让它在毫秒内扫过上亿篇文档(深入层细讲),而且它为什么命中一目了然——就是这几个词对上了。

为什么语义检索会漏掉精确词​

回到 K1 的语义检索:它把每段话压成一个向量。问题就出在这个「压」上——嵌入模型把「X9-2000」和「X9-3000」编码成了几乎相同的向量。在「意思」上它俩确实像(都是 X9 系列的某个型号),但你要的偏偏是精确那一个。语义检索的「模糊」在这里成了致命伤。

所以关键词和语义不是谁淘汰谁,而是各有各的主场。上手感受一下这个「各有主场」:

🎮 动手实验
三路检索擂台:关键词 vs 向量 vs 混合
同一个查询,三条检索通道并排跑。绿框 = 这条查询「真正该命中」的资料。看哪一路捞得全、哪一路会漏。(基于中篇共享知识库,命中为真实计算)
🧑‍💻 东西收到不满意,想退掉(该命中:退货政策、换货流程)
💡 要点:没有一路检索是全能的。关键词擅长精确匹配(型号、专名、术语),但换个说法就抓瞎;语义擅长「懂意思」,却对精确词不敏感、还会被强势话题带偏。所以生产 RAG 几乎都用混合检索:两路一起上、各补盲区,再用 RRF 把两个排名融合(RRF 只看名次、不看分数,绕开了「两路分数没法直接比」的难题)。混合不是更花哨,是更少漏。

实验一:语义的主场(复习 K1)。 默认查询「东西收到不满意,想退掉」——点「三路开跑」,看关键词那一列几乎全是 0 分:用户换了说法(「退掉」不是「退货」),一个词都对不上,它只能瞎排。而语义检索稳稳命中退货政策。这是语义的主场。

实验二:关键词的主场。 选查询「X9 Pro 屏幕和电池参数」——「X9 Pro」是精确型号,关键词检索一击命中(型号、专名正是它的强项),语义也没跑偏。两路一致,结果最稳。

一正一反,你就看清了:没有谁能一统天下。

BM25 也不是万能

它有个和语义检索正好相反的短板:完全不懂意思。「番茄」和「西红柿」在 BM25 眼里是两个毫不相干的词;用户口语化的提问、错别字、同义变体,它统统抓瞎(这正是 K1 讲的「同义不同字」死穴)。所以现实里,很少有人单用关键词,也很少单用语义——把两者拼起来的「混合检索」才是答案,也就是下一节。

小结​

本节要点
  • 关键词检索的主场是精确匹配:型号、编号、专名、代码符号、罕见术语——要的是一字不差。
  • BM25 的打分直觉两句话:查询词在文档里出现得多 → 加分;这个词在全库里太普通 → 降权。
  • 语义检索会漏掉精确词:嵌入把「X9-2000」和「X9-3000」压成了相近的向量。
  • 但 BM25 完全不懂同义词和语义——所以现实中很少单用,两路结合才是答案(下一节)。
📝 动手自测0/3
1. 下面哪种查询,关键词检索(BM25)反而比语义检索更靠谱?
2. BM25 给文档打分的核心直觉是?
3. 为什么语义检索容易漏掉「X9-2000」这种精确型号?

延伸阅读​