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

📅 发布时间:2026/7/31 15:57:56
RAG 混合检索:关键词 + 语义
《AI 知识卡片》第 11 期 · 一条抓字面一条抓意思再算最终排名前面一期讲过语义检索搜“番茄”也能找到“西红柿”。但它有个短板——该精确的时候不精确。你搜一个准确的产品型号、一个函数名要的是一字不差那一条它却给你一堆“长得很像”的。怎么补这个短板——再给它加一条腿“关键词检索”。关键词检索在向量检索火起来之前搜索主要靠的是关键词匹配——把文档看成一袋子词你搜的词在文档里出现得越多、越罕见就越算命中。这类方法里最经典、常用的算法叫BM25。算一个词有多重要主要看三件事这个词罕见吗越罕见越有区分度“的”“是”这种词基本不算分在这篇文档里出现了多少次出现越多越相关但有个饱和上限不是出现 100 次就比 10 次重要 10 倍这篇文档有多长长文档天然词多要打个折不然长文占便宜关键词检索有向量给不了的两个好处结果可解释命中了哪个词一目了然以及精确匹配特别硬——型号、函数名、专有名词、错误码它能一字不差地咬住。关键词检索的缺点它完全不懂意思。比如“番茄”和“西红柿”对它来说是两个毫不相干的词条。两种检索方式对比把两者摊开对比能看出它们几乎是互补的关键词检索BM25语义检索Embedding比什么字面重合意思远近强项精确匹配型号、函数名、专有名词换个说法也能懂同义、近义、口语弱项不懂同义词词汇鸿沟该精确时不精确容易给近似货可解释性高命中了哪个词低一串数字说不清要训练吗不用要得有个 Embedding 模型根据提问内容各取所长这正是“混合检索”的意义谁也不能保证每次都对但两条腿一起走摔倒的概率小得多。两份结果怎么合成一份两种检索各自返回一个排好序的列表现在得合成一份最终排名。听起来简单但有个坎两边的分数没法直接相加。BM25 的得分可能是十几、几十没有上限语义相似度是 0 到 1 之间的小数。把 15.3 和 0.72 加在一起得到的数字毫无意义——量纲根本不一样。有个很巧的办法绕开了它叫RRFReciprocal Rank Fusion倒数排名融合。它的核心思路是不看分数只看排名。不管你原始分多少我只看你在各自榜单里排第几。名次是两边统一、可比的。然后按这个公式给分、把各榜的分加起来RRF(d)∑i1n1kri(d),k60 RRF(d) \sum_{i1}^{n} \frac{1}{k r_i(d)}, \quad k 60RRF(d)i1∑n​kri​(d)1​,k60公式解释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 的精髓奖励共识——被多个检索共同认可、且名次靠前的内容最值得信任。至于那个k60它的作用是削峰。这里举个便于理解的例子你问两个朋友下午茶点哪家奶茶各自给了一份榜单朋友甲的榜单① 喜茶 ② 奈雪的茶 ③ 蜜雪冰城 朋友乙的榜单① 霸王茶姬 ② 古茗 ③ 蜜雪冰城两份榜单里只有蜜雪冰城被两个人同时推荐可它在两边都只排第 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、加权融合的权重都得拿自己的数据试出来。也正因为融合之后排名仍然不够精细工程上还会在后面加一道重排把最贴题的那条真正顶到第一后面会再单独开一期来讲。一句话总结关键词检索抓字面语义检索抓意思两种检索的盲区正好互补这就是混合检索出现的意义。