K3.1 关键词检索:别急着看不起老将
老将也有它的主场
K1 把关键词检索批判了一番——换个说法就抓瞎,一词多义分不清。这些都对,但要是就此把它一棍子打死,你会栽跟头。
因为在精确匹配的战场上,关键词检索比语义检索更靠谱。
你在电商搜「iPhone 15 Pro Max」,要的就是这个精确型号,而不是「和它意思相近」的一堆手机。你在法律库搜「第十九条」,要的就是这一条,不是「意思差不多」的第十八条。关键词检索——按字面匹配,查询词一个不差地出现在文档里才算命中——恰恰是这类场景的主力。
它的主场清单,全是「一字不差才对」的东西:
- 产品型号、SKU、订单号(「X9-2000」不是「X9-3000」);
- 专有名词、人名、缩写(「BM25」「RRF」「GDPR」);
- 法条编号、合同条款号;
- 代码里的函数名、变量名、报错信息;
- 罕见术语——越罕见,字面命中越说明问题。
这些场景里,语义检索追求的「意思相近」反而成了缺点:它会把精确的东西模糊掉。
BM25:几十年不倒的老将
关键词检索最经典的算法叫 BM25,是搜索引擎用了几十年、至今不倒的主力。它怎么给文档打分?两句话就能讲清直觉:
- 一个查询词,在这篇文档里出现得越多,这篇文档越可能相关(词频高 → 加分);
- 但这个词如果在整个知识库里到处都是(比如「的」「和」「公司」),它就不值钱(太普通 → 降权)。
合起来就是:罕见词命中 = 强信号,常见词命中 = 弱信号。你搜「陪产假 天数」,「陪产假」是个罕见词 ,哪篇文档里出现它,哪篇就八成相关;而「天数」到处都有,权重就低。BM25 把这两个直觉揉成一个分数——数学细节在深入层,但直觉就这么简单。
它还有个语义检索比不了的优点:快、省、可解释。一个叫「倒排索引」的结构,能让它在毫秒内扫过上亿篇文档(深入层细讲),而且它为什么命中一目了然——就是这几个词对上了。
为什么语义检索会漏掉精确词
回到 K1 的语义检索:它把每段话压成一个向量。问题就出在这个「压」上——嵌入模型把「X9-2000」和「X9-3000」编码成了几乎相同的向量。在「意思」上它俩确实像(都是 X9 系列的某个型号),但你要的偏偏是精确那一个。语义检索的「模糊」在这里成了致命伤。
所以关键词和语义不是谁淘汰谁,而是各有各的主场。上手感受一下这个「各有主场」:
实验一:语义的主场(复习 K1)。 默认查询「东西收到不满意,想退掉」——点「三路开跑」,看关键词那一列几乎全是 0 分:用户换了说法(「退掉」不是「退货」),一个词都对不上,它只能瞎排。而语义检索稳稳命中退货政策。这是语义的主场。
实验二:关键词的主场。 选查询「X9 Pro 屏幕和电池参数」——「X9 Pro」是精确型号,关键词检索一击命中(型号、专名正是它的强项),语义也没跑偏。两路一致,结果最稳。
一正一反,你就看清了:没有谁能一统天下。
它有个和语义检索正好相反的短板:完全不懂意思。「番茄」和「西红柿」在 BM25 眼里是两个毫不相干的词;用户口语化的提问、错别字、同义变体,它统统抓瞎(这正是 K1 讲的「同义不同字」死穴)。所以现实里,很少有人单用关键词,也很少单用语义——把两者拼起来的「混合检索」才是答案,也就是下一节。
小结
- 关键词检索的主场是精确匹配:型号、编号、专名、代码符号、罕见术语——要的是一字不差。
- BM25 的打分直觉两句话:查询词在文档里出现得多 → 加分;这个词在全库里太普通 → 降权。
- 语义检索会漏掉精确词:嵌入把「X9-2000」和「X9-3000」压成了相近的向量。
- 但 BM25 完全不懂同义词和语义——所以现实中很少单用,两路结合才是答案(下一节)。
延伸阅读
- BM25 是什么(Elastic 官方科普)——把公式每一项讲得很直观。
- 上篇 1.4 词向量——语义检索的稠密向量从哪来,对照理解稀疏 vs 稠密。
- 下一节 K3.2 混合检索与 RRF:既然各有主场,就两个一起用。