
🧠 图解记忆: 一问多写、多路召回、RRF 融合再去重;它扩展查询视角,但会增加调用和检索成本。
💡 答案要点
传统 RAG 的问题:
- 语义孤岛:用户查询和文档的语义可能存在偏差
- 召回单一:仅靠向量相似度,可能遗漏相关内容
- 缺乏全局理解:无法回答需要多文档汇总的问题
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 归一化)的核心优势。