| 为什么混合 | 语义召回 + 字面精确匹配互补,专有名词场景明显更稳 |
|---|---|
| RRF | score = Σ 1/(k + rank),k 常取 60 |
| 输入 | 各路子结果列表(有序) |
| 输出 | 融合后的统一排序,可再送重排 |
RRF 融合实现(Python)
RRF 融合实现(Python)
def rrf(rank_lists, k=60):
score = {}
for lst in rank_lists: # 每个列表:按相关性降序的 id 列表
for rank, doc_id in enumerate(lst, start=1):
score[doc_id] = score.get(doc_id, 0.0) + 1.0 / (k + rank)
return sorted(score, key=score.get, reverse=True)
fused = rrf([dense_top50, bm25_top50])[:20]RRF 不需要分数归一化,工程上比加权求和省事;若两路都有可靠分数,也可评测对比加权方案。