在我的上一篇博客中,我深入地介绍了RAG以及它是如何用LlamaIndex实现的。然而,RAG在回答问题时经常遇到许多挑战。在本博客中,我将解决这些挑战,更重要的是,我们将深入研究提高RAG性能的解决方案,使其可用于生产环境。
图片来源:https://arxiv.org/pdf/2401.05856.pdf
我将讨论来自不同研究论文的各种优化技术。这些技术中的大多数将基于我特别喜欢的一篇研究论文,题为“Retrieval-Augmented Generation for Large Language Models: A Survey.”(链接:https://arxiv.org/pdf/2312.10997.pdf)。该论文包含了大部分最新的优化方法。
1. RAG工作流程分解
首先,为了增强对RAG的理解,我们将RAG工作流程分解为三个部分,并对每个部分进行优化以提高整体表现。
在Pre-Retrieval步骤中,准备LLM原始训练数据集之外的新数据(也称为外部数据)并将其分成chunk,然后使用嵌入模型将块数据转换为数字表示并将其存储在向量数据库中。这个过程创建了一个LLM可以理解的知识库。
在最重要的Retrieval步骤中,将用户查询转换为称为嵌入的向量表示,并使用余弦相似度从向量数据库中查找相关块。它试图从向量存储中找到高度相关的文档块。
接下来,RAG模型通过在上下文(查询+上下文)中添加相关的检索数据来增加用户输入(或提示)。此步骤使用提示工程技术与LLM进行有效沟通。增强的提示允许LLM使用给定的上下文为用户查询生成准确的回答。
我们的目标是通过对不同部分应用各种技术来增强RAG工作流的每个组件能力。
2. Pre-Retrieval优化
Pre-retrieval技术包括提高索引数据的质量和块优化。这个步骤也可以称为增强语义表示
提高数据质量 “垃圾进,垃圾出”。
数据清洗在RAG框架中起着至关重要的作用。RAG的效果取决于数据清洗和组织的好坏。删除不必要的信息,如特殊字符、不需要的元数据或文本。
添加元数据,如概念和层级标签,以提高索引数据的质量。
添加元数据信息包括将引用的元数据(如日期和用途)集成到块中以进行过滤,以及将引用的章节和小节等元数据集成到块中以提高检索效率。
以下是元数据有用的一些场景:
元数据很有用,因为它在向量搜索的基础上又增加了一层结构化搜索。
3. 分块优化
选择正确的chunk_size是一个关键的决定,它可以在几个方面影响RAG系统的效率和准确性:
较小的chunk_size,如128,产生更细粒度的块。但是,这种粒度存在风险,如重要信息可能不在检索到的最前面的块中,特别是当similarity_top_k设置被限制为2时。相反,块大小为512可能包含顶部块中的所有必要信息,从而确保查询的答案随时可用。
随着chunk_size的增加,输入LLM生成答案的信息量也会增加。虽然这可以确保更全面的上下文,但它也可能减慢系统响应的速度。
如果文档块太小,它可能不包含LLM回答用户查询所需的所有信息,如果块太大,则可能包含太多不相关的信息,这会使LLM感到困惑,或者可能太大而无法适应上下文大小。
根据下游任务需要确定块的最优长度以及每个块有多少重叠。
像文本总结这样的高级任务需要更大的块大小,而像编码这样的低级任务需要更小的文本分块。
4. 分块技术
Small2big or Parent Ducument Retrieval
ParentDocumentRetriever通过分割和存储小块数据来实现这种平衡。在检索过程中,它首先获取小块,然后查找这些块的父id,并将这些较大的文档返回给LLM。
它在初始搜索阶段使用小文本块,随后向语言模型提供更大的相关文本块进行处理。
递归检索涉及在初始检索阶段获取较小的块以捕获关键语义。随后,在流程的后期阶段,将向LLM提供包含更多上下文信息的更大的文本块。这种两步检索方法有助于在效率和提供上下文丰富的响应之间取得平衡。
步骤:
1. 该过程包括将原始大文档分解为较小、更易于管理的单元(称为子文档)和较大的块(称为父文档)。
2. 它专注于为每一个子文档创建嵌入,这些嵌入比每一个完整的父块嵌入更丰富、更详细。它帮助框架识别包含与用户查询相关信息的最相关子文档。
3. 一旦建立了与子文档的对齐,它就会检索与该子文档相关联的整个父文档。在所示的图片中,最终获得了父块。
4. 父文档的这种检索很重要,因为它为理解和响应用户的查询提供了更广泛的上下文。框架现在可以访问整个父文档,而不是仅仅依赖于子文档的内容。
5. 句子窗口检索
这种分块技术与上面的非常相似。句子窗口检索的核心思想是根据查询从自定义知识库中有选择地获取上下文,然后利用该上下文的更广泛版本来生成更健壮的文本。
这个过程包括对一组有限的句子进行编码以供检索,以及围绕这些句子的附加上下文,称为“窗口上下文”,单独存储并链接到它们。一旦识别出最相似的句子,就会在这些句子被发送到大型语言模型(LLM)生成之前重新整合上下文,从而丰富整体上下文理解。
6. 检索优化
这是RAG工作流中最重要的部分,它包括基于用户查询从向量数据库中检索文档。这个步骤也可以称为对齐查询和文档。
查询重写是对齐查询和文档语义的基本方法。
在这个过程中,我们利用语言模型(LLM)功能来改写用户的查询生成一个新的查询。需要注意的是,在人类看来相同的两个问题在嵌入空间中可能并不相似。
多查询检索方法利用LLM从不同的角度为给定的用户输入查询生成多个查询,有利于处理具有多个子问题的复杂问题。
对于每个查询,它检索一组相关文档,并在所有查询中获取唯一联合,以获得更大的潜在相关文档集。
通过在同一个问题上生成多个子问题,MultiQuery Retriever可能能够克服基于距离的检索的一些限制,并获得更丰富的结果集。
Hyde和Query2doc都是类似的查询重写优化。考虑到搜索查询通常很短、模棱两可或缺乏必要的背景信息,LLM可以提供相关信息来指导检索系统,因为它们通过对数万亿个token进行预训练来记忆大量的知识和语言模式。
退步提示方法鼓励语言模型超越具体的例子,专注于更广泛的概念和原则。
该模板复制了“step - back”提示技术,该技术通过先问一个“step - back”问题来提高处理复杂问题的效果。通过检索原始问题和stepback问题的信息,可以将该技术与标准问答RAG应用程序结合使用。下面是一个stepback prompt的示例。
7. 微调嵌入模型
微调嵌入模型会显著影响RAG系统中检索内容的相关性。该过程包括自定义嵌入模型,以增强特定领域上下文中的检索相关性,特别是对于持续更新或存在罕见术语的专业领域。
这里的关键思想是,可以使用GPT-3.5-turbo等语言模型生成用于微调的训练数据,以基于文档块制定问题。这允许我们以可扩展的方式生成合成的正对(查询、相关文档),而不需要人工标注。最终的数据集将是成对的问题和文本块。
在生成的训练数据集上微调任何嵌入模型。
RAG系统通过智能集成各种技术来优化其性能,包括基于关键字的搜索、语义搜索和向量搜索。
这种方法利用每种方法的特定优势来适应不同的查询类型和信息需求,确保对高度相关和上下文丰富的信息进行一致的检索。使用混合搜索作为检索策略的强大补充,从而提高了RAG流水线的整体效率。
最常见的模式是将稀疏检索器(如BM25)与密集检索器(如嵌入相似度)结合起来,因为它们的优势是互补的。它也被称为“混合搜索”。稀疏检索器擅长根据关键词找到相关文档,而密集检索器擅长根据语义相似度找到相关文档。
8. Post-Retrieval优化
a) 重排
在将检索结果发送给LLM之前对其重新排序可以显著提高RAG的性能。
向量相似性搜索的高分并不意味着它就具有最高的相关性。
核心概念包括重新排列文档记录,将最相关的放在最top,从而限制文档的总数。这既解决了检索过程中上下文窗口扩展的难题,又提高了检索效率和响应速度。
增加查询引擎中的similarity_top_k以检索更多上下文段落,在重排后可以减少到top_n。
b) 提示压缩
检索文档中的噪声会对RAG性能产生不利影响,因此,与查询最相关的信息可能会被隐藏在包含大量不相关文本的文档中。在应用程序中传递完整的文档可能会导致LLM调用成本更高,响应也更差。
在这里,重点在于压缩不相关的上下文,突出关键段落,并减少整个上下文的长度。
上下文压缩就是为了解决这个问题。其思想很简单:与其按原样立即返回检索到的文档,它可以使用给定查询的上下文压缩它们,以便只返回相关信息。这里的“压缩”既指压缩单个文档的内容,也指过滤掉整个文档。
文档压缩器是一个小型语言模型,用于计算用户查询和检索文档的提示互信息,估计元素的重要性。
9. 模块化RAG
模块化RAG集成了多种方法来增强RAG的不同组成部分,如在检索器中加入相似度检索的搜索模块和应用微调方法
RA融合技术结合了两种方法:
利用LLMs从不同的角度为给定的用户输入查询生成多个查询,这有利于解决包含多个子问题的复杂问题。
对所有检索到的文档重新排序,并删除所有相关分数低的文档
这种先进的技术保证了搜索结果符合用户的意图,无论他们是否明显。它帮助用户找到更有洞察力和相关的信息。
总结
本文讨论了优化RAG管道各部分和增强整体RAG流水线的各种技术。您可以在您的RAG流水线中使用这些技术中的一种或多种,从而使其更加准确和高效。我希望这些技术可以帮助你为你的应用构建一个更好的RAG流水线。
原文标题:Advance RAG- Improve RAG performance
副标题:Ultimate guide to optimise RAG pipeline from zero to advance- Solving the core challenges of Retrieval-Augmented Generation
原文链接:https://luv-bansal.medium.com/advance-rag-improve-rag-performance-208ffad5bb6a
编辑:黄继彦