《AI 知识卡片》第 11 期 · 一条抓字面,一条抓意思,再算最终排名
前面一期讲过语义检索:搜"番茄"也能找到"西红柿"。但它有个短板------该精确的时候不精确。你搜一个准确的产品型号、一个函数名,要的是一字不差那一条,它却给你一堆"长得很像"的。
怎么补这个短板?------再给它加一条腿"关键词检索"。
关键词检索
在向量检索火起来之前,搜索主要靠的是关键词匹配 ------把文档看成一袋子词,你搜的词在文档里出现得越多、越罕见,就越算命中。这类方法里最经典、常用的算法叫 BM25。
算一个词有多重要,主要看三件事:
- 这个词罕见吗(越罕见越有区分度,"的""是"这种词基本不算分);
- 在这篇文档里出现了多少次(出现越多越相关,但有个饱和上限,不是出现 100 次就比 10 次重要 10 倍);
- 这篇文档有多长(长文档天然词多,要打个折,不然长文占便宜);
关键词检索有向量给不了的两个好处:结果可解释 (命中了哪个词一目了然),以及精确匹配特别硬------型号、函数名、专有名词、错误码,它能一字不差地咬住。
关键词检索的缺点:它完全不懂意思。比如:"番茄"和"西红柿"对它来说是两个毫不相干的词条。
两种检索方式对比
把两者摊开对比,能看出它们几乎是互补的:
| 关键词检索(BM25) | 语义检索(Embedding) | |
|---|---|---|
| 比什么 | 字面重合 | 意思远近 |
| 强项 | 精确匹配:型号、函数名、专有名词 | 换个说法也能懂:同义、近义、口语 |
| 弱项 | 不懂同义词(词汇鸿沟) | 该精确时不精确,容易给近似货 |
| 可解释性 | 高(命中了哪个词) | 低(一串数字,说不清) |
| 要训练吗 | 不用 | 要(得有个 Embedding 模型) |
根据提问内容各取所长,这正是"混合检索"的意义:谁也不能保证每次都对,但两条腿一起走,摔倒的概率小得多。

两份结果怎么合成一份?
两种检索各自返回一个排好序的列表,现在得合成一份最终排名。听起来简单,但有个坎:
两边的分数没法直接相加。 BM25 的得分可能是十几、几十(没有上限),语义相似度是 0 到 1 之间的小数。把 15.3 和 0.72 加在一起,得到的数字毫无意义------量纲根本不一样。
有个很巧的办法绕开了它,叫 RRF(Reciprocal Rank Fusion,倒数排名融合) 。它的核心思路是:不看分数,只看排名。
不管你原始分多少,我只看你在各自榜单里排第几 。名次是两边统一、可比的。然后按这个公式给分、把各榜的分加起来:
RRF(d)=i=1∑nk+ri(d)1,k=60
公式解释:d 是一条候选内容,r_i(d) 是它在第 i 个榜单里的名次,n 是榜单的个数。
名次越靠前,分越高(第 1 名 1/61 ≈ 0.0164,第 2 名 1/62 ≈ 0.0161),在多个榜单 都上榜的,分数会累加。
来看一个实测数据。某个查询下,有一块内容同时被两种检索捞到了:
plain
语义检索里排第 1 → 1 / (60 + 1) = 0.01639
关键词检索里排第 3 → 1 / (60 + 3) = 0.01587
累加 = 0.03226 ← 最终得分
而其它内容大多只在其中一种检索结果里出现,只能拿一份分(0.016 上下)。结果这块"两边都认可"的内容,以接近两倍的分数稳稳排到了第一。
这就是 RRF 的精髓:奖励共识------被多个检索共同认可、且名次靠前的内容,最值得信任。
至于那个 k=60,它的作用是削峰。这里举个便于理解的例子:你问两个朋友,下午茶点哪家奶茶,各自给了一份榜单:
plain
朋友甲的榜单:① 喜茶 ② 奈雪的茶 ③ 蜜雪冰城
朋友乙的榜单:① 霸王茶姬 ② 古茗 ③ 蜜雪冰城
两份榜单里,只有蜜雪冰城被两个人同时推荐,可它在两边都只排第 3,喜茶和霸王茶姬各自是某一个人的首选,但另一个人压根没提。谁该排最前面?这就取决于 k,我们来对比计算一下:
plain
不加 k(得分 = 1/名次):
喜茶 = 1/1 = 1.0
蜜雪冰城 = 1/3 + 1/3 = 0.67 ← 一个人的头名,压过了两个人的共识
k = 60:
喜茶 = 1/61 = 0.0164
蜜雪冰城 = 1/63 + 1/63 = 0.0317 ← 共识胜出,接近两倍
同一份榜单,只换了个 k,最终的排名就不一样了。原因在于 1/名次 这条曲线太陡------第 1 名的分是第 3 名的三倍;加上 60 之后曲线被拍平,第 1 名和第 3 名只差 3% 左右。名次的权重被压小,"上榜次数"的权重被放大。

所以这个旋钮的方向很清楚:k 越小,单榜头名越霸道;k 越大,越接近"只数上榜次数"。这里 60 是最常见的默认值。
混合检索并非十全十美
瑕疵 1:不保证每次都更好 。如果是纯语义型的查询,单用语义检索,前五名干干净净;混合之后,关键词那路带进来的两条无关内容反而稀释了纯度。混合的价值是平均更稳、覆盖更全。
瑕疵 2:成本翻倍。两套索引都要建、都要维护、都要查。
瑕疵 3:参数要调。RRF 的 k、加权融合的权重,都得拿自己的数据试出来。
也正因为融合之后排名仍然不够精细,工程上还会在后面加一道重排,把最贴题的那条真正顶到第一,后面会再单独开一期来讲。
一句话总结
关键词检索抓字面,语义检索抓意思,两种检索的盲区正好互补,这就是混合检索出现的意义。