AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


RAG性能优化终极指南
发布日期:2024-04-07 17:58:45 浏览次数: 3358


今天和大家分享一篇来自Medium博主Luv Bansal的文章


本文讨论了优化检索增强生成(RAG)流程的各种技术,主要基于一篇名为“Retrieval-Augmented Generation for Large Language Models: A Survey”的研究论文(中译版,小瑞这里也有哦~“读论文:大模型的 RAG 调查”)。文章将RAG流程分为预检索、检索和后检索三个阶段,分别讨论在不同的阶段可以采用哪些优化技术和技术组合来实现RAG性能的提升。


原文连接小瑞已经放在文末了,有需要的小伙伴可以拉到底自取~


首先,进入正文前,我们先来看看下图,了解一下RAG系统在实现时,主要面临的挑战有哪些。


RAG系统实现的7个失败点


本文讨论了如何通过将RAG流程分成三个阶段分别进行优化,来应对这些挑战以及提升RAG系统的性能。



01.

RAG工作流分解


为加深对RAG的理解,我们首先将RAG工作流程分解为三个部分,并优化这些部分中的每一个以提高总体性能。

预检索

在预检索步骤中,需要准备和拆分超出LLM(大型语言模型,Large Language Model)原始训练数据集之外的新数据,也称为外部数据,然后使用将数据转换为数值表示的嵌入模型对这些数据块进行索引,并将其存储在向量数据库中。这个过程创建了一个LLM可以理解的知识库。


预检索流程示意图


检索

在最重要的检索步骤中,用户查询被转换为称为嵌入(Embedding)的向量表示,并使用向量数据库中的余弦相似度找到相关的块。并且试图从向量存储(Vector Store)中找到高度相关的文档块。


后检索

然后,RAG模型通过在上下文中添加相关的检索数据(查询+上下文)来增强用户输入(或提示)。这一步通过使用提示工程技术实现与LLM的有效沟通。增强的提示允许LLM使用给定的上下文准确地生成对用户查询的回答。


检索和后检索流程示意图


目标

做这种拆分的目的是通过对不同部分应用各种技术来增强RAG工作流程的每个组成部分。




02.

预检索优化


预检索技术包括提高索引数据的质量和块优化。这一步也可以称为增强语义表示(Enhancing Semantic Representations)


数据粒度增强

提高数据质量 ——(如果输入的是垃圾,那么输出的也是垃圾)

数据清洗在RAG框架中至关重要。数据清洗和数据组织得好不好直接影响了RAG解决方案的性能。数据清洗要移除不必要的信息,包括特殊字符、不需要的元数据和文本。

  • 移除不相关的文本/文档:删除所有不需要LLM回答的不相关文档。同时移除噪声数据,这包括移除特殊字符、停用词(英文里面常见包括“the”和“a”)和HTML标签。

  • 识别并纠正错误:这包括错别字、语法错误等。

  • 在分割的块中用实际名字替换代词可以在检索过程中增强语义意义。



添加元数据

添加元数据,如概念和级别标记,以提高索引数据的质量。


添加元数据信息包括将引用的元数据(如日期和目的)整合到块中用于过滤,并纳入诸如参考文献的章节和小节等元数据以提高检索效率。


以下是元数据有用的一些场景:

  • 如果您在搜索内容时,时效性是一个标准,您可以通过日期元数据进行排序。

  • 如果您在搜索科学论文时提前知道你正在寻找的信息总是位于特定部分,例如实验部分,您可以将文章部分作为每个块的元数据,并对其进行过滤,以便仅匹配实验。



元数据之所以有用,是因为它在向量搜索的基础上增加了一个额外的结构化搜索层。


优化索引结构

  • 知识图谱或图神经网络索引

    通过利用图数据索引中节点之间的关系,结合图结构中的信息来捕捉相关上下文。

  • 向量索引


分块优化


选择正确的块大小非常关键,它会通过多种方式影响RAG系统的效率和准确性:

相关性和粒度

一个较小的块大小,如128,会产生更细粒度的块。然而,这种细粒度也存在风险:如果similarity_top_k设置限制性很强,比如2,则关键信息可能不会出现在顶部检索的块中。相反,512的块大小很可能包含所有必要信息在顶部的块中,确保查询的答案可以轻松获得。

响应生成时间

随着块大小的变大,导入LLM以生成答案的信息量也会增加。虽然这可以确保一个更全面的上下文,但它也可能会减慢系统的速度。

挑战

如果块太小,则可能不能完全包含LLM需要回答用户查询的信息;如果块太大,则可能包含太多无关信息,会使LLM混淆,或者可能太大而无法适应上下文大小。

任务特定的分块

根据下游任务,需要确定块的最佳长度以及每个块之间希望有多少重叠。


高层次的任务,如摘要,需要较大的块大小;而低层次的任务,如编码,则需要较小的块。


分块技术

Small2big或父文档检索

ParentDocumentRetriever通过分割和存储小块数据来达到这种平衡。在检索过程中,它首先获取小块数据,然后查找这些块的父ID,并将这些较大的文档返回给LLM。


它在初始搜索阶段利用小文本块,随后向LLM提供更大的相关文本块进行处理。


递归检索(Recursive Retrieval)涉及在初始检索阶段获取较小的块,以捕获关键语义含义。随后,在过程的后期阶段,向LLM提供包含更多上下文信息的较大块。这种两步检索方法有助于在效率和提供富有上下文的响应之间找到平衡。


步骤如下:

  1. 第一步涉及将原始的大型文档拆分成更小、更易管理的单元,这些小单元被称为子文档(Child Document),以及被称为父文档(Parent Ducument)的较大块。

  2. 第二步专注于为每个子文档创建Embedding,这些Embedding比整个父块的Embedding更丰富、更详细。这一步可以帮助框架识别包含与用户查询相关信息的最相关子文档。

  3. 一旦与子文档对齐之后,则开始检索与该子文档相关联的整个父文档。在最后显示的图像中,最终检索到了父块。

  4. 检索父文档非常重要,因为它为理解和响应用户的查询提供了更广阔的上下文。框架现在不仅仅依赖子文档的内容,还可以访问整个父文档



Small2big或父文档检索分块技术


句子窗口检索

这种分块技术与上述技术非常相似。句子窗口(Sentence Window)检索背后的核心思想是根据查询从自定义知识库中选择性地获取上下文,然后利用这些上下文的更广泛版本进行更强大的文本生成


这个过程涉及嵌入一个有限的句子集进行检索,这些句子周围的额外上下文,称为“窗口上下文”,被单独存储并与它们链接。一旦识别出最相似的句子,这些上下文就在这些句子发送给LLM进行生成之前重新整合,从而丰富了整体的上下文理解。


句子窗口工作流程示意图


句子窗口检索分块技术在RAG中的应用



03.

检索优化


这是RAG工作流程中最重要的部分,包括基于用户查询从向量存储中检索文档。这一步骤也可以称为对齐查询和文档。


查询重写

查询重写是对齐查询和文档语义的基本方法。


这个过程利用LLM的能力来重新表述用户的查询并再次尝试。值得注意的是,对人类来说看起来可能相同的两个问题,在嵌入空间中可能并不相似。


多查询检索器 MultiQuery Retriever

多查询检索方法利用LLM从不同的视角为给定的用户输入查询生成多个查询,这对于解决具有多个子问题的复杂问题非常有用。


对于每个查询,它检索一组相关文档,并取所有查询的唯一并集,以获得更大的潜在相关文档集合。


通过从同一个问题的多个视角生成查询,多查询检索器能够克服基于距离的检索的一些限制,并获得更丰富的结果集。


多查询检索器工作原理


Hyde或Query2doc

Hyde和Query2doc都是查询重写优化方法,二者很类似。鉴于搜索查询通常都很短、模糊或缺乏必要的背景信息,LLM可以提供相关信息来指导检索系统,因为它们通过在数万亿个Token上进行预训练,记住了大量的知识和语言模式。



标准模式和HyDE之间的比较


图片来源:https://arxiv.org/pdf/2212.10496.pdf


StepBack-prompt方法

StepBack-prompt方法鼓励语言模型超越特定示例,专注于更广泛的概念和原则。


这个模板复制了“后退一步”提示技术,通过首先提出一个“后退一步”的问题来提高对复杂问题的性能。这种技术可以与标准的问题回答RAG应用相结合,通过检索原始问题和后退一步问题的信息。以下是一个“后退一步”提示的示例。


图片来源:https://arxiv.org/pdf/2310.06117.pdf


微调嵌入

微调嵌入模型显著影响RAG系统中检索内容的相关性。这个过程涉及定制嵌入模型,以增强特定领域背景下的检索相关性,特别是对于处理不断演变或罕见术语的专业领域。


生成用于训练和评估的合成数据集

这里的关键思想是,可以使用像GPT-3.5-turbo这样的语言模型生成用于微调的训练数据,以便基于文档块提出问题。这允许我们以一种可扩展的方式生成合成的正向对(查询,相关文档),而无需人工标注者。最终的数据集将是问题和文本块的对。


微调嵌入模型

在生成的训练数据集上微调任何嵌入模型。

使用GPT生成的合成数据集对嵌入模型进行微调

混合搜索探索

RAG系统通过智能集成各种技术,包括关键词搜索、语义搜索和向量搜索,来优化其性能。


这种方法利用每种方法的独特优势,以适应多样化的查询类型和信息需求,确保一致地检索到高度相关且富含上下文的信息。混合搜索的使用作为检索策略的有力补充,增强了RAG流水线的整体效果。


常见示例

最常见的模式是将稀疏检索器(如BM25)与密集检索器(如嵌入相似度)结合起来,实现优势互补。这也被称为“混合搜索”。稀疏检索器擅长根据关键词找到相关文档,而密集检索器擅长基于语义相似性找到相关文档。


混合搜索流程示意图



04.

后检索优化


重排

在将检索结果发送给LLM之前对其进行重排能够显著提高RAG的性能。向量相似度搜索中的高分并不总是意味着它将拥有最高的相关性。


重排的核心概念涉及重新排列文档记录,以优先考虑最相关的项目放在最顶部,从而限制文档的总数。这不仅解决了检索过程中上下文窗口扩展的挑战,还提高了检索效率和响应性。


在查询引擎中增加similarity_top_k以检索更多的上下文段落,这些可以在重排后减少到top_n。


使用Cohere重排器对检索到的文档进行重排


提示压缩

检索到的文档中的噪声会影响RAG性能,与查询最相关的信息可能被埋藏在包含了大量无关文本的文档中。在这种场景下,将整个文档通过应用传递可能会导致更昂贵的LLM调用和低效的响应。


解决此类问题的重点在于压缩无关上下文,突出关键段落,并减少总体上下文长度

上下文压缩

上下文压缩旨在解决这个问题。其思想很简单:不是立即按原样返回检索到的文档,而是可以使用给定查询的上下文对其进行压缩,这样只返回相关信息。“压缩”在这里指的是压缩个别文档的内容以及批量过滤出文档。


上下文压缩示意图


Doc Compressor是一个小型语言模型,用于计算用户查询和检索到的文档之间的提示互信息,估算元素的重要性。



05.

检索优化模块化RAG


模块化RAG整合了多种方法来增强RAG的不同组成部分,例如引入一个用于相似性检索的搜索模块,并在检索器中应用微调方法。

RAG融合

RAG融合结合了两种方法:

  • 多查询检索

    利用LLM生成来自不同视角的多个查询,针对给定的用户输入查询,这对于解决具有多个子问题的复杂问题非常有利。

  • 对检索到的文档进行重排

    重新排列所有检索到的文档,并移除所有相关性得分低的文档。


图片来源:https://arxiv.org/pdf/2402.03367.pdf


这种高级技术保证了,无论意图是否明显,搜索结果都符合用户的意图。它可以帮助用户找到更有洞察力和更相关的信息。



文末思考


本文讨论了优化RAG管道每个部分的各种技术,并增强整体RAG管道的技术。大家可以在RAG管道中使用这些技术中的一种或多种,使其更准确、更高效。希望这些技术可以帮助大家在应用中构建一个更好的RAG管道。








原文连接:

https://luv-bansal.medium.com/advance-rag-improve-rag-performance-208ffad5bb6a





53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询