RAG 混合检索:关键词 + 语义

📅 2026/7/31 16:05:47 👁️ 阅读次数 📝 编程学习
RAG 混合检索:关键词 + 语义

《AI 知识卡片》第 11 期 · 一条抓字面,一条抓意思,再算最终排名

前面一期讲过语义检索:搜“番茄”也能找到“西红柿”。但它有个短板——该精确的时候不精确。你搜一个准确的产品型号、一个函数名,要的是一字不差那一条,它却给你一堆“长得很像”的。

怎么补这个短板?——再给它加一条腿“关键词检索”。

关键词检索

在向量检索火起来之前,搜索主要靠的是关键词匹配——把文档看成一袋子词,你搜的词在文档里出现得越多、越罕见,就越算命中。这类方法里最经典、常用的算法叫BM25

算一个词有多重要,主要看三件事:

  • 这个词罕见吗(越罕见越有区分度,“的”“是”这种词基本不算分);
  • 在这篇文档里出现了多少次(出现越多越相关,但有个饱和上限,不是出现 100 次就比 10 次重要 10 倍);
  • 这篇文档有多长(长文档天然词多,要打个折,不然长文占便宜);

关键词检索有向量给不了的两个好处:结果可解释(命中了哪个词一目了然),以及精确匹配特别硬——型号、函数名、专有名词、错误码,它能一字不差地咬住。

关键词检索的缺点:它完全不懂意思。比如:“番茄”和“西红柿”对它来说是两个毫不相干的词条。

两种检索方式对比

把两者摊开对比,能看出它们几乎是互补的:

关键词检索(BM25)语义检索(Embedding)
比什么字面重合意思远近
强项精确匹配:型号、函数名、专有名词换个说法也能懂:同义、近义、口语
弱项不懂同义词(词汇鸿沟)该精确时不精确,容易给近似货
可解释性高(命中了哪个词)低(一串数字,说不清)
要训练吗不用要(得有个 Embedding 模型)

根据提问内容各取所长,这正是“混合检索”的意义:谁也不能保证每次都对,但两条腿一起走,摔倒的概率小得多。

两份结果怎么合成一份?

两种检索各自返回一个排好序的列表,现在得合成一份最终排名。听起来简单,但有个坎:

两边的分数没法直接相加。BM25 的得分可能是十几、几十(没有上限),语义相似度是 0 到 1 之间的小数。把 15.3 和 0.72 加在一起,得到的数字毫无意义——量纲根本不一样

有个很巧的办法绕开了它,叫RRF(Reciprocal Rank Fusion,倒数排名融合)。它的核心思路是:不看分数,只看排名

不管你原始分多少,我只看你在各自榜单里排第几。名次是两边统一、可比的。然后按这个公式给分、把各榜的分加起来

RRF(d)=∑i=1n1k+ri(d),k=60 RRF(d) = \sum_{i=1}^{n} \frac{1}{k + r_i(d)}, \quad k = 60RRF(d)=i=1nk+ri(d)1,k=60

公式解释:d是一条候选内容,r_i(d)是它在第i个榜单里的名次,n是榜单的个数。

名次越靠前,分越高(第 1 名 1/61 ≈ 0.0164,第 2 名 1/62 ≈ 0.0161),在多个榜单都上榜的,分数会累加。

来看一个实测数据。某个查询下,有一块内容同时被两种检索捞到了:

语义检索里排第 1 → 1 / (60 + 1) = 0.01639 关键词检索里排第 3 → 1 / (60 + 3) = 0.01587 累加 = 0.03226 ← 最终得分

而其它内容大多只在其中一种检索结果里出现,只能拿一份分(0.016 上下)。结果这块“两边都认可”的内容,以接近两倍的分数稳稳排到了第一。

这就是 RRF 的精髓:奖励共识——被多个检索共同认可、且名次靠前的内容,最值得信任。

至于那个k=60,它的作用是削峰。这里举个便于理解的例子:你问两个朋友,下午茶点哪家奶茶,各自给了一份榜单:

朋友甲的榜单:① 喜茶 ② 奈雪的茶 ③ 蜜雪冰城 朋友乙的榜单:① 霸王茶姬 ② 古茗 ③ 蜜雪冰城

两份榜单里,只有蜜雪冰城被两个人同时推荐,可它在两边都只排第 3,喜茶和霸王茶姬各自是某一个人的首选,但另一个人压根没提。谁该排最前面?这就取决于 k,我们来对比计算一下:

不加 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、加权融合的权重,都得拿自己的数据试出来。

也正因为融合之后排名仍然不够精细,工程上还会在后面加一道重排,把最贴题的那条真正顶到第一,后面会再单独开一期来讲。

一句话总结

关键词检索抓字面,语义检索抓意思,两种检索的盲区正好互补,这就是混合检索出现的意义。