AI 文摘

高级RAG-提升RAG性能





作者: 机器AI学习 数据AI挖掘 来源: 机器AI学习 数据AI挖掘

在我上一篇博客中,我详细讨论了RAG(检索增强生成)以及它是如何与LlamaIndex一起实现的。然而,RAG在回答问题时经常遇到许多挑战。在这篇博客中,我将讨论这些挑战,更重要的是,我们将深入探讨提高RAG性能的解决方案,使其准备好投入生产环境。

我将讨论来自不同研究论文的各种优化技术。这些技术中的大多数将基于我特别喜欢的一篇研究论文,题为“大型语言模型的检索增强生成:一项调查”。这篇论文涵盖了最近的优化方法。

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

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

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

检索后处理 接下来,RAG模型通过添加上下文中的相关检索数据(查询+上下文)来增强用户输入(或提示)。这一步使用提示工程技术来与LLM进行有效沟通。增强后的提示允许大型语言模型使用给定的上下文生成对用户查询的准确答案。

目标 我们的目标是通过将各种技术应用于不同部分,来增强RAG工作流程的每个组件。

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

增强数据粒度****提高数据质量 “垃圾进,垃圾出”

数据清洗在RAG框架中扮演着至关重要的角色。你的RAG解决方案的性能取决于数据的清洗和组织程度。移除不必要的信息,如特殊字符、不需要的元数据或文本。

  1. 移除无关文本/文档:消除了LLM回答不需要的所有无关文档。还要移除噪声数据,这包括去除特殊字符、停用词(像“the”和“a”这样的常见词)和HTML标签。2. 识别并纠正错误:这包括拼写错误、打字错误和语法错误。3. 在分割的数据块中用名称替换代词可以增强检索期间的语义重要性。添加元数据

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

添加元数据信息涉及将参考元数据(如日期和目的)整合到数据块中以进行过滤,并结合参考的章节和小节等元数据以提高检索效率。

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

  1. 如果你搜索项目并且近期性是一个标准,你可以根据日期元数据进行排序 2. 如果你在科学论文上搜索,你事先知道你要查找的信息总是位于特定部分,例如实验部分,你可以为每个数据块添加文章部分作为元数据,并在其上进行过滤以仅匹配实验。元数据很有用,因为它在向量搜索之上增加了一层结构化搜索。

优化索引结构

知识图谱或图神经网络索引 通过利用图数据索引中节点之间的关系,结合来自图结构的信息来捕捉相关上下文。向量索引 块优化 选择合适的块大小是一个重要的决策,它可以以多种方式影响RAG系统的效率和准确性:

相关性和粒度 较小的块大小,如128,会产生更细粒度的块。然而,这种粒度带来了一个风险:如果相似性_top_k设置像2那样限制性,重要信息可能不在前几个检索到的块中。相反,512的块大小可能会在前几个块中包含所有必要的信息,确保对查询的答案随时可用。

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

挑战 如果你的块太小,它可能不包括LLM回答用户查询所需的所有信息;如果块太大,它可能包含太多无关信息,这会混淆LLM或可能太大而无法适应上下文大小。

任务特定的块划分 基于下游任务需要确定块的最佳长度,以及你希望每个块有多少重叠。

高级任务如摘要需要更大的块大小,低级任务如编码需要较小的块

分块技术 从小到大全文档检索

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

它在初始搜索阶段利用小块文本,然后在处理过程中为语言模型提供更大的相关文本块。

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

步骤:

该过程涉及将原始大文档分解为更小、更易管理的单元,称为子文档,以及称为父文档的大块。它专注于为每个这些子文档创建嵌入,这些嵌入比整个父块嵌入更丰富、更详细。它帮助框架识别包含与用户查询相关信息的最相关子文档。一旦与子文档建立了对应关系,则检索与该子文档关联的整个父文档。在所示的图像中,最终检索到了父块。检索父文档很重要,因为它提供了理解用户查询和做出回应的更广泛上下文。框架现在不仅可以依赖子文档的内容,还可以访问整个父文档。

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

这个过程涉及嵌入有限的句子集合以供检索,这些句子周围的额外上下文,称为“窗口上下文”,单独存储并与它们链接。一旦确定了最相似的句子,就在将这些句子发送到大型语言模型(LLM)进行生成之前,重新整合这些上下文,从而丰富整体的上下文理解。

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

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

在这个过程中,我们利用语言模型(LLM)的能力来重新表述用户的查询并再次尝试。需要注意的是,两个在人类看来可能相同的问题,在嵌入空间中可能看起来并不相似。

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

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

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

Hyde或Query2doc Hyde和Query2doc都是类似的查询重写优化。鉴于搜索查询通常较短、含糊或缺乏必要的背景信息,LLM可以通过在数万亿标记上进行预训练来记住大量的知识和语言模式,从而为检索系统提供相关信息以指导其工作。

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

这个模板复制了“Step-Back”提示技术,该技术通过首先提出一个“step back”问题来提高对复杂问题的性能。这种技术可以通过为原始问题和step-back问题检索信息,与标准的问题回答RAG应用程序结合使用。下面是一个step-back提示的例子。

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

生成用于训练和评估的合成数据集 这里的关键思想是,可以使用像GPT-3.5-turbo这样的语言模型来生成用于微调的训练数据,以基于文档块制定问题。这允许我们在不需要人工标记者的情况下,以可扩展的方式生成合成的(查询, 相关文档)正例对。最终的数据集将是问题和文本块的对。

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

混合搜索探索 RAG系统通过智能整合各种技术来优化其性能,包括基于关键词的搜索、语义搜索和向量搜索。

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

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

后检索优化 重新排序 在将检索结果发送到LLM之前对其进行重新排序,显著提高了RAG的性能。

在向量相似性搜索中得分高并不意味着它总是具有最高的相关性。

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

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

提示压缩 检索到的文档中的噪声会不利于RAG的性能,因此,与查询最相关的信息可能会被埋在含有大量不相关文本的文档中。将整个文档传递给应用程序可能会导致更昂贵的LLM调用和较差的响应。

这里,重点在于压缩不相关的上下文,突出关键段落,并减少整体上下文长度。

上下文压缩 上下文压缩旨在解决这一问题。这个想法很简单:不是立即原样返回检索到的文档,而是可以使用给定查询的上下文来压缩它们,以便只返回相关信息。“压缩”在这里指的是压缩单个文档的内容以及整体过滤掉文档。

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

模块化RAG 模块化RAG整合了各种方法来增强RAG的不同组件,例如纳入一个搜索模块进行相似性检索,并在检索器中应用微调方法。

RAG融合 RAG融合结合了两种方法:

多查询检索 利用LLMs为给定的用户输入查询从不同角度生成多个查询,这对于解决具有多个子问题的复杂问题有利。重新排序检索到的文档 对所有检索到的文档进行重新排序,并移除所有相关性得分低的文档。

这种先进技术保证了搜索结果与用户的意图相匹配,无论这些意图是明显的还是不明显的。它帮助用户找到更具洞察力和相关性的信息。

最终思考 本文讨论了优化RAG流程中每个部分的各种技术,以增强整个RAG流程。你可以在你的RAG流程中使用一个或多个这些技术,使其更准确、更高效。我希望这些技术能帮助你为你的应用程序构建一个更好的RAG流程。

关注以下小程序,体验更多大模型场景应用。

更多AI工具,参考Github-AiBard123国内AiBard123

可关注我们的公众号:每天AI新工具