混合检索与 RRF
BM25 分数与向量相似度不在一个量纲上,没法直接加;归一化受分布影响,RRF 只看排名、不看分数,所以多数团队直接用它。RRF 不是免费午餐:它抹平了强弱信号, k 值与两路候选数仍要评测集调。
也叫:混合检索 · hybrid search · RRF · Reciprocal Rank Fusion · 分数融合
真正的难题:两路分数没法直接比出自 T2-5
新手最常见的做法是 最终分 = 0.5 × BM25分 + 0.5 × 余弦相似度——这是错的,也是面试第一层追问的埋伏点。
因为两者根本不在一个量纲上:余弦相似度有界(通常 0~1),BM25 分数无上界,8.7 和 23.5 都可能出现,且分布随语料、query 长度漂移。直接相加约等于「拿身高加体重排名」。由此分出两条技术路线:
路线一:归一化后加权(Weighted / Convex Combination)
先把两路分数各自归一化(min-max 或 z-score)拉到同一量纲,再 α × 向量分 + (1-α) × BM25分。优点是可精调、保留分数强度信息;缺点是 α 依赖评测集才能调,而且分数分布一漂移(换 embedding 模型、语料增长),辛苦调好的 α 就失效了。min-max 本身还怕离群值——一个异常高分会把其他分数全压扁。
路线二:RRF(Reciprocal Rank Fusion,倒数排名融合)
思路很妙:分数不可比,那就不看分数,只看名次。每路检索给出排名,文档的融合分 =
RRF(d) = Σ 每一路 1 / (k + rank_d) 其中 k 通常取 60
手算一遍就懂了(k=60):
文档 BM25名次 向量名次 RRF 分 A 1 3 1/61 + 1/63 ≈ 0.0323 ← 两路都靠前,稳赢 B 2 没进榜 1/62 ≈ 0.0161 C 没进榜 1 1/61 ≈ 0.0164 ← 单路第一略胜单路第二
k=60 是干嘛的? 它是个「缓冲值」,防止第 1 名对第 2 名形成碾压(没有 k 时 1/1 是 1/2 的两倍;加了 60 之后 1/61 和 1/62 几乎持平)。k 越小越「精英主义」(头部名次权重大),k 越大越「平均主义」。60 来自原始论文(Cormack et al., 2009)的经验值,各引擎默认都用它——没有评测集之前不要乱动。
RRF 的杀手锏是免调参 + 免疫量纲问题,对分数分布不做任何假设。这就是「为什么很多团队直接用 RRF」的标准答案。
整条链路长这样:
┌── BM25(关键词) ──► 排名列表 A ──┐ query ─────┤ ├──► RRF / 加权融合 ──► Top-K ──► Rerank(T2-6) ──► LLM └── 向量(语义) ──► 排名列表 B ──┘
以上节选自T2-5 混合检索:BM25 + 向量 + RRF,读全文能看到前后语境。
RRF 不是免费午餐(第三层追问在这)出自 T2-5
只看名次,意味着丢掉了分数强度信息:BM25 第 1 名比第 2 名高 10 倍置信度,和只高 0.1 分,在 RRF 眼里一模一样。后果是「单路超强信号被稀释」——型号类查询 BM25 一击命中,却被向量路的噪声结果拖后。
所以工程上的成熟答案是分层的:RRF 做默认起点(零成本解决 80% 问题)→ 有了评测集和稳定分数分布后,可回到加权融合精调 → 更进一步做 query 分类路由(识别出「型号/编号类」query 直接加重 BM25 权重甚至单走 BM25)。能把这条演进路线讲出来,面试就从「背概念」升级成「有工程判断」。
以上节选自T2-5 混合检索:BM25 + 向量 + RRF,读全文能看到前后语境。