LLM之RAG理论(十四)| RAG 最佳实践

news2025/4/24 19:53:18

       RAG 的过程很复杂,包含许多组成部分。我们如何确定现有的 RAG 方法及其最佳组合,以确定最佳 RAG 实践?

      论文 《Searching for Best Practices in Retrieval-Augmented Generation》给出了回答。

本文将从以下三方面进行介绍:

  • 首先,介绍经典的 RAG 流程。

  • 然后,介绍RAG 的每个模块的最佳实践。

  • 最后,提供一个全面的评估。

一、经典的RAG流程

经典的 RAG 工作流程一般包括几个中间处理步骤:

  1. 查询分类(确定输入查询是否需要检索)

  2. 检索(高效获取相关文件)

  3. 重新排名(根据相关性优化检索到的文档的顺序)

  4. 重新打包(将检索到的文档组织成结构化格式)

  5. 摘要(提取关键信息以生成响应并消除冗余)

       实现 RAG 还涉及决定如何将文档拆分为块,选择用于语义表示的嵌入,选择合适的向量数据库以进行高效的特征存储,以及寻找有效的微调方法LLMs,如图 1 所示。

图 1:检索增强生成工作流程。每个组件考虑的可选方法以粗体表示,而带下划线的方法表示各个模块的默认选择。以蓝色字体表示的方法表示根据经验确定的性能最佳的选择。

二、每个步骤的最佳实践

2.1 查询分类

       为什么需要查询分类?并非所有查询都需要检索增强,某些LLMs功能也需要检索增强。虽然 RAG 可以提高准确性并减少幻觉,但频繁检索会增加响应时间。因此,我们首先对查询进行分类,以确定是否需要检索。通常,当需要超出模型参数的知识时,建议使用检索。

       我们可以根据任务是否提供足够的信息将任务分为 15 种类型,并显示具体的任务和示例。完全基于用户提供信息的任务被标记为“充分”,不需要检索;否则,它们将被标记为 “不足” ,可能需要检索。

图 2:不同任务的检索要求分类。在未提供信息的情况下,我们会根据模型的功能对任务进行区分

此分类过程是通过训练分类器自动执行的。

图 3:查询分类器的结果

2.2 分块

     将文档划分为较小的块对于提高检索准确性和避免 中的LLM长度问题至关重要。通常有三个级别:

  • Token-level令牌级分块很简单,但可能会拆分句子,从而影响检索质量。

  • Semantic-level语义级分块用于LLM确定断点,保留上下文但需要更多时间。

  • Sentence-level句子级分块在保留文本语义与简洁高效之间取得平衡。

     在这里,句子级分块用于平衡简单性和语义保留。分块过程从以下四个维度进行评估。

2.2.1 分块大小

     块大小会显著影响性能。较大的块提供更多的上下文,增强理解,但会增加处理时间。较小的块可以提高召回率并缩短时间,但可能缺乏足够的上下文。

图 4 :不同数据块大小的比较

     如图 4 所示,使用了两个主要指标:忠实度和相关性。忠实度衡量反应是幻觉还是与检索到的文本相匹配。Relevancy 衡量检索到的文本和响应是否与查询匹配。

块组织

2.3 Embedding模型

      如图 6 所示,LLM-Embedder 获得了与 BAAI/bge-large-en 相当的结果,但大小只有它的三分之一。因此,LLM选择 -Embedder 是为了平衡性能和大小。

图 6:namespace-Pt/msmarco 上不同嵌入模型的结果。

2.4 添加元数据

使用标题、关键字和假设问题等元数据增强块可以提高检索率。

该论文不包括具体的实验,但将它们留给未来的工作。

2.5 向量数据库

     图 7 提供了五个开源向量数据库的详细比较:Weaviate、Faiss、Chroma、Qdrant 和 Milvus。

      Milvus 在评估的数据库中脱颖而出,满足所有基本标准,并且在性能上优于其他开源选项。

图 7:各种矢量数据库的比较。

2.6 检索

       对于用户查询,检索模块会根据其相似性从预先构建的语料库中选择与查询最相关的前 k 个文档。

下面评估了三种与检索相关的技术及其组合:

  • 查询重写 :此技术改进了查询以更好地匹配相关文档。受 Rewrite-Retrieve-Read 框架的启发 ,我们提示LLM重写查询以提高性能。

  • 查询分解:此方法根据从原始查询中提取的子问题检索文档。这些子问题通常更复杂,更难理解和处理。

  • 伪文档生成 :此方法根据用户的查询生成假设文档,并使用假设答案的嵌入来检索类似的文档。一个值得注意的实现是 HyDE。

图 8:TREC DL19/20 上不同检索方法的结果。每种方法的最佳结果都用粗体显示,第二种方法用下划线表示。

     图 8 显示,监督方法的性能明显优于无监督方法。通过将 HyDE 和混合搜索相结合,LLM-Embedder 获得了最高分。

     因此,建议使用 HyDE + 混合搜索作为默认检索方法。混合搜索结合了稀疏检索 (BM25) 和密集检索 (原始嵌入),实现了高性能和相对较低的延迟。

2.7 重排序

       初始搜索后, 重新排名阶段会增强检索到的文档的相关性,确保最相关的信息显示在列表顶部。考虑了两种主要方法:

  • DLM 重排序:此方法使用深度语言模型 (DLM) 进行重新排名。这些模型经过微调,可将文档与查询的相关性分类为“true”或“false”。在微调期间,使用带有相关性注释的查询和文档对模型进行训练。在推理过程中,根据 “true” 标签的概率对文档进行排序。

  • TILDE 重排序:TILDE 通过预测模型词汇中每个词的概率来独立计算每个查询词的可能性。通过将查询词的预计算对数概率相加来对文档进行评分,从而在推理过程中实现快速重新排名。TILDEv2 通过仅对文档中存在的术语进行索引、使用 NCE 损失和扩展文档来改进这一点,从而提高效率并减小索引大小。

图 9:MS MARCO Passage 排名数据集的开发集上不同重新排名方法的结果。对于每个查询,将对 BM25 检索到的前 1000 个候选段落进行重新排序。延迟以每个查询的秒为单位。

       如图 9 所示, 建议使用 monoT5 作为平衡性能和效率的综合方法。 RankLLaMA 非常适合那些寻求最佳性能的人,而 TILDEv2 适合在固定集上快速实验。

2.8 重新包装

       后续流程(如LLM响应生成)的性能可能会受到文档提供顺序的影响。

       为了解决这个问题,我们在重新排名后的工作流程中加入了一个紧凑的重新打包模块,有三种方法:

  • “forward” 方法根据重新排序阶段的相关性分数按降序重新打包文档。

  • “reverse”方法将它们按升序排列。

  • 受 Lost in the Middle 启发的 “sides” 选项在相关信息位于输入的开头或结尾时表现最佳。

     由于这些重新打包的方法主要影响后续模块,因此在下面的 review 部分介绍它们的评估。

三、总结

       检索结果可能包含冗余或不必要的信息,这可能会阻止 生成LLM准确的响应。此外,较长的提示可能会减慢推理过程。因此,在 RAG 过程中,汇总检索到的文档的有效方法至关重要。

       提取式压缩器将文本分割成句子,根据重要性对它们进行评分和排名。Generative Compressor 综合来自多个文档的信息,以重新措辞并生成连贯的摘要。这些任务可以是基于查询的,也可以是非基于查询的。

主要评估三种方法:

  • Recomp: 它具有抽取式和生成式压缩机。提取式压缩器选择有用的句子,而生成式压缩器则综合来自多个文档的信息。

  • LongLLMLingua:它通过关注与查询相关的关键信息来改进 LLMLingua。

  • 选择性上下文 :它通过识别和删除输入上下文中的冗余信息来提高效率 LLM。

图 10:不同摘要方法之间的比较。

     如图 10 所示, 建议使用 Recomp, 因为它的性能非常出色。虽然 LongLLMLingua 表现不佳,但它在没有经过这些实验数据集训练的情况下表现出更好的泛化能力。因此,我们可以将其视为一种替代方法。

四、生成器微调

       图 11 显示,使用混合相关和随机文档 (Mgr) 训练的模型在提供黄金文档或混合上下文时表现最佳。

       因此, 在训练过程中混合相关和随机上下文可以提高生成器对不相关信息的鲁棒性,同时确保有效使用相关上下文。

图 11:生成器微调的结果。

五、综合评估

     以前的评估是针对每个模块单独进行的,但现在这些模块被整合在一起以进行综合评估。

图 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” 方法,因为它们可以减少延迟,同时保持可比的性能。

  • 重排序模块: 缺少重新排名模块会导致性能显著下降。MonoT5 获得了最高的平均分,证明了它在提高检索文档的相关性方面的有效性。这表明重新排名在提高生成响应的质量方面发挥着关键作用。

  • 重新包装模块: 反向配置表现出卓越的性能,RAG 得分为 0.560。这表明,将更相关的上下文放在更靠近查询位置的位置会产生最佳结果。

  • 摘要模块:Recomp 展示了卓越的性能,尽管删除摘要模块可以以更低的延迟获得类似的结果。尽管如此,Recomp 仍然是首选,因为它解决了生成器的最大长度限制。

六、结论

总体而言,推荐了两种不同的 RAG 系统实施策略:

  • 最佳性能实践:为了获得最佳性能,包括查询分类模块,使用 “Hybrid with HyDE” 方法进行检索,采用 monoT5 进行重新排序,选择 “Reverse” 进行重新打包,并使用 Recomp 进行汇总。

  • 平衡效率实践:为了平衡性能和效率,包括一个查询分类模块,实施 Hybrid 方法进行检索,使用 TILDEv2 进行重新排序,选择 “Reverse” 进行重新打包,并使用 Recomp 进行汇总。

     需要注意的是,上面提到的评估主要基于公共数据集,它在其他数据集(比如私有企业数据集)上的表现需要进一步评估。

本文的主要价值在于它为研究 RAG 最佳实践提供了有价值的想法和方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[RoarCTF 2019]Easy Calc-3.23BUUCTF练习day5(2)

[RoarCTF 2019]Easy Calc-3.23BUUCTF练习day5(2) 解题过程 查看源码 发现calc.php页面,访问一下 分析代码 首先获取$_GET[num]的值并赋给变量$str。然后定义了一个黑名单数组$blacklist,包含了一系列被禁止的字符或转义字符,如空格、制表…

hadoop集群配置-ssh无密登录

1.ssh-keygen -t rsa 2.ssh-copy-id hadoop1 3.ssh roothadoop1 退出 exit

MinGW与使用VScode写C语言适配

压缩包 通过网盘分享的文件:MinGW.zip 链接: https://pan.baidu.com/s/1QB-Zkuk2lCIZuVSHc-5T6A 提取码: 2c2q 需要下载的插件 1.翻译 找到VScode页面,从上数第4个,点击扩展(以下通此) 搜索---Chinese--点击---安装--o…

openharmony中hilog实证记录说明(3.1和5.0版本)

每次用这个工具hilog都有一些小用法记不清,需要花一些时间去查去分析使用方法,为了给丰富多彩的生活留出更多的时间,所以汇总整理共享来了,它来了它来了~~~~~~~~~ 开始是想通过3.1来汇总的,但实际测试发现openharmony…

算法刷题整理合集(七)·【算法赛】

本篇博客旨在记录自已的算法刷题练习成长,里面注有详细的代码注释以及和个人的思路想法,希望可以给同道之人些许帮助。本人也是算法小白,水平有限,如果文章中有什么错误或遗漏之处,望各位可以在评论区指正出来&#xf…

Android Studio控制台中文乱码解决方案

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 前言: 在项目调试过程中,用华为手机调试控制台没任何问题&#x…

Cherry Studio搭建本地知识库,结合DeepSeek实现RAG

Cherry Studio搭建本地知识库,结合DeepSeek实现RAG CherryStudioCherryStudio 简介环境准备 模型配置本地知识创建1、新建知识库2、添加文件3、添加网址或者网站4、搜索知识库 结合DeepSeek实现RAG1、选择知识库2、进行提问 常见问题与解决方案 CherryStudio Cherr…

【Android】VehiclePropertyAccess引起CarService崩溃

VehiclePropertyAccess引起CarService崩溃 VehiclePropertyAccess VehiclePropertyAccess属性,用于定义车辆属性的访问权限。权限包括 读:READ,只可以读取,不能写入。 VehiclePropertyAccess:READ写:WRITE&#xf…

深度剖析:复制带随机指针的链表算法实现

在链表相关的算法中,复制一个带有随机指针的链表是一个经典且具有一定难度的问题。本文将深入分析一段用C语言实现的复制带随机指针链表的代码,通过模块化的方式详细解释每段代码的作用,帮助读者更好地理解这一复杂算法。 作者主页&#xf…

Java 大视界 -- Java 大数据在智慧文旅旅游目的地营销与品牌传播中的应用(150)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

SQLMesh SCD-2 时间维度实战:餐饮菜单价格演化追踪

场景背景:动态菜单价格管理 考虑某连锁餐厅的菜单管理系统,需要记录食品价格的历史变更轨迹。业务需求包括: 记录每次价格调整的时间点支持历史价格查询(如"2020年1月2日汉堡多少钱")维护当前有效价格清单…

uniapp自身bug | uniapp+vue3打包后 index.html无法直接运行

前提: 已经修改了基础路径 打开打包文件,双击运行index.html报错,无法访问页面 uniappvue2项目是可以正常运行的 vue3修改publicPath: ./后,也是可以正常访问打包文件中的index.html 点进控制台提供的链接:https:/…

数据分析面试--京东

1.考察日期函数的应用 select Order_date, count(distinct user_id) as uv from (select user_id, Order_date, row_number() over(partition by user_id order by Order_date) as new_tagfrom ord where date_diff(current_date(), Order_date)<30 ) t where new_tag1 gro…

Centos7搭建Zabbix4.x监控HCL模拟网络设备:zabbix-server搭建及监控基础04

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 4.OID查看工具Getif安装及使用 找度娘下载Getif&#xff0c;该软件比较老&#xff0c;可以用来查看OID编码&#xff0c;我的宿主机是Win11,无法安装。所以只有到虚拟机win12去安装&am…

蓝桥杯2023年第十四届省赛真题-异或和之差

题目来自DOTCPP&#xff1a; 思路&#xff1a; 什么是异或和&#xff1f; ①题目要求我们选择两个不相交的子段&#xff0c;我们可以枚举一个分界线i&#xff0c;子段1在 i 的左边&#xff0c; 子段2在 i 的右边&#xff0c;分别找到子段1和子段2的最大值、最小值。 ②怎么确…

Linux系统管理实战:文件权限配置、用户组协作与日志处理全解析

1、创建/www目录&#xff0c;在/www目录下新建name和https目录&#xff0c;在name和https目录下分别创建一个index.html文件&#xff0c;name下面的index.html文件中包含当前主机的主机名&#xff0c;https目录下的index.html文件中包含当前主机的ip地址。 &#xff08;1&…

[自动化] 【八爪鱼】使用八爪鱼实现CSDN文章自动阅读脚本

在CSDN上&#xff0c;文章的阅读量往往是衡量内容影响力的一个重要指标。为了测试自动化手段能否提高阅读数&#xff0c;我尝试使用网页自动化工具来模拟人工阅读某个ID的文章。 1. 网页自动化的常见方案 谈到网页自动化&#xff0c;Selenium 是一个最常见的选择。它可以通过…

N列股票收盘价为起点的马科维茨(Markowitz)均值—方差理论

1. 数据准备与收益率计算 输入数据&#xff1a; 假设你有一个矩阵&#xff0c;每一列代表一只股票的历史收盘价序列。每一行对应一个时间点的收盘价。 计算收益率&#xff1a; 马科维茨理论要求使用资产的收益率而非价格。常用的收益率计算方法有对数收益率或简单收益率。 2.…

mac brew 安装的php@7.4 打开redis扩展

1. 找到php7.4的pecl目录 一般在这个位置 cd /usr/local/Cellar/php7.4/7.4.33_8/pecl/20190902 ls 一下 有个 redis.so 于是 直接去php.ini编辑了 php.ini的路径 vim /usr/local/etc/php/7.4/php.ini 把938行添加进去 然后重启一下 php7.4 brew services restart ph…

OSPF多区域通信

作业要求: 1、多区域0SPF area 0、area10、are20 2、AR5、AR6作为stub区&#xff0c;使用环回接口与Pc1进行通信 第一步&#xff1a;为各端口配置IP地址 AR1: <Huawei>sys [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 5.5.5.1 24 [Huawei-GigabitEther…