)
RRF 是多路检索结果的排序融合算法用来合并多个独立检索列表比如向量检索 BM25 关键词检索只靠「排名位置」计算分数不依赖各路原始分数解决向量相似度和 BM25 分值不在同一量纲、无法直接相加的痛点。对比BM25 分数可以几十、向量相似度 0~1两者数值完全不能直接相加RRF只关心文档在每个检索结果里排第几名。公式(RRF(d) \sum_{r \in R} \frac{1}{k rank_r(d)})- d文档R各路检索结果集合向量结果、BM25 结果(rank_r(d))文档d在检索通路r里的排名从 1 开始第一名 rank1k平滑常数一般固定取60行业默认也可 10~100 微调简单例子假设 k60文档 A向量第 1 名BM25 没召回(RRF 1/(601) ≈ 0.0164)文档 B向量第 2 名BM25 第 1 名(RRF 1/(602)1/(601) ≈ 0.01610.0164 \boldsymbol{0.0325})同时在两路都命中的文档RRF 分数更高会排在更前面正是混合检索想要的效果。核心特点✅优点不需要归一化各路分数向量、BM25、关键词、ES 检索不管分值范围差异多大直接融合。偏向多路同时命中的文档同时被向量和 BM25 召回的 chunk排名会被抬高。实现简单鲁棒性强是 RAG 混合检索最主流方案。不会被某一路极端高分带偏。❌缺点只看排名不看分数差距向量第 1 名和向量第 2 名哪怕相似度差距巨大只按位次算分。没有语义强弱信息只关心 “排第几”。调参只有k调参空间有限。k 的作用k 越大排名靠后的文档对总分贡献越小k 越小靠后的文档权重更高。RAG 场景普遍固定 k60。和你当前代码对应fusedreciprocal_rank_fusion([vector_results,keyword_results])输入两个列表向量检索结果、BM25 检索结果。你的reciprocal_rank_fusion函数内部遍历两路列表获取每个 chunk 的 rank累加 (1/(60rank))得到rrf_score写入字典按 rrf_score 降序排序输出 fused对比其他融合方案直接加权求和需要对 BM25、向量分数做归一化调参麻烦分值分布容易漂移。RRF仅用排名工程最简单RAG 首选。Reciprocal Rank 分数加权RRF 基础上叠加原始相似度更精细但复杂度上升。你的业务场景小提示你现在RRF 只负责重排⚠️ 不要拿 rrf_score 做相关性阈值过滤RRF 分数区间很小一般 0.01~0.05不能直接用min_score0.25过滤。推荐策略向量、BM25 各自先做基础分数过滤筛掉完全不相关文档再把两路剩下的候选送入 RRF 做排序融合RRF 输出的结果直接取 topN 作为 evidence不再拿 rrf_score 做阈值截断