检索增强生成(RAG)的本质,就是为大语言模型“补课”——补充最新资讯、填充特定领域知识,同时还能有效缓解模型“胡编乱造”的问题。实际应用效果确实不错。然而,许多RAG方案设计得过于复杂,导致响应时间明显延长。一个标准的RAG工作流通常需要串联多个处理环节,而每个环节又有多种不同的实现方式。
本文的核心目标,是对现有RAG方法及其可能的组合进行全面摸底,找出真正高效实用的方案。我们通过大量实验,最终总结出几套部署策略,能够在性能与效率之间取得良好平衡。此外,我们还展示了多模态检索技术如何帮助模型更准确地理解图像信息,以及如何利用“检索即生成”的思路来加速多模态内容的生成过程。

1 引言
大语言模型生成的内容,要么时效性不足,要么完全凭空捏造——即便通过强化学习或某些轻量级手段进行了对齐。RAG技术之所以流行,正是因为它将预训练与检索两种思路的优势融为一体,为模型搭建了更稳固的框架。而且,RAG最大的好处是:无需重新训练模型参数,只要拥有相关文档库,就能快速为特定组织或领域部署应用。
目前市面上已有不少RAG方法,它们通过依赖查询的检索来增强大模型能力。一个典型的RAG工作流通常包含多个环节:先判断查询是否需要检索(查询分类),然后去文档库中查找(检索),将结果按相关性排序(重排),再整理顺序(重新打包),最后提取关键信息生成回答(摘要)。此外,还需要考虑文档切块方式、嵌入模型选择、以及大模型微调等问题。
难点在于,每个环节的实现方式五花八门。例如检索这一步,你可以先改写查询再检索,也可以先生成一个伪答案再去匹配相似文档,或者直接用对比学习训练好的嵌入模型。不同选择及其组合方式,会极大影响整个RAG系统的效率与效果。坦率地说,目前还没有人系统性地研究过,究竟怎样做才能将RAG的效果推向最优。
在这项研究中,我们希望通过大量实验找到RAG的最佳实践。由于对所有可能性进行穷举不现实,我们分三步推进:首先,为每个环节选出最具代表性的几种方法(最多三种);接着,每次只替换一个方法,固定其他模块,观察其对整体性能的影响,并考察与其他模块的交互效果;最后,针对不同应用场景,找出既高效又实用的组合。基于这些发现,我们总结出几套能在性能与效率间取得平衡的部署策略。
这项研究的主要贡献有三点:
- 通过大量实验,系统调查了现有RAG方法及其组合,确定了最优实践。
- 建立了一套综合评估指标与相应数据集,能够全面评估RAG模型在通用、专业及RAG相关能力上的表现。
- 展示了多模态检索技术如何显著提升对视觉输入的问答能力,并通过“检索即生成”策略加快多模态内容的生成速度。
2 相关工作
确保大语言模型输出的准确性是首要任务。但单纯扩大模型规模,无法根治问题,尤其是在知识密集型任务和专业领域。RAG通过从外部知识库检索相关文档,为模型提供准确、实时、特定领域的上下文。此前的工作主要通过查询与检索转换、增强检索器性能、以及微调检索器和生成器来优化RAG流程。
2.1 查询和检索转换
要获得良好的检索效果,查询本身必须准确、清晰、详细。但即便转换为嵌入,查询与相关文档之间仍可能存在语义偏差。此前的一些工作,如Query2Doc和HyDE,通过从原始查询生成伪文档来增强检索;TOC则将查询拆分为子查询,汇总检索结果。另一些研究聚焦于转换检索源文档。LlamaIndex提供了为检索文档生成伪查询的接口,提高了与真实查询的匹配度。对比学习也被用来拉近查询与文档嵌入在语义空间中的距离。对检索到的文档进行后处理同样是一种增强思路,例如分层提示摘要、使用抽象式或提取式压缩器来减少上下文长度、消除冗余。
2.2 检索器增强策略
文档切块方式与嵌入选择,对检索性能影响很大。常见的切块策略是将文档切成小块,但如何确定最佳长度确实棘手——太小会切碎句子,太大又会引入不相关的上下文。LlamaIndex优化了诸如Small2Big和滑动窗口等切块方法。检索回来的块可能不相关,数量也可能过多,因此需要重新排序来过滤掉无关内容。一种常见的重排方法是直接使用BERT、T5或LLaMA等深度语言模型,效果更好但推理速度较慢。TILDE则通过预先计算并存储查询项的可能性来提高效率,根据它们的总和对文档排序。
2.3 检索器和生成器微调
在RAG框架内进行微调,对优化检索器和生成器都至关重要。一些研究专注于微调生成器,使其更好地利用检索来的上下文;另一些则微调检索器,让它学会检索对生成器更有用的段落;整体方法则将RAG视为一个集成系统,同时微调检索器和生成器来提升整体性能,但这会增加复杂度与集成难度。
几篇综述文章已广泛讨论过当前的RAG系统,但选择可用的算法仍然是个挑战。本文聚焦于应用RAG方法的最佳实践,目标是推动对RAG的理解与应用。
3 RAG工作流程
本节详细介绍RAG工作流的各个组成部分。对每个模块,我们回顾了常用方法,并为最终流程选定了默认与备选方案。第4节将讨论最佳实践。
3.1 查询分类
并非所有查询都需要检索增强。RAG虽能提升信息准确性、减少幻觉,但频繁检索会增加响应时间。因此,先对查询进行分类,判断是否需要检索。需要检索的走RAG流程,其他则直接由大模型处理即可。
通常,当任务需要模型参数之外的知识时才需要检索。但检索的必要性因任务而异。例如,一个训练数据截止到2023年的模型,处理“Sora由OpenAI开发”这样的翻译请求就用不着检索;但如果是介绍Sora,则必须检索才能提供相关信息。
因此,我们提出按任务类型来分类,决定是否需要检索。根据任务是否完全依赖用户提供的信息,我们将15个任务分为“足够”和“不足”两类(见图2)。我们训练了一个分类器来自动化这一决策过程。第4节将探讨查询分类对工作流的影响,比较有分类和无分类两种场景。
3.2 分块
将文档切成小块,对提高检索精度、避免大模型处理长文本时出现问题很有必要。切块可以在不同粒度上进行,例如标记级、句子级和语义级。
- 标记级最简单,但可能拆分句子,影响检索质量。
- 语义级用大模型来定断点,保留了上下文,但太耗时。
- 句子级在保留语义与简单高效之间取得了平衡。
在这项研究中,我们采用了句子级分块,平衡了简单性与语义保留。我们从四个维度来审视分块。
3.2.1 分块大小
分块大小对性能影响很大。块越大,上下文越丰富,理解越到位,但处理时间也越长。块越小,检索召回率更高、时间更短,但可能上下文不足。最佳分块大小需要在忠实度和相关性等指标之间找平衡。
3.2.2 分块技术
像“小到大”和“小滑动窗口”这类高级技术,通过组织块与块之间的关系来提升检索质量。具体来说,先用小块去匹配查询,然后返回包含小块及上下文信息的大块。我们使用LLM-Embedder模型做了实验,小块设为175个标记,大块512个标记,重叠20个标记。这些技术通过保留上下文、确保检索到相关信息,确实提升了效果。
3.2.3 嵌入模型选择
选择合适的嵌入模型,对实现查询与块之间的有效语义匹配至关重要。我们利用FlagEmbedding的评估模块来挑选合适的开源嵌入模型。结果表明,LLM-Embedder与BAAI/bge-large-en成绩相当,但前者大小是后者的三倍。因此我们选择了LLM-Embedder,因为它在性能和体积上表现均衡。
3.2.4 元数据添加
通过给块添加标题、关键词和假设问题等元数据,可以改善检索,提供更多后处理方式,并帮助大模型更好地理解检索到的信息。关于元数据的详细研究,留待以后进行。
3.3 向量数据库
向量数据库用于存储嵌入向量及其元数据,通过各种索引和近似最近邻方法,实现对查询相关文档的高效检索。为了选出合适的向量数据库,我们根据四个关键标准评估了几个选项:多种索引类型、十亿规模向量支持、混合搜索和云原生能力。表5详细对比了Wea viate、Faiss、Chroma、Qdrant和Milvus这五个开源向量数据库。我们的评估表明,Milvus在各方面都最为全面。
3.4 检索方法
给定用户查询,检索模块根据查询与文档之间的相似度,从预构建的语料库中选出前k个相关文档。然后生成模型利用这些文档来制定响应。但原始查询往往表达不佳、缺乏语义信息,会负面影响检索过程。为了解决这些问题,我们使用LLM-Embedder作为查询和文档编码器,评估了三种查询转换方法:查询重写、查询分解和伪文档生成(HyDE)。
近期研究表明,将词汇搜索与向量搜索相结合可以显著提升性能。在这项研究中,我们使用了BM25做稀疏检索,Contriever做密集检索。表6的结果显示,监督方法明显优于无监督方法。结合HyDE和混合搜索,LLM-Embedder取得了最高分。不过,查询重写和查询分解并未带来预期提升。综合考虑最佳性能与可接受的延迟,我们推荐将HyDE与混合搜索作为默认检索方法。如果更看重效率,混合搜索已经结合了稀疏检索(BM25)和密集检索(原始嵌入),延迟相对较低,性能也不错。
3.4.1 不同检索方法的结果
我们在TREC DL 2019和2020段落排名数据集上评估了不同搜索方法的性能。表6的结果显示,监督方法显著优于无监督方法。结合HyDE和混合搜索,LLM-Embedder取得了最高分。但查询重写和查询分解并未像预期那样增强检索性能。考虑到最佳性能与可接受的延迟,我们推荐将HyDE与混合搜索作为默认检索方法。如果更看重效率,混合搜索结合了稀疏检索(BM25)和密集检索(原始嵌入),延迟较低,性能也不错。
3.4.2 HyDE的不同文档和查询连接
表7显示了使用HyDE时,假设文档与查询的不同连接策略的影响。将多个伪文档与原始查询连接起来可以显著提高检索性能,尽管延迟会增加,这体现了一种权衡。但无限制地增加假设文档数量并不会带来显著好处,反而大幅提高延迟,说明一个假设文档就够了。
3.4.3 混合搜索中稀疏检索的不同权重
表8展示了混合搜索中不同α值的影响,α控制稀疏与密集检索之间的权重。我们评估了五种α值,结果表明α=0.3时性能最佳,说明适当调整α可以在一定程度上优化检索效果。因此我们选择α=0.3。
3.5 重新排序方法
初始检索后,需要重新排序来增强检索文档的相关性,确保最相关的内容排在前面。这个阶段采用更精确但耗时的方法来重新排序。我们考虑了两类方法:DLM重排(利用分类)和TILDE重排(侧重于查询可能性)。
- DLM重排:利用深度语言模型,微调后把文档与查询的相关性分为“真”或“假”,推理时按“真”的概率排名。
- TILDE重排:通过预测每个查询项的可能性来打分,支持快速重排。
我们在MS MARCO段落排名数据集上做了实验,使用了monoT5、monoBERT、RankLLaMA和TILDEv2模型。表9的结果表明,monoT5在性能与效率之间平衡得不错。RankLLaMA追求最佳性能,TILDEv2则适合在固定集合上快速上手。
3.6 文档重新打包
文档提供的顺序会影响后续的生成效果。我们在重排后加入重新打包模块,有三种方法:“向前”(按相关性降序)、“向后”(升序)和“两边”(最佳信息放在头部或尾部)。由于重新打包主要影响后续模块,我们在第4节通过与其他模块结合测试来确定最佳方法。这里我们默认选择“两边”。
3.7 摘要
检索结果中可能包含冗余或不必要的信息,会妨碍模型生成准确的响应。此外,过长的提示会拖慢推理速度。因此,对检索文档进行有效摘要非常关键。摘要可以是提取式(从文本中选取重要句子)或抽象式(综合信息生成连贯摘要)。本文只关注基于查询的方法,测试了Recomp、LongLLMLingua和选择性上下文。
表10的结果显示,Recomp表现最好。LongLLMLingua效果稍差,但泛化能力更好,因为它没有在这些实验数据集上训练过。所以我们将其作为备选。
3.8 生成器微调
本节聚焦在保持检索器不变的情况下微调生成器,特别研究了相关或不相关上下文对生成器性能的影响。我们定义了相关上下文(dgold)和随机上下文(drandom),并训练了不同组合下的模型。结果显示,在训练时混合使用相关和随机文档的模型(Mgr),在提供相关或混合上下文时表现最佳。这说明混合训练可以增强生成器对不相关信息的鲁棒性,同时确保有效利用相关上下文。因此,我们确定在训练时加入一些相关和随机选择的文档是最佳方案。
4 寻找最佳RAG实践
接下来,我们探索实现RAG的最优方案。先采用第3节确定的每个模块的默认实践,然后按照图1的工作流,依次替换模块,选出最有效的选项,直到最终确定摘要模块的最佳方法。
4.1 全面评估
我们进行了广泛的实验,涵盖常识推理、事实核查、开放领域QA、多跳QA和医学QA等多种任务。同时,使用RAGAs推荐的指标评估了忠实度、上下文相关性、答案相关性和答案正确性,还计算了检索相似度。
4.2 结果与分析
基于表11的结果,关键发现如下:
- 查询分类模块:既提升了有效性,也降低了延迟(整体得分从0.428提高到0.443,每个查询延迟从16.41秒降到11.58秒)。
- 检索模块:“Hybrid with HyDE”得分最高(0.58),但计算成本高,每个查询需11.71秒。推荐使用“Hybrid”或“Original”方法,它们在减少延迟的同时保持了可比的性能。
- 重新排序模块:缺少重排会导致性能明显下降,说明它必不可少。MonoT5实现了最高平均得分,证实了其在增强检索文档相关性方面的有效性。
- 重新打包模块:“Reverse”配置表现更好,RAG得分为0.560,说明将更相关的上下文放在靠近查询的位置能带来最佳结果。
- 摘要模块:Recomp表现出色,虽然去掉摘要也能用较低延迟取得可比结果。但Recomp仍是首选,因为它能解决生成器的最大长度限制问题。在时间敏感的应用里,去掉摘要可以缩短响应时间。
实验结果表明,每个模块都对RAG系统的整体性能有独特贡献。
5 讨论
5.1 实施RAG的最佳实践
根据实验发现,我们推荐两种不同的方案:一种追求最高性能,另一种在效率和效果之间找平衡。
- 最佳性能实践:加入查询分类、用“Hybrid with HyDE”检索、monoT5重排、选择“Reverse”重新打包、使用Recomp摘要。这种配置取得了最高平均得分0.483,但计算强度大。
- 平衡效率实践:加入查询分类、用Hybrid方法检索、TILDEv2重排、选择“Reverse”重新打包、使用Recomp摘要。由于检索模块最耗时,换成Hybrid方法能大幅降低延迟,同时保持可比的性能。
5.2 多模态扩展
我们将RAG扩展到了多模态应用,集成了text2image和image2text检索能力,使用大量的成对图像和文本描述作为检索源。图4展示了这一点:当用户查询与存储图像的文本描述高度匹配时,text2image功能可以加速图像生成;image2text功能则能处理用户提供的图像并进行对话。
这些多模态RAG能力提供了几个优势:
- 基础性:检索方法提供来自经过验证的材料,确保真实性和特异性。
- 效率:当答案已经存在于存储材料中时,检索比生成更高效。
- 可维护性:生成模型需要仔细微调以适应新应用,而基于检索的方法只需扩大检索源规模、提高检索质量即可满足新需求。
我们计划将这种策略扩展到视频、语音等其他模态,同时探索更有效、更高效的跨模态检索技术。
6 结论
这项研究的目标是找到实施检索增强生成的最佳实践,以提升大语言模型生成内容的质量和可靠性。我们系统评估了RAG框架内每个模块的潜在解决方案,并为每个模块推荐了最有效的方法。同时,我们引入了一套全面的RAG系统评估基准,并通过大量实验确定了各种方案中的最佳实践。这些发现不仅有助于更深入地理解RAG系统,也为未来的研究打下了基础。
