事实上,在 “RAG方案人手一份” 的大背景下,如果找到一个最佳的实验设置,其实十分重要,虽然说,RAG当前实际上是处于一个实验科学的状态,但也可以看看一些系统性的消融实验。

因此,今天,我们来看看关于RAG的一个实验报告,《Searching for Best Practices in Retrieval-Augmented Generation》,(https://arxiv.org/abs/2407.01219),正如其名字所言,该工作对RAG技术的最佳实践进行了一些组合实验,是个很系统、很棒的工作,大家可以仔细看看

具体地,鉴于测试所有可能的方法组合是不可行的,采用了一个三步方法来确定最佳的RAG实践。

首先,比较每个RAG步骤(或模块)的代表性方法,并选择多达三种表现最佳的方法。

接下来,通过一次测试一个步骤中的一种方法,同时保持其他RAG模块不变,来评估每种方法对整体RAG性能的影响,这样能够基于每种方法在生成回答过程中的贡献和与其他模块的交互来确定每个步骤中最有效的方法。

如下图所示,Figure1展示了检索增强型生成(RAG)的工作流程,并分析了每个组件对整体性能的贡献,其提供了一个全面的RAG方法概览,并指出了在实现RAG系统时需要考虑的关键组件和决策点。

供大家一起参考并思考。

1、文档分块、向量化及存储模块选择策略

这块主要包括分块(Chunking)的选择策略、嵌入(Embedding)的选择策略、向量数据库(Vector Database)的选择策略三部分。

1)分块(Chunking)的选择策略

将文档分割成更小的段,以提高检索精度并避免LLMs的长度问题。包括分块大小、分块技术和元数据添加;

将文档分块成较小的段落对于提高检索精度和避免LLMs的长度问题至关重要。这一过程可以应用于不同粒度级别,例如词元、句子和语义级别。

词元级分块Token-level Chunking,是直接的,但可能会分割句子,影响检索质量。

语义级分块Semantic-level Chunking使用LLMs来确定断点,保留了上下文,但耗时较长。

句子级分块Sentence-level Chunking在保留文本语义和简单效率之间取得平衡。

其中,分块大小显著影响性能。较大的分块提供更多上下文,增强了理解,但增加了处理时间。较小的分块提高了检索召回率并减少了时间,但可能缺乏足够的上下文。

找到最佳的分块大小涉及到一些指标之间的平衡,例如忠实度和相关性,结果如下:

而在分块策略上,有些结论:

小到大(small-to-big)和滑动窗口(sliding window)等技术通过保持上下文并确保检索到相关信息来提高检索质量

此外,其发现,向chunku中添加元数据,如标题、关键词和假设性问题,可以提高检索效果,提供更多的检索后文本处理方式,并帮助大型语言模型更好地理解检索到的信息。

最终选择sentence-level chunking方案。

2)嵌入(Embedding)的选择策略

使用不同类型的嵌入模型来语义化地表示文档块;

选择合适的嵌入模型对于有效地进行查询和块之间的语义匹配至关重要。因此,使用了FlagEmbedding的评估模块,该模块采用namespace-Pt/msmarco作为查询的语料库,以及namespace-Pt/msmarco-corpus作为文档的语料库,以选择适当的开源嵌入模型。

最终选择LLM-Embedder作为向量化模型

3)向量数据库(Vector Database)的选择策略

用于高效存储特征表示,以便检索文档。包括Milvus、Faiss、Weaviate等数据库;

几个向量化的对比如下:

最终选择:Milvus作为向量化数据库

2、查询与检索选择策略

这块主要包括查询分类(Query Classification)的策略、检索(Retrieval)策略、重排(Reranking)策略三个部分。

1)查询分类(Query Classification)的策略

确定是否需要对给定的输入查询进行检索。如果需要,查询将通过RAG模块;否则,直接由大型语言模型(LLMs)处理;

根据任务类型对任务进行分类,以确定查询是否需要检索,具体地,根据是否提供足够的信息将15个任务进行分类,具体的任务和示例如图2所示。

对于完全基于用户给定信息的任务,称之为“足够”“sufficient”,不需要检索;

否则,称之为“不足”“insufficient”,可能需要检索,最终训练了一个分类器来自动化这一决策过程。

这个模块对提高效率和效果均有贡献,将整体得分从0.428提高到0.443,并将每个查询的延迟时间从16.58秒减少到11.71秒;

2)检索(Retrieval)策略

高效获取与查询相关的文档。包括原始查询、查询重写、查询分解等方法,以及使用不同的嵌入模型(如LLM-Embedder);

查询重写,通过改善查询以更好地匹配相关文档来优化性能,提示一个大型语言模型重写查询以提高性能。

查询分解,根据原始查询派生的子问题来检索文档,这在理解和处理上更为复杂。

伪文档生成,基于用户查询生成一个假想文档,并使用假想答案的嵌入来检索相似文档。一个值得注意的实现方式是HyDE。

在TRECDL 2019和2020的段落排名数据集上评估了不同搜索方法的性能。

表6中展示的结果表明,监督方法显著优于非监督方法。结合HyDE和混合搜索,LLM-Embedder实现了最高分。然而,查询重写和查询分解并没有像预期那样有效提升检索性能。

考虑到最佳性能和可接受的延迟,推荐使用HyDE作为默认的检索方法。从效率角度考虑,混合搜索结合了稀疏检索(BM25)和密集检索(原始嵌入),在相对较低的延迟下取得了显著的性能。

表7展示了使用HyDE时,假设文档和查询的不同连接策略对检索性能的影响。将多个伪文档与原始查询连接可以显著提高检索性能,但代价是增加了延迟,这表明了检索效果和效率之间的权衡。然而,不加选择地增加伪文档的数量并不会带来显著的好处,并且会大幅提高延迟,这表明使用单一的伪文档就足够了。

但这有一个实验,那就是混合搜索的权重分配问题,即调整稀疏检索权重的混合搜索

在混合搜索中使用不同α值的影响,其中α控制着稀疏检索和密集检索部分之间的权重。相关性得分的计算方式如下:

两个参数分别是来自稀疏检索和密集检索的归一化相关性得分,通过评估五种不同的α值来确定它们对性能的影响。

表8的结果表明,α值为0.3时可以获得最佳性能,这表明适当调整α可以在一定程度上提高检索效果

此外,虽然“Hybrid with HyDE”方法达到了最高的RAG得分0.580,但这是在相当大的计算成本下实现的,每个查询需要11.71秒。因此,推荐使用“Hybrid”或“Original”方法,它们可以在保持相似性能的同时减少延迟;

3)重排(Reranking)策略

基于与查询的相关性,对检索到的文档进行重新排序。使用的方法包括DLM(深度语言模型)基础和TILDE等,确保最相关的信息出现在列表的顶部。这一阶段使用更精确但耗时的方法来有效地重新排序文档,增加了查询和排名最靠前的文档之间的相似性。

考虑了两种方法:DLM重排,利用分类来实现;以及TILDE重排,它专注于查询可能性。这些方法分别优先考虑性能和效率。

其中:

DLM重排:利用深度语言模型(DLMs)进行重排。重拍的模型是微调过的,以将文档与查询的相关性分类为“真”或“假”。在微调过程中,模型被训练以将查询和文档输入连接起来,并按相关性进行标记。在推理过程中,文档根据“真”标记的概率进行排名。

TILDE重排: 通过预测模型词汇表中每个查询词元的概率来独立计算每个查询词元的可能性。文档通过将查询词元的预先计算好的对数概率相加来评分,允许在推理时快速重排。TILDEv2通过仅对文档中出现的词元进行索引、使用NCE损失,并扩展文档来提高效率并减少索引大小。

在试验上,在MS MARCO段落排名数据集上进行实验,遵循并修改了PyGaggle和TILDE提供的实现,使用了monoT5、monoBERT、RankLLaMA和TILDEv2模型,重排结果如表9所示。

结论:推荐使用monoT5作为一个全面的方法,它在性能和效率之间取得了平衡。RankLLaMA适合于实现最佳性能,而TILDEv2则是在固定集合上获得最快速体验的理想选择。

3、文档组装与摘要选择策略

这块主要包括重新打包(Repacking)策略、摘要(Summarization)策略两个部分

1)重新打包(Repacking)策略

文档重新打包是RAG工作流程中的一个环节,位于重排阶段之后。重新打包模块的目的是优化文档的顺序,以提高后续处理步骤,如LLM响应生成的性能。文档的排列顺序可能会影响模型生成回答的准确性和效率。

将检索到的文档组织成结构化的形式,以便更好地生成回答。文档重新打包是RAG工作流程中的一个环节,位于重排阶段之后。重新打包模块的目的是优化文档的顺序,以提高后续处理步骤,如LLM响应生成的性能。文档的排列顺序可能会影响模型生成回答的准确性和效率。

重新打包模块包括三种方法:“正向”“forward”、“反向”“reverse”和“两侧” “sides”。“正向”方法按照从高到低的相关性得分重新打包文档,而“反向”方法则按照从低到高的相关性得分进行排列。

lost in middle工作发现当相关信息被放置在输入的头部或尾部时,可以获得最佳性能,在“两侧”方法中,最相关的信息被放置在输入的开始和结束部分

所以,该方案使用“两侧”“sides”方案。

2)摘要(Summarization)策略

检索结果可能包含冗余或不必要的信息,这可能会阻碍大型语言模型生成准确回答。此外,长的提示可能会减慢推理过程。因此,在RAG流程中,采用有效的方法对检索到的文档进行摘要至关重要。

因此,其从重新打包的文档中提取关键信息,用于生成回答,并消除冗余。包括抽取式和抽象式摘要方法;

抽取式方法将文本分割成句子,然后根据重要性进行评分和排序。抽象式压缩器则从多个文档中合成信息,重新表述并生成一个连贯的摘要。这些任务可以是基于查询的或非基于查询的。

由于RAG检索与查询相关的信息,只专注于基于查询的方法。包括:

Recomp: 具有抽取式和抽象式压缩器。抽取式压缩器选择有用的句子,而抽象式压缩器从多个文档中合成信息。

LongLLMLingua: LongLLMLingua通过专注于与查询相关的主要信息,改进了LLMLingua;

选择性上下文(Selective Context): 选择性上下文通过识别和移除输入上下文中的冗余信息,增强了LLM的效率,使用基础语言模型计算的自信息来评估词汇单元的信息量。

在模型选择上,在三个基准数据集NQ、TriviaQA和HotpotQA上进行了评估,不同摘要方法的比较结果如表10所示。

结论是:推荐Recomp。LongLLMLingua表现不佳,但显示出更好的泛化能力,因为它没有在这些实验数据集上训练过。Recomp表现出更优的性能,尽管通过去除摘要模块可以在保持结果可比的情况下实现更低延迟。

然而,Recomp由于其解决生成器最大长度限制的能力而仍然是首选。在时间敏感的应用中,去除摘要可以有效地减少响应时间。

4、生成部分的微调与评估策略

这块主要包括微调(Fine-tune)的选择策略、评估(Evaluation)选择策略两个部分。

1)微调(Fine-tune)的选择策略

在RAG框架内对检索器和生成器进行微调,以优化两者的性能;

用x表示输入到RAG系统的查询,D表示该输入的上下文。生成器的微调损失是真实输出y的负对数似然。

为了探索微调的影响,尤其是相关和不相关的上下文,定义dgold为与查询相关的上下文,drandom为随机检索的上下文,可以通过改变D的组成来训练模型,如下所示:

Dg:增强上下文由与查询相关的文档组成,表示为Dg = {dgold};

Dr:上下文包含一个随机采样的文档,表示为Dr = {drandom};

Dgr:增强上下文包括一个相关文档和一个随机选择的文档,表示为Dgr = {dgold, drandom};

Dgg:增强上下文由两份查询相关的文档组成,表示为Dgg = {dgold, dgold}。

用Mb表示未微调的基础语言模型生成器,用Mg、Mr、Mgr、Mgg表示在相应D下微调的模型,在几个QA和阅读理解数据集上微调了模型。

图3展示了主要结果。

在训练中使用混合相关和随机文档(Mgr)的模型在提供金或混合上下文时表现最佳。这表明在训练期间混合相关和随机上下文可以增强生成器对不相关信息的鲁棒性,同时确保有效利用相关上下文

因此,最终在训练期间增加一些相关和随机选择的文档作为最佳实践。

2)评估(Evaluation)选择策略

评估RAG系统在通用性能、特定领域和检索能力方面的表现;

重点的,可以使用RAGAs推荐的指标来评估RAG能力,在从这些数据集(Commonsense Reasoning、Fact Checking、Open-Domain QA、 MultiHop QA、Medical QA中提取的子集上的表现,包括忠实度、上下文相关性、答案相关性和答案正确性。

总结

该工作建议两种不同的实施RAG系统的方法或实践,每种都针对特定的要求进行了定制:一种侧重于最大化性能,另一种则在效率和效果之间取得平衡。

1、最佳性能实践

为了实现最高性能,建议加入查询分类模块,使用“Hybrid with HyDE”方法进行检索,使用monoT5进行重排,选择Reverse进行重新打包,并利用Recomp进行摘要。

这种配置虽然计算量大,但平均得分最高。

2、平衡效率实践

为了在性能和效率之间取得平衡,建议加入查询分类模块,实施Hybrid方法进行检索,使用TILDEv2进行重排,选择Reverse进行重新打包,并使用Recomp进行摘要。

鉴于检索模块占据了系统处理时间的大部分,通过转换到Hybrid方法,同时保持其他模块不变,可以大幅降低延迟,同时保持相当的性能。

总结

在"RAG方案人手一份"的大背景下,如果找到一个最佳的实验设置,其实十分重要,虽然说,RAG当前实际上是处于一个实验科学的状态,但也可以看看一些系统性的消融实验。

那么,如何系统的去学习大模型LLM?

作为一名深耕行业的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。

所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。

由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
在这里插入图片描述

👉大模型学习指南+路线汇总👈

我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
在这里插入图片描述
在这里插入图片描述

👉①.基础篇👈

基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
在这里插入图片描述

👉②.进阶篇👈

接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
在这里插入图片描述

👉③.实战篇👈

实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
在这里插入图片描述

👉④.福利篇👈

最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
在这里插入图片描述
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐