复旦大学AI团队:检索增强生成最佳实践搜索
复旦大学计算机学院、上海智能信息处理重点实验室的研究团队,最近在检索增强生成(RAG)领域做了一次相当系统的“摸底”工作。论文的署名作者包括吴一心、徐志波、石天远、王正远、李世正、齐谦、尹瑞成、吕昌泽,以及通讯作者郑晓晴和黄选静。团队通过大量实验,试图回答一个很实际的问题:在这么多RAG方法和模块组合中,到底哪一套方案最值得落地?
说实话,RAG这个概念现在几乎成了大语言模型落地的标配——它能有效整合最新信息,减少幻觉,提升专业领域的回答质量。但问题在于,一个完整的RAG工作流涉及查询分类、文档分块、向量检索、重排序、文档重装、摘要生成等多个步骤,每个步骤又有多种实现方式。很多团队在搭建RAG系统时,往往是凭着感觉或者拼凑经验来选方案,缺少一个全局的、经过系统对比的“最佳实践指南”。这篇论文正好补上了这个缺口。
研究团队的做法很务实:先对每个RAG模块分别做方法对比,选出现有方案中表现最好的两三种;然后固定其他模块,逐个替换模块来测试对整体效果的影响;最后,根据不同的需求场景(性能优先还是效率优先),给出推荐的组合方案。此外,他们还把多模态检索技术引入了RAG流程,验证了“检索即生成”策略在视觉问答和内容生成上的加速效果。
为了方便复现和后续研究,论文相关的资源和代码已经开源,感兴趣的读者可以访问GitHub仓库:https://github.com/FudanDNN-NLP/RAG。
1 简介
大语言模型虽然强大,但很容易生成过时信息或捏造事实——即使经过了RLHF或类DPO的对齐训练,这个问题依然存在。RAG通过结合预训练模型和检索模型,提供了一个很实用的框架:它不需要更新模型参数,只需提供与查询相关的文档,就能快速部署到特定领域。
但RAG流程本身很“啰嗦”。典型的管线包括:
查询分类
检索
重排序
文档重装
摘要
然而,迄今为止,还没有人对整个RAG工作流做过系统性的最佳实践探索。这篇论文正是为此而来。由于组合爆炸,他们采取了三步走策略:第一步,对每个模块的代表性方法进行横向对比,选出最好的一到三种;第二步,逐个替换模块,保持其他模块不变,观测对整体RAG性能的影响,从而确定每个模块的最优方法;第三步,基于发现,推荐适用于不同场景的几种组合方案。
研究的核心贡献有三点:
- 通过大规模实验,系统调查了现有RAG方法及组合,推荐了最佳实践。
- 引入了一套综合评估框架,涵盖通用能力、专业领域能力以及RAG专属能力(忠实度、上下文相关性、答案相关性等)。
- 展示了多模态检索技术对视觉问答的提升效果,并通过“检索即生成”策略加速多模态内容生成。
2 相关工作
2.1 查询和检索转换
要想检索效果好,查询本身必须准确、清晰、详细。即使转换为嵌入表示,查询与文档之间的语义差异仍然存在。早期研究尝试通过查询转换来丰富信息:比如Query2Doc和HyDE从原始查询生成伪文档来增强检索,TOC则将查询拆成子查询再聚合结果。
另一种思路是转换检索源文档。LlamaIndex提供了为检索文档生成伪查询的接口,帮助匹配真实查询。还有研究采用对比学习,把查询和文档的嵌入在语义空间里拉近。检索后的文档也需要后处理——比如分层提示摘要、抽取式与生成式压缩器来减少长度并去除冗余。
2.2 检索增强策略
文档分块和嵌入方法对检索性能影响很大。常见的分块策略是按固定长度切分,但最佳块长度很难确定:太小会破坏句子,太大则可能包含无关内容。LlamaIndex优化了分块方法,类似Small2Big和滑动窗口。检索到的块不一定都相关,数量也可能很多,这时就需要重排序来过滤。常见的重排序方法使用BERT、T5或LLaMA这类深度语言模型,虽然推断慢但效果好。TILDE则通过预计算查询词项的可能性来提升效率。
2.3 检索器和生成器的微调
在RAG框架中微调对优化两个核心组件至关重要。一些研究侧重微调生成器,让它更善于利用检索来的上下文,保证生成内容忠实且稳健。另一些则微调检索器,让它学会检索生成器真正需要的段落。整体方法将RAG视为一个集成系统,同时微调检索器和生成器以增强整体性能,但这也增加了复杂性和整合难度。
目前已有几篇综述全面讨论了RAG系统,覆盖文本生成、与LLM集成、多模态和AIGC等方向。但综述归综述,在实际实施中选择合适算法仍然很棘手。这篇论文的重点,就是给出可操作的最佳实践。
3 RAG 工作流程
下面详细介绍RAG工作流的各个组件。对于每个模块,我们会回顾常用方法,并选定默认和备选方案。第4节将讨论最终的最佳实践。图1展示了整个工作流和各模块的可选方法。详细的实验设置(包括数据集、超参数和结果)见附录A。
3.1 查询分类
并非所有查询都需要检索增强——LLM自身有内在能力。RAG虽然能提高准确率并减少幻觉,但频繁检索会增加响应时间。所以,先对查询分类,决定要不要走检索流程。需要检索的就走RAG模块,否则直接由LLM处理。
那么,哪些查询需要检索?通常,当查询需要超出模型参数存储的知识时才推荐检索。但检索的必要性因任务而异。例如一个2023年训练的LLM,处理“Sora是由OpenAI开发的”这个翻译请求不需要检索;但如果是介绍Sora的请求,则可能需要检索。
我们提议按任务类型来分类,看信息是否充分。具体分类如图2所示:对于完全基于用户提供信息的任务(标记为“充分”),不需要检索;否则标记为“不充分”,可能需要检索。我们训练了一个分类器来自动化这个决策过程。表1展示了分类器的结果。第4节将探究查询分类对工作流的影响,对比有分类和无分类两种情况。
3.2 分块
文档分块成更小的段落,对提高检索精度、避免LLM长度问题至关重要。分块可以在不同粒度上进行:Token级分块直观但可能分割句子;语义级分块利用LLM确定断点,保持上下文但耗时;句子级分块平衡简洁性和语义保留。本研究采用句子级分块。
3.2.1 块大小
块大小显著影响性能。更大的块提供更多上下文,增强理解但增加处理时间;更小的块提高检索召回率、减少时间,但可能缺乏上下文。我们根据所选语料库生成了约170个查询,不同块大小的影响如表3所示。
3.2.2 分块技术
高级技术如Small2Big和滑动窗口,通过组织块块关系来提高检索质量。先使用小块匹配查询,再返回包含小块和上下文的大块。我们使用LLM-Embedder模型作为嵌入模型,小块大小175个标记,大块512个标记,重叠20个标记。详细结果见表4。
3.2.3 嵌入模型选择
选对嵌入模型对语义匹配非常关键。我们使用FlagEmbedding的评估模块,使用数据集namespace-Pt/msmarco作为查询、namespace-Pt/msmarco-corpus作为语料库,来挑选开源模型。如表2所示,LLM-Embedder与BAAI/bge-large-en效果相当,但前者尺寸是后者的三倍,所以我们选择了前者。
3.2.4 元数据添加
给分块增加元数据(如标题、关键词、假设问题)可以改善检索,提供更多后续处理方式,帮助LLM更好地理解信息。元数据包含的详细研究留待未来。
3.3 向量数据库
向量数据库存储带有元数据的嵌入向量,通过各种索引和近似最近邻方法实现高效检索。表5比较了五种开源向量数据库:Wea viate、Faiss、Chroma、Qdrant和Milvus。评估表明,Milvus在满足所有基本标准上脱颖而出,优于其他选项。
3.4 检索方法
我们考察了三种检索方法:查询重写(受Rewrite-Retrieve-Read框架启发,提示LLM重写查询)、查询分解(根据原始查询产生的子问题检索文档)、生成伪文档(基于用户查询生成假设文档,用假设答案的嵌入检索类似文档,典型实现是HyDE)。
最近的研究表明,词汇搜索与向量搜索的结合能显著提升性能。我们使用BM25进行稀疏检索,使用Contriever进行稠密检索,作为两个强基准。
3.4.1 不同检索方法的结果
混合搜索(结合稀疏检索BM25和稠密检索原始嵌入)在相对较低的延迟下取得了显著性能。
3.4.2 使用不同文档和查询连接的HyDE
表7展示了HyDE中采用不同连接策略的影响。将多个伪文档与原始查询连接可以显著增强检索性能,尽管会增加延迟。但不加选择地增加伪文档数量并不带来显著好处,反而大幅增加延迟,使用单个伪文档就够了。
3.4.3 使用不同权重进行稀疏检索的混合搜索
表8展示了混合搜索中不同α值的影响(α控制稀疏和稠密检索的权重,相关性分数计算公式为Sh = α·Ss + Sd)。评估了五个α值,发现α=0.3时表现最佳,因此选为默认值。
3.5 重新排序方法
初始检索后,重排序阶段用来增强文档相关性,确保最相关信息排在前面。这个阶段使用更精确但更耗时的方法。我们考虑了两种方法:DLM重排序(利用分类,如monoT5、monoBERT、RankLLaMA)和TILDE重排序(侧重于查询可能性,效率更高)。
实验在MS MARCO Passage排名数据集上进行。结果见表9。推荐monoT5作为性能与效率平衡的方案;RankLLaMA适合追求最佳性能;TILDEv2适合固定集合中追求最快速度。
3.6 文档重装
重排序后文档的顺序会影响后续LLM响应生成。我们加入了一个紧凑的重打包模块,包含三种方法:“前向”(按相关性降序)、“逆向”(升序)和“两侧”(受Liu等人启发,在输入头部或尾部放置相关信息效果最佳)。由于重打包主要影响后续模块,我们在第4节通过组合测试来选择。本节默认选用“两侧”方法。
3.7 总结
检索结果可能包含冗余信息,长提示也会减慢推理。因此摘要模块很重要。我们评估了Recomp(包含抽取式和生成式压缩器)、LongLLMLingua(聚焦关键信息)和Selective Context(基于信息量去冗余)。在NQ、TriviaQA和HotpotQA上评估,推荐Recomp。
3.8 生成微调
本节专注于对生成器进行微调,检索器微调留待未来。我们用Llama-2-7B作为基础模型,通过改变上下文组成(仅相关文档、仅随机文档、相关+随机、两份相关文档)来训练不同模型,并在验证集上评估。结果表明,混合相关和随机文档训练的模型(Mgr)表现最佳——这能增强对无关信息的鲁棒性,同时有效利用相关上下文。因此最佳实践是:训练时增加几篇相关且随机选择的文档。
4 寻找最佳的RAG实践
接下来系统研究最佳实践。先使用第3节确定的每个模块的默认设置,然后按照图1的工作流,逐个优化模块,从各种选择中挑出最有效的选项。迭代直到确定最终摘要模块的最佳方法。根据第3.8节,使用微调后的Llama2-7B-Chat模型,每个查询增强几篇随机选择的相关文档。
4.1 综合评价
实验覆盖多种NLP任务和数据集:常识推理(MMLU、ARC-Challenge、OpenbookQA)、事实核查(FEVER、PubHealth)、开放域问答(NQ、TriviaQA、WebQuestions)、多跳问答(HotpotQA、2WikiMultiHopQA、MuSiQue)、医学问答(PubMedQA)。此外还根据RAGAs指标评估了RAG能力(忠实度、上下文相关性、答案相关性、答案正确性),并计算检索文档与黄金文档的余弦相似度。
常识推理、事实核查和医学问答使用准确率,开放域问答和多跳问答使用F1和EM分数。最终RAG得分是上述五个RAG能力的平均值。每个数据集抽样最多500个示例。
4.2 结果与分析
根据表11的实验结果,得出以下关键见解:
查询分类模块:
检索模块:
重排序模块:
重打包模块:
摘要模块:
每个模块的贡献独特:查询分类提高准确性降低延迟,检索和重排序显著提升处理不同查询的能力,重打包和摘要进一步完善输出。
5 讨论
5.1 实施RAG的最佳实践
根据实验结果,我们推荐两种不同的配方:一种侧重最高性能,另一种侧重效率和功效的平衡。
最佳性能实践:
5.2 多模态扩展
多模态检索有三大优势:植根性(检索来自已验证的多模态材料,确保真实性)、效率(答案已存在时更高效)、可维护性(通过扩大检索源规模改进,无需仔细调整模型)。我们计划将这种策略扩展到视频和语音,并探索高效跨模态检索技术。
6 结论
本研究旨在确定RAG的最佳实践,以提高LLM生成内容的质量和可靠性。我们系统评估了RAG框架中每个模块的潜在方案,推荐了最有效的方法,并引入了综合评估基准。实验发现不仅有助于深入理解RAG系统,也为未来研究奠定了基础。
7 限制条件
我们已评估了多种微调LLM生成器的方法。先前研究证明了联合训练检索器和生成器的可行性,希望未来探索。本研究采用模块化设计简化了寻找最佳实践的过程,降低了复杂性。由于构建向量数据库和实验成本巨大,我们仅在分块模块中研究了代表性技术。进一步探索不同分块技术对整体RAG系统的影响将是有趣挑战。虽然我们将RAG扩展到图像生成,未来还应拓展到语音和视频等模态。
8 致谢
作者感谢匿名审稿人提供的宝贵意见。本工作得到中国国家自然科学基金资助(项目编号:62076068)。
9 参考文献
(此处保留原文参考文献列表,因篇幅关系省略具体内容,但原样保留所有引用。)
A 实验细节
本节提供每个模块的详细实验设置,包括数据集信息、训练参数及额外实验结果。
A.1 查询分类
数据集:
实现细节:
A.2 检索方法的实验细节
数据集:
评估指标:
实现细节:
A.3 重排方法的实验细节
数据集:
评估指标:
实现细节:
结果分析:
A.4 摘要方法的实验细节
评估指标:
实现细节:
A.5 生成器微调实验细节
数据集:
实现细节:
详细结果:
A.6 综合评估的实验细节
任务和数据集:
RAG能力评估:
检索相似度:
生成设置:
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名