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

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

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

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

关键词检索

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

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

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

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

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

两种检索方式对比

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

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

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

两份结果怎么合成一份?

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

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

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

  不管你原始分多少,我只看你在各自榜单里排第几 。名次是两边统一、可比的。然后按这个公式给分、把各榜的分加起来
RRF(d)= ∑i=1n 1 k+ri(d) ,k=60RRF(d) = \sum_{i=1}^{n} \frac{1}{k + r_i(d)}, \quad k = 60 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、加权融合的权重,都得拿自己的数据试出来。

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

一句话总结

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

相关推荐
Black蜡笔小新1 小时前
EasyAIS+国标GB28181视频监控平台EasyCVR强强联动,全域视频AI识别能力落地!
大数据·人工智能·音视频
Microvision维视智造1 小时前
智能工厂等级自检表:梯度培育,你的工厂在第几级?
人工智能·计算机视觉·视觉检测·机器视觉
用户3126874877201 小时前
AI Agent 开发实战(八):输出 Schema 约束与结构化输出
langchain·ai编程
时光不负努力1 小时前
skill 定义 + 多个skill 协作
人工智能·openai
Python私教2 小时前
Codex 写出的代码能跑却算错钱:我用 3 个测试拆穿一次 AI 编程幻觉
python·单元测试·ai编程
武子康2 小时前
MCP 2026-07-28 无状态核心之后:身份、任务、幂等与审计状态到底放在哪里?
人工智能·llm·mcp
瓦学妹2 小时前
X(Twitter)新号如何防封?2026 养号与防限流全攻略
大数据·网络·人工智能·新媒体运营·twitter
Python私教2 小时前
我只写了一个 add 工具,终于把 MCP 的 Host、Client、Server 跑明白了
python·ai编程·mcp
菜小麒2 小时前
后端/Agent后端面经-后续
agent·后台