RRF 融合是怎么工作的
RRF(倒数排名融合)是一种多路召回结果融合方法,核心是抛弃原始分数,仅依赖每路结果的排名。通过公式 `score(d) = Σ 1/(k + rank_i(d))`(k默认60),将不同量纲的分数(如cosine、BM25、概率等)统一为排名倒数累加,消除量纲差异和超参调优问题。其有效性在于:无量纲、无超参、强化多路共识文档、自然降级。k=60控制头部与尾部差距,使排名差异温和但可区分。工作流程中,四路召回独立排序后,RRF融合得到最终分数,截断Top-20返回。设计哲学强调排名优于分数、多路投票、理论经验结合、可降级,成为现代搜索系统融合多路召回的事实标准。
一、为什么需要融合
搜索流水线有多个召回通道,各自产生不同量纲的分数:
| 通道 | 分数范围 | 排序依据 |
|---|---|---|
| 语义检索(cosine) | [-1, 1] | 向量相似度 |
| 关键词检索(BM25-like) | [0, +∞) | 词频/位置加权 |
| Cross-Encoder Rerank | [0, 1] | 概率 |
| 图谱检索 | [0, 1] | 结构化得分 |
问题:cosine 的 0.7 和关键词的 0.7 含义完全不同,直接加权融合需要归一化 + 调权重 α,超参敏感且难以调优。
二、RRF 的核心思想
RRF(Reciprocal Rank Fusion,倒数排名融合) 抛弃原始分数,只看每路的排名。
公式:
score(d) = Σ 1 / (k + rank_i(d))
通道 i
rank_i(d)— 文档 d 在第 i 路结果中的排名(从 1 开始)k— 平滑常数,默认 60(来自原论文 Cormack et al., 2009)- 对每路取倒数累加,得到融合分
三、为什么这样做有效
1. 无量纲
不看绝对分数,只看排名位置。cosine 和关键词分的量纲差异问题彻底消失。
2. 无超参(几乎)
唯一参数 k=60 有理论支持,几乎所有实践都用这个值,不需要像加权融合那样反复调 α。
3. 顶级共识被强化
如果一篇文章在语义、关键词、rerank 三路都排第 1:
- 单路贡献:
1/(60+1) ≈ 0.0164 - 三路累加:
0.0492
如果只在一路排第 1,其他路未上榜:
- 总分仅
0.0164
多路共识的文档自然浮到顶部,这正是高质量结果的标志。
4. 自然降级
某一路为空(比如 query 没有关键词命中)时,该路不参与累加,不需要写特殊分支。RRF 自动适应该文档在更少通道中的表现。
四、k=60 的含义
k 的作用是控制头部与尾部的差距:
- k 越小:第 1 名和第 10 名的分差越大,头部被强烈突出
- k 越大:排名间的分差被压缩,结果更"民主"
k=60 是论文经验值,让 rank=1 和 rank=2 的贡献差约为 1/61 vs 1/62,差距温和但足以区分。
五、本项目中的工作流程
查询 → 4 路召回(每路独立排序)
├── 语义 Top-K → rankSemantic
├── 关键词命中 → rankKeyword
├── Cross-Encoder → rankRerank(可选)
└── 图谱扩展 → rankGraph(可选)
↓
RRF 融合:score = Σ 1/(60 + rank)
↓
按 finalScore 倒序,截断 Top-20 返回
关键点:
- 每路先各自排序得到 rank
- 文档只需在任一路上榜即可成为候选
- 融合后只看累加分数,不需要再调权重
六、设计哲学
- 排名 > 分数 — 用户只关心谁排前面,不关心绝对分差
- 多路投票 — 把每路视为一个"投票者",共识文档胜出
- 理论经验并用 — k=60 来自论文,不是拍脑袋
- 可降级 — 任一路缺席不影响整体运行,自然适应
这也是为什么 RRF 成为现代搜索系统(Elasticsearch、Vespa、各种 RAG 框架)融合多路召回的事实标准。