引言
在检索增强生成(RAG)系统中,检索质量直接决定了最终生成结果的准确性和相关性。然而,单一的检索方式往往难以全面捕获用户意图。当我们使用多个检索系统(如BM25关键词搜索和向量语义搜索)时,如何有效融合这些不同来源的结果就成为了关键问题。
倒数排序融合(Reciprocal Rank Fusion, RRF)正是为解决这一问题而生的优雅方案。它无需复杂的参数调优,仅依靠排名位置就能智能地合并多个检索结果,让最相关的文档脱颖而出。
什么是RRF?
倒数排序融合(RRF)是一种将多个排序结果列表合并为单一排序列表的算法。它最初由滑铁卢大学和Google合作开发,其核心思想非常直观:在多个检索系统中都排名靠前的文档,往往更具相关性/更重要。
RRF的最大优势在于:
- 无需分数归一化 - 不同检索系统的评分标准差异巨大(如BM25分数和余弦相似度),RRF直接使用排名位置,避免了复杂的分数标准化问题
- 简单而强大 - 算法实现简单,但在实践中表现出色
- 零样本有效 - 不需要针对特定领域进行训练或调优

RRF的工作原理
核心公式
RRF通过以下公式计算每个文档的最终得分:
RRF_score(d) = ∑ 1 / (k + rank(d))
其中:
d表示某个文档rank(d)是文档在某个检索结果列表中的排名位置(从1开始)k是一个常量,通常设为60,用于降低低排名文档的影响- 求和符号表示对所有包含该文档的结果列表进行累加

为什么选择k=60?
常量k的作用是平滑排名差异。k=60是经过学术研究验证的经验值,它能在以下两点之间取得良好平衡:
- 让高排名文档有明显优势
- 避免低排名文档的贡献完全被忽略
直观理解
让我们通过一个例子来理解RRF的工作机制。
假设有三个检索系统返回了以下结果:
- 系统A: Doc1, Doc2, Doc3, Doc4, Doc5
- 系统B: Doc3, Doc1, Doc4, Doc6, Doc2
- 系统C: Doc2, Doc3, Doc1, Doc8, Doc9
计算Doc1的RRF分数(k=60):
RRF(Doc1) = 1/(60+1) + 1/(60+2) + 1/(60+3) = 1/61 + 1/62 + 1/63 ≈ 0.0164 + 0.0161 + 0.0159 ≈ 0.0484
计算Doc3的RRF分数:
RRF(Doc3) = 1/(60+3) + 1/(60+1) + 1/(60+2) = 1/63 + 1/61 + 1/62 ≈ 0.0159 + 0.0164 + 0.0161 ≈ 0.0484
可以看到,Doc1和Doc3在三个系统中都排名靠前,因此获得了相似的高分。而只在单个系统中出现的文档(如Doc6, Doc7)则会得到较低的分数。
RRF在RAG中的应用场景
1. 混合检索融合
这是RRF最典型的应用场景。结合词法搜索和语义搜索的优势:
- BM25关键词搜索 - 擅长精确匹配专有名词、缩写词、特定术语
- 向量语义搜索 - 擅长理解语义相关性、同义词、上下文含义
通过RRF融合,既能捕获精确匹配,又不失语义理解。
2. 多查询检索融合
当用户查询较为复杂或模糊时,可以通过LLM生成多个子查询,分别检索后用RRF合并结果。
例如,用户问:“任务分解的挑战是什么?”
可以生成子查询:
- “任务分解面临的主要困难”
- “任务分解的局限性”
- “任务分解实施中的问题”
每个子查询独立检索,然后用RRF融合,确保检索的全面性。
3. 多模态检索融合
在处理多模态数据时,可能需要融合:
- 文本检索结果
- 图像检索结果
- 表格检索结果
RRF同样能够有效整合这些异构的排序列表。
代码实现
Python基础实现
from collections import defaultdictdef reciprocal_rank_fusion(search_results_dict, k=60): """ 使用RRF算法融合多个检索结果 参数: search_results_dict: 字典,键为查询标识,值为文档ID列表(按相关性排序) k: RRF常量,默认60 返回: 融合后的文档列表,按RRF分数降序排列 """ # 存储每个文档的RRF分数 fused_scores = defaultdict(float) # 遍历每个检索结果列表 for query_id, doc_list in search_results_dict.items(): # 遍历文档及其排名 for rank, doc_id in enumerate(doc_list, start=1): # 累加RRF分数 fused_scores[doc_id] += 1 / (k + rank) # 按分数降序排序 sorted_docs = sorted( fused_scores.items(), key=lambda x: x[1], reverse=True ) # 返回文档ID列表 return [doc_id for doc_id, score in sorted_docs]# 使用示例search_results = { 'query_1': ['doc1', 'doc3', 'doc5', 'doc7'], 'query_2': ['doc2', 'doc1', 'doc4'], 'query_3': ['doc5', 'doc3', 'doc2']}fused_results = reciprocal_rank_fusion(search_results)print("融合后的文档排序:", fused_results)
带有完整文档信息的实现
在实际RAG应用中,我们通常需要保留文档的完整信息:
def reciprocal_rank_fusion_with_docs(ranked_results_list, k=60): """ 融合多个检索结果,保留文档完整信息 参数: ranked_results_list: 列表的列表,每个子列表包含文档对象 k: RRF常量 返回: 融合后的文档列表 """ score_dict = {} # 对每个检索结果列表 for doc_list in ranked_results_list: for rank, doc in enumerate(doc_list): # 使用文档内容和元数据作为唯一标识 doc_key = ( doc.metadata.get("source", ""), doc.page_content.strip() ) # 初始化或更新分数 if doc_key notin score_dict: score_dict[doc_key] = { "doc": doc, "score": 0 } # 累加RRF分数 score_dict[doc_key]["score"] += 1 / (k + rank) # 按分数排序 fused_docs = sorted( score_dict.values(), key=lambda x: x["score"], reverse=True ) return [entry["doc"] for entry in fused_docs]
RAG-Fusion:RRF的进阶应用
RAG-Fusion是一个将RRF应用于RAG的完整工作流:
工作流程
- 查询扩展 - 使用LLM将用户原始查询转换为多个相似但角度不同的查询
- 并行检索 - 对所有查询(包括原始查询)并行执行检索
- RRF融合 - 使用RRF算法合并所有检索结果
- 上下文生成 - 将融合后的top-k文档作为上下文传递给LLM生成最终答案
核心逻辑实现
下面是一个伪代码,大家可以参考下RAG中RRF的使用
def rag_fusion_pipeline(original_query, retriever, llm, k=60, top_k=5): """ RAG-Fusion完整流程 """ # 1. 生成多个查询变体 query_variants = generate_query_variants(original_query, llm) all_queries = [original_query] + query_variants # 2. 并行检索 all_results = [] for query in all_queries: results = retriever.retrieve(query) all_results.append(results) # 3. RRF融合 fused_docs = reciprocal_rank_fusion_with_docs(all_results, k=k) # 4. 选择top-k文档 context_docs = fused_docs[:top_k] # 5. 生成最终答案 answer = llm.generate( query=original_query, context=context_docs ) return answerdef generate_query_variants(query, llm, num_variants=3): """ 使用LLM生成查询变体 """ prompt = f"""你是一个帮助生成搜索查询的AI助手。 基于用户的原始问题,生成{num_variants}个相关但角度不同的搜索查询。 这些查询应该帮助从不同角度理解用户意图。 原始问题: {query} 请直接输出{num_variants}个查询,每行一个:""" response = llm.generate(prompt) variants = [line.strip() for line in response.split('\n') if line.strip()] return variants[:num_variants]
RRF的优势与局限
优势
- 简单高效 - 算法实现简单,计算开销小,易于理解和维护
- 无需调参 - k值使用默认的60即可在大多数场景下表现良好,省去了繁琐的参数调优
- 跨系统兼容 - 不依赖具体的评分机制,可以轻松整合任意检索系统
- 提升检索质量 - 学术研究和实践都证明,RRF的表现优于单一检索方法和简单的分数加权
- 增强鲁棒性 - 通过多系统共识,降低单一系统错误的影响
局限性
不过RRF存在几个缺点是:
- 忽略相关性分数 - RRF只使用排名信息,丢弃了原始相关性分数,在某些场景下可能损失信息
- 需要多次检索 - 必须执行多次检索操作,会增加延迟和计算成本
- 文档去重挑战 - 需要准确识别不同结果列表中的相同文档,文档表示不一致时可能出问题
- 对检索质量的依赖 - 如果所有检索系统都返回不相关的结果,RRF也无法改善结果质量
大家实践的过程,可以采用以下的方法来使用RFF:
- 选择互补的检索方法 - 组合特点不同的检索系统(如词法+语义)能获得最佳效果
- 控制检索数量 - 每个查询检索top-20到top-50的文档通常足够,过多会增加噪音
- 注意文档标识 - 确保能准确识别和去重相同文档,可以使用内容哈希或稳定的ID
- 保留原始查询权重 - 在RAG-Fusion场景中,可以让原始查询的结果参与多次RRF计算,增加其权重
- 监控成本 - 多次检索和LLM调用会增加成本,需要在效果和成本间找到平衡
总结
倒数排序融合(RRF)为RAG系统提供了一个简单而强大的结果融合方案。它通过巧妙利用排名信息,避免了分数归一化的复杂性,同时能够有效提升检索质量。
无论是混合检索、多查询检索,还是更复杂的RAG-Fusion流程,RRF都能发挥重要作用。随着Elasticsearch 8.8等主流搜索引擎原生支持RRF,这一技术正在成为构建高质量RAG系统的标准组件。
如何学习大模型 AI ?
我国在AI大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着Al技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国Al产业的创新步伐。加强人才培养,优化教育体系,国际合作并进,是破解困局、推动AI发展的关键。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

2025最新大模型学习路线
明确的学习路线至关重要。它能指引新人起点、规划学习顺序、明确核心知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。
对于从来没有接触过AI大模型的同学,我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线。

针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。
大模型经典PDF书籍
新手必备的大模型学习PDF书单来了!全是硬核知识,帮你少走弯路!

配套大模型项目实战
所有视频教程所涉及的实战项目和项目源码等

博主介绍+AI项目案例集锦
MoPaaS专注于Al技术能力建设与应用场景开发,与智学优课联合孵化,培养适合未来发展需求的技术性人才和应用型领袖。


这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

为什么要学习大模型?
2025人工智能大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。

适合人群
- 在校学生:包括专科、本科、硕士和博士研究生。学生应具备扎实的编程基础和一定的数学基础,有志于深入AGI大模型行业,希望开展相关的研究和开发工作。
- IT行业从业人员:包括在职或失业者,涵盖开发、测试、运维、产品经理等职务。拥有一定的IT从业经验,至少1年以上的编程工作经验,对大模型技术感兴趣或有业务需求,希望通过课程提升自身在IT领域的竞争力。
- IT管理及技术研究领域人员:包括技术经理、技术负责人、CTO、架构师、研究员等角色。这些人员需要跟随技术发展趋势,主导技术创新,推动大模型技术在企业业务中的应用与改造。
- 传统AI从业人员:包括算法工程师、机器视觉工程师、深度学习工程师等。这些AI技术人才原先从事机器视觉、自然语言处理、推荐系统等领域工作,现需要快速补充大模型技术能力,获得大模型训练微调的实操技能,以适应新的技术发展趋势。

课程精彩瞬间
大模型核心原理与Prompt:掌握大语言模型的核心知识,了解行业应用与趋势;熟练Python编程,提升提示工程技能,为Al应用开发打下坚实基础。
RAG应用开发工程:掌握RAG应用开发全流程,理解前沿技术,提升商业化分析与优化能力,通过实战项目加深理解与应用。
Agent应用架构进阶实践:掌握大模型Agent技术的核心原理与实践应用,能够独立完成Agent系统的设计与开发,提升多智能体协同与复杂任务处理的能力,为AI产品的创新与优化提供有力支持。
模型微调与私有化大模型:掌握大模型微调与私有化部署技能,提升模型优化与部署能力,为大模型项目落地打下坚实基础。
顶尖师资,深耕AI大模型前沿技术
实战专家亲授,让你少走弯路

一对一学习规划,职业生涯指导
- 真实商业项目实训
- 大厂绿色直通车
人才库优秀学员参与真实商业项目实训
以商业交付标准作为学习标准,具备真实大模型项目实践操作经验可写入简历,支持项目背调
大厂绿色直通车,冲击行业高薪岗位
文中涉及到的完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】







1万+

被折叠的 条评论
为什么被折叠?



