Skip to content
🔗 分享本题
查看我的学习进度 →
RAG-Fusion 多查询融合与 RRF 图解

🧠 图解记忆: 一问多写、多路召回、RRF 融合再去重;它扩展查询视角,但会增加调用和检索成本。

💡 答案要点

传统 RAG 的问题:

  1. 语义孤岛:用户查询和文档的语义可能存在偏差
  2. 召回单一:仅靠向量相似度,可能遗漏相关内容
  3. 缺乏全局理解:无法回答需要多文档汇总的问题

RAG-Fusion 解决方案:

用户查询: "2026年Q1季度营收增长原因"

Step 1: Query Rewriting(查询改写)
→ 生成多个相关查询:
  - "2026年Q1营收数据"
  - "营收增长驱动因素"
  - "季度财务分析"

Step 2: Multi-Query Retrieval(多查询检索)
→ 对每个查询独立检索 Top-K 文档

Step 3: Reciprocal Rank Fusion (RRF)
→ RRF = Σ(1/(k+rank_i)),融合多查询结果
→ 最终排序:综合多查询视角的结果

Step 4: 输出
→ 生成综合多文档的答案

RRF 公式:

python
def reciprocal_rank_fusion(results_list, k=60):
    """k is a constant, typically 60"""
    fused_scores = {}
    for results in results_list:
        for rank, doc in enumerate(results):
            doc_id = doc['id']
            fused_scores[doc_id] = fused_scores.get(doc_id, 0) + 1 / (k + rank + 1)
    return sorted(fused_scores.items(), key=lambda x: -x[1])

面试话术:

"RAG-Fusion 解决了传统 RAG 的语义孤岛问题。核心思路是:用户问一个问题,我生成 N 个相关查询,每个查询独立检索,再通过 RRF 算法融合排序。这样能召回更多样的文档,特别是需要多文档汇总的问题。实现上用 Reciprocal Rank Fusion,简单但有效。"

RRF 面试追问点(高频坑):

问:"两路召回融合时,向量打分 0-1、关键词打分 0-20,怎么做归一化?" 答:RRF 不需要归一化——它只看排名(rank),不看原始分数。 每路的第 1 名都得 1/(k+1),不管它是 0.95 分还是 19 分。所以不同量纲的分数直接用 RRF 融合即可,这是它相比加权平均分融合(需要先 MinMax 归一化)的核心优势。