rag-fusion
通过LLM多查询生成+互惠排名融合,弥补用户用词与知识库索引之间的术语鸿沟,提升RAG召回率。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
通过LLM多查询生成+互惠排名融合,弥补用户用词与知识库索引之间的术语鸿沟,提升RAG召回率。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你遇到过这种情况吗?用户问"气候变化对经济的影响",但知识库里写的是"全球变暖的经济代价"。关键词不匹配,RAG系统直接哑火——这是传统向量检索的根本局限:用户用词和知识库索引方式之间存在天然鸿沟。
RAG-Fusion 就是来解决这个问题的。
RAG-Fusion 由德国开发者 Adrian Raudaschl 创建,2023 年发布于 GitHub,目前斩获 940 star。Raudaschl 在信息检索领域有深入研究,他在博客中详细论证了为何标准 RAG(向量检索 + LLM 生成)在术语不匹配场景下存在系统性缺陷,并提出了"多查询生成 + 互惠排名融合"的解决思路。
项目脱胎于学术研究,配套有完整的实验复现(arXiv 2603.02153),包含了 200 个查询的配对引导置信区间分析,学术严谨性较高。
RAG-Fusion 的核心流程可以概括为四个阶段:
用 GPT 将用户原始查询扩展为多个不同角度的变体。例如:
这一步让检索从单一视角扩展到多角度覆盖,解决术语不匹配问题。
对每个查询变体在 ChromaDB 中独立执行向量相似度搜索,获得多份有序结果。
这是 RAG-Fusion 的核心算法。对 k=60 的 RRF 公式为:
RRF_score(doc) = Σ 1/(rank_doc_in_list_i + k)
如果一篇文档在多个查询结果列表中排名都靠前,它的 RRF 分数就更高——这自然地提升了跨视角一致的文档排名,压制了只在单一查询中出现的噪声文档。
在候选池(默认50)中用 BAAI/bge-reranker-base 或 FlashRank 对 (query, doc) 进行精细化打分,这是生产级检索的最后一步。配合 hybrid_diverse(BM25+向量双路检索)使用时,实验数据显示:
| 指标 | 基线向量 | Hybrid+Diverse+Rerank | 提升 |
|---|---|---|---|
| Precision@5 | 0.283 | 0.324 | +14.5% |
| Recall@10 | 0.151 | 0.185 | +22.5% |
| NDCG@10 | — | — | 统计显著提升 |
但 README 中有重要警示:纯向量版的 RRF 融合效果有限(average wash,复杂查询甚至负向),必须搭配 BM25 混合(hybrid)才能带来稳定提升。
项目分为 main.py 演示模块和 eval/ 评估模块:
main.py — 快速演示
generate_queries_chatgpt():调用 OpenAI 生成查询变体,支持普通模式和多样化(diverse)模式create_collection():用 10 篇气候变化示例文档初始化 ChromaDBvector_search():向量检索,ChromaDB 原生实现reciprocal_rank_fusion():RRF 融合算法核心,支持查询权重调整generate_output():可选 LLM 最终合成eval/ — 完整评估框架
dataset.py:NFCorpus 数据集下载与 ChromaDB 导入(3,633篇医学/营养文档,323个测试查询)retrieval.py:7种检索方法对比:BM25、向量基线、混合、RRF融合、多样化融合、加权融合、混合多样化rerank.py:支持 sentence-transformers CrossEncoder 和 FlashRank 两种重排序后端metrics.py:Precision、Recall、NDCG、MRR 全套 IR 指标bootstrap_ci.py:配对引导置信区间统计(支撑学术结论的统计显著性)| 组件 | 技术选型 | 作用 |
|---|---|---|
| 核心LLM | OpenAI GPT(gpt-5.1-chat-latest) | 查询生成 + 最终合成 |
| 向量数据库 | ChromaDB | 文档存储 + 相似度检索 |
| 关键词检索 | rank_bm25(BM25Okapi) | 混合检索的 BM25 分支 |
| 重排序模型 | BAAI/bge-reranker、FlashRank | Cross-Encoder 精排 |
| 评估数据 | NFCorpus(BEIR Benchmark) | 标准化医学/营养检索评估 |
| 依赖 | python-dotenv、tqdm、tabulate | 环境管理 + 进度条 + 表格输出 |
Python 代码量约 1,500 行,分布在 11 个文件中,代码组织清晰,模块职责明确。测试覆盖了核心 pipeline(test_main.py)。
强烈适合:
不适合:
纯向量版 RRF 效果有限:README 直言不讳——如果不搭配 BM25 混合,效果接近 baseline,复杂查询反而负向。部署时必须注意这一点。
API 成本:每次查询生成 5 个变体 = 5 次 GPT 调用,生产环境成本需评估。
延迟:串行执行多个向量搜索 + LLM 生成,p95 延迟较高。
无容器化:纯 pip 依赖,规模化部署需要自行封装。
RAG-Fusion 代表了 RAG 演进的一条重要方向:从"更好的嵌入模型"到"更好的检索策略"。它揭示了一个关键洞察——在真实场景中,检索质量的瓶颈往往不是嵌入模型不够好,而是查询和文档之间的词汇鸿沟。多查询生成本质上是用 LLM 作为"术语翻译层",RRF 作为"投票融合层",共同弥补这个鸿沟。
作者还提出了自适应路由的架构建议:对简单查询走基线+重排序,对长尾/术语复杂的查询触发融合,兼顾效果与成本。这个设计思路在生产系统中有较高参考价值。
图1:项目作者 Adrian Raudaschl 的 GitHub 头像
项目地址:https://github.com/Raudaschl/rag-fusion
默认分支:master | 主语言:Python | License:MIT
适用版本:Python >= 3.9 + OpenAI API Key