RAG 流程复杂,涉及众多部分。如何确定现有的 RAG 方法及其最佳组合,以确定最佳 RAG 实践?
本文介绍了一项新研究,题为“寻找检索增强生成的最佳实践”。这项研究旨在解决这个问题。
本文主要分为四个部分,首先介绍典型的 RAG 流程,然后介绍每个 RAG 模块的最佳实践,最后进行综合评估,最后分享我的想法和见解,最后进行总结。
典型的 RAG 工作流程
典型的 RAG 工作流程包括几个中间处理步骤:
实现 RAG 还涉及决定如何将文档分成块、选择使用哪些嵌入进行语义表示、选择合适的向量数据库进行高效的特征存储,以及找到微调 LLM 的有效方法,如图 1 所示。
每个步骤的最佳实践
查询分类
为什么需要查询分类?并非所有查询都需要检索增强,因为 LLM 具有某些功能。虽然 RAG 可以提高准确性并减少幻觉,但频繁检索会增加响应时间。因此,我们首先对查询进行分类,以确定是否需要检索。通常,当需要超出模型参数的知识时,建议进行检索。
我们可以根据任务是否提供足够的信息将任务分为 15 种类型,并展示特定的任务和示例。完全基于用户提供的信息的任务被标记为“足够”,不需要检索;否则,它们被标记为“不充分”,可能需要检索。
该分类过程通过训练分类器实现自动化。
分块
将文档分成较小的块对于提高检索准确性和避免 LLM 中的长度问题至关重要。通常有三个级别:
- 标记级分块很简单,但可能会分裂句子,从而影响检索质量。
- 语义级分块使用 LLM 来确定断点,保留上下文但需要更多时间。
- 句子级分块在保留文本语义与简洁高效之间取得平衡。
这里采用句子级分块来平衡简单性和语义保留。分块过程从以下四个维度进行评估。
区块大小
块大小会显著影响性能。较大的块会提供更多背景信息,增强理解力,但会增加处理时间。较小的块会提高回忆率并减少时间,但可能缺乏足够的背景信息。
如图 4 所示,使用了两个主要指标:忠实度和相关性。忠实度衡量响应是否具有幻觉性或与检索到的文本相匹配。相关性衡量检索到的文本和响应是否与查询相匹配。
块的组织
结果如图5所示,较小的chunk size为175个token,较大的chunk size为512个token,块重叠为20个token。
嵌入模型选择
如图 6 所示,LLM-Embedder取得了与 BAAI/bge-large-en 相当的结果,但大小只有 BAAI/bge-large-en 的三分之一。因此,选择 LLM-Embedder 来平衡性能和大小。
元数据添加
使用标题、关键词和假设问题等元数据来增强块体可以改善检索。
本文没有包括具体的实验,而是将其留待未来的工作。
矢量数据库
图7详细比较了Weaviate、Faiss、Chroma、Qdrant、Milvus五个开源矢量数据库。
Milvus 在评估的数据库中脱颖而出,满足所有基本标准,并且在性能上优于其他开源选项。
检索
对于用户查询,检索模块根据相似度从预先构建的语料库中选择与查询最相关的前 k 个文档。
下面评估三种与检索相关的技术及其组合:
- 查询重写:此技术可改进查询以更好地匹配相关文档。受重写-检索-读取框架的启发,我们促使 LLM 重写查询以提高性能。
- 查询分解:此方法根据从原始查询中提取的子问题来检索文档。这些子问题通常更复杂,难以理解和处理。
- 伪文档生成:此方法根据用户的查询生成假设文档,并使用假设答案的嵌入来检索类似文档。一个值得注意的实现是HyDE。
图 8 显示,监督方法明显优于无监督方法。通过结合 HyDE 和混合搜索,LLM-Embedder获得了最高分。
因此建议使用 HyDE + 混合搜索作为默认检索方式,混合搜索结合了稀疏检索(BM25)和密集检索(原始嵌入),以相对较低的延迟实现高性能。
重新排序
初始搜索后,重新排序阶段会增强检索到的文档的相关性,确保最相关的信息出现在列表顶部。主要有两种方法:
- DLM 重新排序:此方法使用深度语言模型 (DLM) 进行重新排序。这些模型经过微调,将文档与查询的相关性分类为“真”或“假”。在微调过程中,使用注释了相关性的查询和文档对模型进行训练。在推理过程中,根据“真”标签的概率对文档进行排序。
- TILDE 重新排序:TILDE 通过预测模型词汇表中每个词的概率来独立计算每个查询词的可能性。通过对查询词的预先计算的对数概率求和来对文档进行评分,从而在推理过程中实现快速重新排序。TILDEv2 通过仅索引文档中存在的词、使用 NCE 损失和扩展文档来改进这一点,从而提高效率并减少索引大小。
如图9所示,作为性能与效率综合平衡的方法,建议使用monoT5,对于追求最优性能的同学, RankLLaMA是理想的选择,而TILDEv2适合在固定集合上快速实验。
重新包装
后续流程(例如 LLM 响应生成)的性能可能会受到提供文件的顺序的影响。
为了解决这个问题,我们在重新排序后的工作流程中加入了紧凑的重新打包模块,包含三种方法:
- “前向”方法根据重新排序阶段的相关性得分,按降序重新打包文档。
- “反向”方法按升序排列它们。
- 受到《迷失在中间》启发的“sides”选项在相关信息位于输入的开头或结尾时表现最佳。
由于这些重新打包方法主要影响后续模块,因此在下面的综合回顾部分中介绍了它们的评估。
总结
检索结果可能包含冗余或不必要的信息,这会妨碍 LLM 生成准确的响应。此外,较长的提示可能会减慢推理过程。因此,在 RAG 过程中,有效的方法来总结检索到的文档至关重要。
提取式压缩器将文本分割成句子,并根据重要性对其进行评分和排序。生成式压缩器综合来自多个文档的信息以重新表述并生成连贯的摘要。这些任务可以是基于查询的,也可以是非基于查询的。
主要评估三种方法:
- Recomp:它具有提取和生成压缩器的功能。提取压缩器选择有用的句子,而生成压缩器则从多个文档中合成信息。
- LongLLMLingua:它通过关注与查询相关的关键信息来改进LLMLingua。
- 选择性上下文:通过识别和删除输入上下文中的冗余信息来提高 LLM 效率。
如图 10 所示,建议使用 Recomp,因为它的表现非常出色。虽然 LongLLMLingua 表现不佳,但它在没有在这些实验数据集上进行训练的情况下表现出了更好的泛化能力。因此,我们可以将其视为一种替代方法。
发电机微调
图 11 显示,使用混合相关和随机文档 (Mgr) 训练的模型在提供黄金文档或混合上下文时表现最佳。
因此,在训练过程中混合相关和随机上下文可以增强生成器对不相关信息的鲁棒性,同时确保有效利用相关上下文。
综合评价
以前的评估是针对每个模块单独进行的,但现在将这些模块整合在一起进行综合评估。
如图 12 所示,得出以下关键见解:
- 查询分类模块:该模块不仅提高了有效性和效率,还将总体得分从0.428提高到平均0.443,并将查询延迟从16.41秒降低到11.58秒。
- 检索模块:虽然“Hybrid with HyDE”方法获得了最高的 RAG 分数 0.58,但其计算成本较高,每个查询需要 11.71 秒。因此,建议使用“Hybrid”或“Original”方法,因为它们可以减少延迟,同时保持相当的性能。
- 重新排序模块:缺少重新排序模块会导致性能大幅下降。MonoT5 取得了最高平均分,证明了其在增强检索文档相关性方面的有效性。这表明重新排序在提高生成响应的质量方面发挥着至关重要的作用。
- 重新打包模块:反向配置表现出色,RAG 得分达到 0.560。这表明将更相关的上下文放在更靠近查询位置的位置会产生最佳结果。
- 汇总模块: Recomp 表现出了卓越的性能,尽管删除汇总模块可以在较低的延迟下实现类似的结果。尽管如此,Recomp 仍然是首选,因为它解决了生成器的最大长度限制。
我的想法和见解
从本文中,我获得了几点见解:
- 系统组件的重要性:本文强调了 RAG 系统中每个组件的重要性——例如查询分类、检索、重新排序、文档重新打包、摘要和生成。它表明,在设计复杂系统时,优化各个组件的性能至关重要。
- 模块化设计的重要性:分别优化和测试组件显示了模块化设计在复杂系统中的优势。它通过允许独立更新和优化来增强可维护性,便于跨各种应用程序重用和调整。
- 系统的实验方法:通过在公认的数据集上进行广泛的测试,本文确保了其结果的可靠性和普遍性。这种系统的实验设计方法为其他研究人员树立了良好的榜样。
RAG 在实际应用中也面临一些挑战
- 概括:需要注意的是,以上评估主要基于公共主流数据集,其在其他数据集(如企业私有数据集)上的表现需要进一步评估。
- 实时性能:尽管本文考虑了检索和响应的速度,但在实时应用中平衡速度和准确性仍然是一个挑战。
- 多模式数据的集成和处理:有效地处理和集成不同模式的数据以确保系统的稳定性和有效性是另一个需要解决的技术障碍。
结论
总体而言,建议采用两种不同的 RAG 系统实施策略:
- 最佳性能实践:为了获得最高性能,包含一个查询分类模块,使用“Hybrid with HyDE”方法进行检索,采用 monoT5 进行重新排名,选择“Reverse”进行重新打包,并利用 Recomp 进行汇总。
- 平衡效率实践:为了平衡性能和效率,包含查询分类模块,实现混合方法进行检索,使用TILDEv2进行重新排序,选择“反向”进行重新打包,并使用Recomp进行摘要。
本文的主要价值在于为研究RAG最佳实践提供了宝贵的思路和方法。
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/4456