【RAG】检索增强生成RAG效果优化技术汇总分析

一、RAG 工作流程划分

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

2.1 预检索

在预检索步骤中,需要准备LLM 原始训练数据集之外的新数据(也称为外部数据,如Word文档PDF文件等) ,并将其拆分成块,然后使用向量模型对块数据进行索引,该模型将数据转换为数值表示并将其存储在向量数据库中,此过程创建了 LLM 可以理解的知识库。
在这里插入图片描述

RAG 中的预检索

2.2 检索

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

2.3 检索后

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

RAG 中的检索和后检索

二、RAG优化思路

2.1 检索前优化

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

2.1.1 增强数据粒度

(1)提高数据质量

Garbage in, garbage out

数据清理在 RAG 框架中起着至关重要的作用。RAG 解决方案的性能取决于数据的清理和组织程度。删除不必要的信息,例如特殊字符、不需要的元数据或文本。

  • 删除不相关的文本/文档:删除所有不需要 LLM 回答的不相关文档。同时删除噪音数据,包括删除特殊字符、停用词(常用词如“the”和“a”)和 HTML 标签。
  • 识别和纠正错误:包括拼写错误、打字错误和语法错误。
  • 在分割块中用名称替换代词可以增强检索过程中的语义重要性

(2)添加元数据

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

添加元数据信息包括将引用的元数据(例如日期和目的)集成为块以便进行过滤,以及合并参考文献的章节和小节等元数据以提高检索效率。

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

  • 如果你搜索项目并且以新近度为标准,则可以按日期元数据进行排序。
  • 如果你搜索科学论文,并且事先知道你要查找的信息始终位于特定部分,例如实验部分,则可以将文章部分添加为每个块的元数据,并对其进行过滤以仅匹配实验。

元数据很有用,因为它在向量搜索上带来了额外的结构化搜索层。

(3)优化索引结构

  • 知识图谱或图神经网络索引利用,图数据索引中节点之间的关系,整合图结构中的信息来捕获相关上下文。

  • 向量索引

2.1.2 分块优化

选择正确的 chunk_size 是一个关键的决定,它可以通过多种方式影响 RAG 系统的效率和准确性:

(1)相关性和粒度

较小的 chunk_size(如 128)可产生更细粒度的块。然而,这种粒度存在风险:重要信息可能不在检索到的顶部块中,尤其是当 similarity_top_k 设置严格到 2 时。相反,512 的块大小很可能包含顶部块中的所有必要信息,从而确保查询的答案随时可用。

(2)响应生成时间

随着 chunk_size 的增加,输入到 LLM 以生成答案的信息量也会增加。虽然这可以确保更全面的背景信息,但也可能会降低系统速度。

(3)挑战

如果您的块太小,它可能不包含 LLM 回答用户查询所需的所有信息;如果块太大,它可能包含太多不相关的信息,使 LLM 感到困惑,或者可能太大而无法适应上下文大小。

(4)任务特定分块

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

诸如总结之类的高级任务需要更大的块大小,而诸如编码之类的低级任务则需要较小的块。

(5)分块技术

  • Small2big 或父文档检索

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

它在初始搜索阶段利用小文本块,随后将更大的相关文本块提供给语言模型进行处理。

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

步骤:

  1. 该过程涉及将原始大型文档分解为更小、更易于管理的单元(称为子文档)和更大的块(称为父文档)。
  2. 它专注于为每个子文档创建嵌入,这些嵌入比整个父块嵌入更丰富、更详细。它帮助框架识别包含与用户查询相关的信息的最相关子文档。
  3. 一旦与子文档建立对齐,它就会检索与该子文档关联的整个父文档。如图所示,最终检索到了父块。
  4. 检索父文档非常重要,因为它为理解和响应用户的查询提供了更广泛的背景。框架现在可以访问整个父文档,而不再仅仅依赖于子文档的内容。

在这里插入图片描述

  • 句子窗口检索

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

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

在这里插入图片描述

句子窗口检索的工作原理

在这里插入图片描述

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

2.2 检索优化

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

2.2.1 查询重写

查询重写是对齐查询和文档的语义的基本方法。 在此过程中,我们利用语言模型 (LLM) 功能重新表述用户的查询并再次尝试。需要注意的是,两个在人类看来可能相同的问题在嵌入空间中可能看起来并不相似。

2.2.2 多查询检索器

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

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

通过对同一个问题产生多种观点,多查询检索器可能能够克服基于距离的检索的一些限制并获得更丰富的结果。

在这里插入图片描述

多查询检索器

2.2.3 Hyde 或 Query2doc

Hyde 或 Query2doc(查询到文档)是类似的查询重写优化。鉴于搜索查询通常很短、含糊不清或缺乏必要的背景信息,LLM 可以提供相关信息来指导检索系统,因为它们通过对数万亿个标记进行预训练来记忆大量的知识和语言模式。

在这里插入图片描述

标准方法和HyDE方法之间的差异

在这里插入图片描述

HyDE模型

2.2.4 StepBack

提示StepBack 提示该方法鼓励语言模型超越具体的例子来思考,并关注更广泛的概念和原则。

此模板复制了“后退”提示技术,该技术通过首先提出“后退”问题来提高复杂问题的表现。 此技术可以与标准问答 RAG 应用程序结合使用,通过检索原始问题和后退问题的信息。以下是后退提示的示例。

在这里插入图片描述

2.2.5 微调嵌入

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

  1. 生成用于训练和评估的合成数据集
    这里的关键思想是,可以使用 GPT-3.5-turbo 等语言模型生成用于微调的训练数据,以基于文档块提出问题。这使我们能够以可扩展的方式生成合成的正对(查询、相关文档),而无需人工贴标。最终数据集将是问题和文本块的对。

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

在这里插入图片描述

使用 GPT 通过合成生成的数据集微调嵌入模型

2.2.6 混合搜索

RAG系统通过智能地集成 基于关键字的搜索语义搜索向量搜索 等各种技术来优化其性能。这种方法充分利用了每种方法的独特优势,以适应不同的查询类型和信息需求,确保始终如一地检索高度相关且上下文丰富的信息。混合搜索的使用是对检索策略的有力补充,从而提高了 RAG 流程的整体效率。

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

在这里插入图片描述

2.3 检索后优化

2.3.1 重新排序

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

核心思想通过重新排列文档记录,将最相关的内容放在最前面,从而限制文档的总数,不仅解决了检索过程中上下文窗口扩展的问题,还提高了检索效率和响应速度。增加查询引擎中的similarity_top_k来检索更多的上下文段落,重新排名后可以减少到top_n。

在这里插入图片描述

使用 Cohere Reranker 对检索到的文档进行重新排序

2.3.2 内容压缩

检索到的文档中的噪声会严重影响 RAG(Retrieval-Augmented Generation) 的性能。因此,与查询最相关的信息可能被埋藏在大量无关文本中。将整个文档传递到应用程序中可能导致更昂贵的大语言模型(LLM)调用,并生成质量较差的响应。在这种情况下,重点在于压缩无关上下文、突出关键段落,以及减少整体上下文长度。

上下文压缩旨在解决这一问题。其核心思想很简单:不是直接返回检索到的原始文档,而是根据给定查询的上下文对文档进行压缩,从而仅返回相关信息。这里的“压缩”既指压缩单个文档的内容,也包括完全过滤掉不相关的文档。

在这里插入图片描述

上下文压缩

Doc Compressor 是一种小型语言模型,用于计算用户查询和检索到的文档之间的提示互信息(prompt mutual information),从而评估各个元素的重要性。

2.3.3 模块化 RAG

模块化 RAG 通过整合多种方法来增强 RAG 的不同组件。例如,引入搜索模块以进行相似性检索,并在检索器中应用微调方法以提高性能。

RAG 融合结合了两种方法:

  1. 多查询检索 (Multi-Query Retrieval)
    利用大语言模型 (LLMs) 从不同角度为给定的用户输入查询生成多个查询。这种方法在处理包含多个子问题的复杂问题时具有优势。

  2. 重排序检索文档 (Rerank Retrieved Documents)
    对所有检索到的文档进行重新排序,并移除相关性得分较低的文档,从而提升结果的质量。

在这里插入图片描述

图片所示技术确保了搜索结果能够匹配用户的意图,无论是显而易见的还是隐含的。它帮助用户找到更具洞察力和相关性的信息。

一些思考

本文讨论了优化 RAG 管道各个部分并增强整体 RAG 性能的各种技术。你可以在 RAG 管道中使用其中一种或多种技术,使其更加准确和高效。希望这些技术能够帮助你为你的应用程序构建一个更强大的 RAG 管道。

参考资料:https://luv-bansal.medium.com/advance-rag-improve-rag-performance-208ffad5bb6a

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值