典型的RAG流程、每个模块的最佳实践和综合评估
近日热文:全网最全的神经网络数学原理(代码和公式)直观解释
欢迎关注知乎和公众号的专栏内容
LLM架构专栏
知乎LLM专栏
知乎【柏企】
公众号【柏企科技说】【柏企阅文】
RAG的过程很复杂,包含许多组成部分。我们如何确定现有的RAG方法及其最佳组合,以确定最佳RAG实践?
本文介绍了一项名为 “Searching for Best Practices in Retrieval-Augmented Generation” 的新研究。本研究旨在解决这个问题。
本文分为四个主要部分。首先,它介绍了典型的RAG过程。接下来,它介绍了每个RAG模块的最佳实践。然后,它提供全面的评估。最后,它分享了我的想法和见解,并以总结结束。
典型的RAG工作流程
图1:检索增强生成工作流程。每个组件考虑的可选方法以粗体表示,而带下划线的方法表示各个模块的默认选择。以蓝色字体表示的方法表示根据经验确定的性能最佳的选择。
典型的RAG工作流程包括几个中间处理步骤:
- 查询分类(确定输入查询是否需要检索)
- 检索(高效获取相关文件)
- 重新排名(根据相关性优化检索到的文档的顺序)
- 重新打包(将检索到的文档组织成结构化格式)
- 摘要(提取关键信息以生成响应并消除冗余)
实现RAG还涉及决定如何将文档拆分为块,选择用于语义表示的嵌入,选择合适的向量数据库以进行高效的特征存储,以及寻找微调LLM的有效方法,如图1所示。
每个步骤的最佳实践
查询分类
为什么需要查询分类?并非所有查询都需要检索增强,因为LLM具有某些功能。虽然RAG可以提高准确性并减少幻觉,但频繁检索会增加响应时间。因此,我们首先对查询进行分类,以确定是否需要检索。通常,当需要超出模型参数的知识时,建议使用检索。
我们可以根据任务是否提供足够的信息将任务分为15种类型,并显示具体的任务和示例。完全基于用户提供信息的任务被标记为“充分”,不需要检索;否则,它们将被标记为 “不足” ,可能需要检索。
图2:不同任务的检索要求分类。在未提供信息的情况下,我们会根据模型的功能对任务进行区分。
此分类过程是通过训练分类器自动执行的。
图3:查询分类器的结果。来源:搜索检索增强生成的最佳实践。
分块
将文档划分为较小的块对于提高检索准确性和避免LLM中的长度问题至关重要。通常有三个级别:
- 令牌级分块:很简单,但可能会拆分句子,从而影响检索质量。
- 语义级分块:使用LLM来确定断点,保留上下文但需要更多时间。
- 句子级分块:在保留文本语义与简洁高效之间取得平衡。
在这里,句子级分块用于平衡简单性和语义保留。分块过程从以下四个维度进行评估。
块大小
块大小会显著影响性能。较大的块提供更多的上下文,增强理解,但会增加处理时间。较小的块可以提高召回率并缩短时间,但可能缺乏足够的上下文。
图4 :不同数据块大小的比较。来源:搜索检索增强生成的最佳实践。
如图4所示,使用了两个主要指标:忠实度和相关性。忠实度衡量的是反应是幻觉还是与检索到的文本相匹配。Relevancy衡量检索到的文本和响应是否与查询匹配。
块的组织
结果如图5所示。较小的块大小为175个Token,较大的块大小为512个Token,区块重叠为20个Token。
图5:不同数据块技能的比较。来源:搜索检索增强生成的最佳实践。
嵌入模型选择
如图6所示,LLM-Embedder获得了与BAAI/bge-large-en相当的结果,但大小只有它的三分之一。因此,选择LLM-Embedder来平衡性能和大小。
图6:namespace-Pt/msmarco上不同嵌入模型的结果。来源:搜索检索增强生成的最佳实践。
矢量数据库
图7提供了五个开源向量数据库的详细比较:Weaviate、Faiss、Chroma、Qdrant和Milvus。
Milvus在评估的数据库中脱颖而出,满足所有基本标准,并且在性能上优于其他开源选项。
检索
对于用户查询,检索模块会根据其相似性从预先构建的语料库中选择与查询最相关的前k个文档。
以下评估三种与检索相关的技术及其组合:
- 查询重写:这种技术改进查询,以更好地匹配相关文档。受Rewrite-Retrieve-Read框架的启发,我们促使LLM重写查询以提高性能。
- 查询分解:此方法根据从原始查询中提取的子问题检索文档。这些子问题通常更复杂,更难理解和处理。
- 伪文档生成:此方法根据用户的查询生成假设文档,并使用假设答案的嵌入来检索类似的文档。一个值得注意的实现是HyDE。
图8显示,监督方法的性能明显优于无监督方法。通过结合HyDE和混合搜索,LLM-Embedder获得了最高分。
因此,建议使用HyDE + 混合搜索作为默认检索方法。混合搜索结合了稀疏检索 (BM25) 和密集检索 (原始嵌入),实现了高性能和相对较低的延迟。
重新排名
初始搜索后,重新排名阶段会增强检索到的文档的相关性,确保最相关的信息显示在列表顶部。考虑了两种主要方法:
- DLM重新排名:此方法使用深度语言模型 (DLM) 进行重新排名。这些模型经过微调,可将文档与查询的相关性分类为“true”或“false”。在微调期间,使用带有相关性注释的查询和文档对模型进行训练。在推理过程中,根据 “true” 标签的概率对文档进行排序。
- TILDE重新排名:TILDE通过预测模型词汇表中每个术语的概率,独立计算每个查询术语的可能性。通过对查询术语的预先计算的对数概率求和来对文档进行评分,从而在推理期间实现快速重新排名。TILDEv2通过仅对文档中存在的术语进行索引、使用NCE损失和扩展文档来改进此方法,从而提高效率并减小索引大小。
图9:MS MARCO Passage排名数据集的开发集上不同重新排名方法的结果。对于每个查询,将对BM25检索到的前1000个候选段落进行重新排序。延迟以每个查询的秒为单位。来源:搜索检索增强生成的最佳实践。
如图9所示,建议使用monoT5作为平衡性能和效率的综合方法。RankLLaMA非常适合那些寻求最佳性能的人,而TILDEv2适合在固定集上快速实验。
重新包装
后续流程(如LLM响应生成)的性能可能会受到文档提供顺序的影响。
为了解决这个问题,我们在重新排名后的工作流程中加入了一个紧凑的重新打包模块,有三种方法:
- “forward”方法:根据重新排序阶段的相关性分数按降序重新打包文档。
- “反向”方法:将它们按升序排列。
- “sides”选项:受Lost in the Middle启发的 “sides” 选项在相关信息位于输入的开头或结尾时表现最佳。
由于这些重新打包的方法主要影响后续模块,因此在下面的综合回顾部分介绍它们的评估。
综述
检索结果可能包含冗余或不必要的信息,这可能会阻止LLM生成准确的响应。此外,较长的提示可能会减慢推理过程。因此,在RAG过程中,汇总检索到的文档的有效方法至关重要。
提取式压缩器将文本分割成句子,根据重要性对它们进行评分和排名。Generative Compressor综合来自多个文档的信息,以重新措辞并生成连贯的摘要。这些任务可以是基于查询的,也可以是非基于查询的。
主要评估三种方法:
- Recomp:它具有提取式和生成式压缩器。提取式压缩器选择有用的句子,而生成式压缩器综合来自多个文档的信息。
- LongLLMLingua:它通过关注与查询相关的关键信息来改进LLMLingua。
- 选择性上下文:它通过识别和删除输入上下文中的冗余信息来提高LLM效率。
如图10所示,建议使用Recomp,因为它的性能非常出色。虽然LongLLMLingua表现不佳,但它在没有经过这些实验数据集训练的情况下表现出更好的泛化能力。因此,我们可以将其视为一种替代方法。
发电机微调
图11显示,用混合相关和随机文档(Mgr)训练的模型在提供黄金文档或混合上下文时表现最佳。
因此,在训练期间混合相关和随机上下文可以增强生成器对无关信息的鲁棒性,同时确保有效使用相关上下文。
综合评价
以前的评估是针对每个模块单独进行的,但现在这些模块被整合在一起以进行综合评估。
图12:寻找最佳RAG实践的结果。正在调查包含在盒装模块中的模块,以确定最佳方法。带下划线的方法表示所选的实现。“Avg”(平均分数)是根据所有任务的Acc、EM和RAG分数计算的,而平均延迟是每个查询的秒数。最佳分数以粗体突出显示。
如图12所示,得出了以下关键见解:
- 查询分类模块:该模块不仅提高了效果和效率,而且将总分从0.428分提高到平均分0.443,并将查询延迟从16.41秒降低到11.58秒。
- 检索模块:虽然 “Hybrid with HyDE” 方法获得了最高的RAG分数0.58,但其计算成本很高,每次查询需要11.71秒。因此,建议使用 “Hybrid” 或 “Original” 方法,因为它们可以减少延迟,同时保持可比的性能。
- 重新排名模块:缺少re-ranking模块会导致性能显著下降。MonoT5获得了最高的平均分,证明了它在提高检索文档的相关性方面的有效性。这表明重新排名在提高生成响应的质量方面发挥着关键作用。
- 重新包装模块:反向配置表现出卓越的性能,RAG得分为0.560。这表明,将更相关的上下文放在更靠近查询位置的位置会产生最佳结果。
- 摘要模块:Recomp表现出卓越的性能,尽管删除摘要模块可以以更低的延迟获得类似的结果。尽管如此,Recomp仍然是首选,因为它解决了生成器的最大长度限制。
我的想法和见解
从这篇论文中,我收集了几个见解:
- 系统组件的重要性:本文强调了RAG系统中每个组件的重要性,例如查询分类、检索、重新排名、文档重新打包、摘要和生成。它表明,在设计复杂系统时,优化单个组件的性能至关重要。
- 模块化设计的重要性:分别优化和测试组件显示了模块化设计在复杂系统中的优势。它允许独立进行更新和优化,从而促进跨各种应用程序的重用和调整,从而提高了可维护性。
- 系统的实验方法:通过在公认的数据集中进行广泛的测试,该论文确保了其结果的可靠性和普遍性。这种系统的实验设计方法为其他研究人员提供了一个很好的例子。
RAG在实际应用中也存在一些挑战:
- 泛化:需要注意的是,上述评估主要基于公共主流数据集,其在其他数据集(如企业私有数据集)上的性能需要进一步评估。
- 覆盖范围:例如,它没有涵盖像ColBERT这样的后期交互模型来重新排序,也没有评估像Graph RAG或RAPTOR这样增强全球理解的技术。期待未来的更新。
- 实时性能:尽管本文考虑了检索和响应的速度,但在实时应用中平衡速度与准确性仍然是一个挑战。
- 多模态数据的集成和处理:有效处理和集成来自不同模态的数据以确保系统的稳定性和有效性是另一个需要解决的技术障碍。
结论
总体而言,推荐了两种不同的RAG系统实施策略:
- 最佳性能实践:为了获得最佳性能,包括查询分类模块,使用 “Hybrid with HyDE” 方法进行检索,采用monoT5进行重新排序,选择 “Reverse” 进行重新打包,并使用Recomp进行汇总。
- 平衡效率实践:为了平衡性能和效率,包括查询分类模块,实施Hybrid方法进行检索,使用TILDEv2进行重新排名,选择 “Reverse” 进行重新打包,并使用Recomp进行汇总。
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。