本文简介
1、对最先进水平RAG进行了全面和系统的回顾,通过包括朴素RAG、高级RAG和模块化RAG在内的范式描述了它的演变。这篇综述的背景下,更广泛的范围内的法学硕士研究RAG的景观。
2、确定并讨论了RAG过程中不可或缺的核心技术,特别关注“检索”、“生成”和“增强”方面,并深入研究了它们的协同作用,阐明了这些组件如何复杂地协作以形成一个有凝聚力和有效的RAG框架。
3、构建了一个全面的RAG评估框架,概述了评估目标和指标。对比分析从不同的角度阐明了RAG与微调相比的优缺点。此外,预测了RAG的未来方向,强调潜在的增强以应对当前的挑战,扩展到多模式设置,以及其生态系统的发展。
1、RAG框架
(1)简述
本文将RAG搜索范式分成了三类:朴素RAG、高级RAG和模块化RAG
从模块化RAG来看,朴素RAG是只有读取和检索模块,高级RAG除了朴素RAG中的读取和检索模块外,还具有重写和重排模块。
从某种程度上来说,朴素RAG是高级RAG的一个特例,而高级RAG又是模块化RAG的一个特例。三种范式之间是一种继承与发展的关系。
(2)朴素RAG
朴素RAG是传统的RAG过程,包括:索引、检索和生成。
索引:索引过程是离线数据准备的关键,涉及三个阶段。
(1)数据预处理
:数据清洗、提取、格式转换为标准纯文本、切割分块等。
(2)嵌入表示
:将分块后的数据用嵌入模型将其用向量表示。
(3)创建索引
:创建索引以键值对的形式存储这些文本块及其向量嵌入,从而实现高效且可扩展的搜索功能。
检索:受到用户查询后,将会去索引库中匹配向量。
(1)用户查询向量化
:系统使用索引阶段使用的相同编码模型将输入转码为向量表示。
(2)计算相似度分数
:计算查询向量和索引语料库中向量的相似度分数。
(3)优先级排序并检索
:系统对与查询最相关的前K个块进行优先级排序,检索出来对应的文本块,这些文本块将作为结果会返回给用户。
生成:查询与选择出的文档将会被拼接在一起,作为一个连贯的prompt输入给LLM。
传统RAG的缺陷:
低精度、检索快不对齐、幻觉、低回忆率
(3)高级RAG
高级RAG有针对性地解决朴素RAG的潜在问题,实现了检索前策略和检索后策略。还是用了滑动窗口技术、细粒度分割和元数据等技术改进索引方法,引入了各种方法来优化检索过程。
检索前过程:优化数据索引。优化数据索引的目标是提高被检索内容的质量。这涉及五种主要策略:增强数据粒度、优化索引结构、添加元数据、对齐优化和混合检索。
(1)增强数据粒度
:旨在提高文本的标准化、一致性、事实准确性和丰富的上下文,从而提高RAG系统的性能。这包括删除不相关的信息,消除实体和术语中的歧义,确认事实的准确性,维护上下文和更新过时的文件。
(2)优化索引结构
:调整块的大小以捕获相关上下文、跨多个索引路径进行查询,以及通过利用图数据索引中的节点之间的关系来合并图结构中的信息以捕获相关上下文。
(3)添加元数据
:将引用的元数据(日期和用途等)集成到块中进行过滤,以及将引用的章节和小节等元数据集成到块中以提高检索效率。
(4)对齐优化
:通过在文档中引入“假设问题”来纠正对齐问题和差异,从而解决文档之间的对齐问题和差异。
检索:通过计算查询和块之间的相似性识别合适的上下文,Embedding模型是这个过程的核心。
(1)微调Embedding模型
:微调Embedding模型会显著影响RAG系统中检索内容的相关性。该过程包括:自定义Embedding模型、增强特定领域上下文中的检索相关性。可以适应ChatGPT等语言模型来生成用于微调的预训练数据,以制定基于文档块的数据。
(2)动态Embedding
:适应单词使用的上下文,不像静态嵌入,它为每个单词使用单个向量。例如,在向BERT这样的Transformer模型中,相同的单词可以根据周围的单词具有不同的嵌入。OpenAI的embeddings-ada-02模型建立在LLM的原理之上,是一个复杂的动态嵌入模型,可以捕获上下文理解。然而,它可能不会像最新的大规模语言模型(如GPT-4)那样对上席文同样表现出敏感性。
检索后过程:在从数据库中检索有价值的上下文之后,必须将其与查询合并,作为llm的输入,同时解决上下文窗口限制带来的挑战。简单地将所有相关文件一次性呈现给法学硕士可能会超出上下文窗口限制,引入噪音,并阻碍对关键信息的关注。为了解决这些问题,需要对检索到的内容进行额外处理。
(1)重排
:对检索到的信息重新排序,将最相关的内容重新定位到提示的边缘(开头或结尾)是一个关键策略。
(2)prompt压缩
:检索文档中的噪声会对RAG性能产生不利影响。在后处理中,重点在于压缩不相关的上下文,突出关键段落,减少整体上下文长度。包括:利用小语言模型来计算提示互信息或困惑,估计元素的重要性;在不同粒度上训练压缩器来解决这个问题;计了总结技术来增强LLM的关键信息感知,特别是在处理广泛的上下文时。
(4)模块化RAG
模块化RAG提供了一个更为灵活和通用的框架,集成了多种增强功能模块的方法,例如在检索器中加入相似检索的搜索模块和应用微调方法。模块化RAG允许序列化的管道和跨多个模块端到端的方法。
1)模块化RAG的结构
1、搜索模块·:从多源异构数据来源中获取数据。
针对特定场景进行了定制,并结合了对其他语料库的直接搜索。这种集成是使用LLM生成的代码、查询语言(如SQL或Cypher)以及其他自定义工具来实现的。这些搜索的数据源可以包括搜索引擎、文本数据、表格数据和知识图谱。
2、记忆模块:通过利用LLM的记忆信息来指导检索。
包括:识别与当前输入最相似的记忆;利用检索增强生成器迭代创建无界内存池,将“原始问题”和“双重问题”结合起来。通过使用检索增强的生成模型,使用自己的输出来改进自己,文本在推理过程中与数据分布更加一致。利用模型本身的输出来代替训练数据。
3、融合模块:使用LLM将查询扩展到多个不同的角度,多个不同的方法来查询。
这种方法不仅捕获了用户所寻求的明确信息,而且还揭示了更深层次的、具有变革性的知识。融合过程包括对原始查询和扩展查询进行并行向量搜索,智能重新排序以优化结果,并将最佳结果与新查询配对。这种复杂的方法确保搜索结果与用户的显性和隐性意图紧密结合,从而导致更有洞察力和相关的信息发现。
4、路由模块:查询路由决定用户查询的后续操作。
RAG系统的检索过程利用了多种来源,这些来源在领域、语言和格式上都有所不同,可以根据情况进行交替或合并。查询路由决定用户查询的后续操作,包括:汇总、搜索特定数据库或将不同的路径合并到单个响应中。查询路由器还为查询选择适当的数据存储,其中可能包括各种来源,如矢量存储、图形数据库或关系数据库,或者索引层次结构——例如,用于多文档存储的摘要索引和文档块向量索引。查询路由器的决策是预定义的,并通过llm调用执行,llm调用将查询定向到所选的索引。
5、预测模块:解决检索内容中冗余和噪声等常见问题,该模块不是直接从数据源中检索,而是利用LLM生成必要的上下文。
与通过直接检索获得的内容相比,LLM产生的内容更有可能包含相关信息。
6、任务适配:侧重于使RAG适配各种下游任务。
包括:自动从预构建的数据池中检索零shot任务输入的提示,从而增强了任务和模型之间的通用性;利用LLM作为少量查询生成器,并基于生成的数据创建特定于任务的检索器。通过利用LLM的泛化能力,它可以用最少的示例开发特定于任务的端到端检索器。
2)模块化RAG的模式
模块化RAG的组织结构具有高度的适应性,允许在RAG过程中替换或重新排列模块以适应特定的问题上下文。目前研究主要探讨两种组织范式。一种是涉及添加模块替换模块,一种是侧重于调整模块之间的组织流程。这种灵活性使RAG过程能够有效地处理各种任务。
1、添加或替换模块:引入或替换模块的策略包括维护检索-读取过程的核心结构,同时集成其他模块以增强特定功能。
RRR模型[Ma et al., 2023a]引入了 rewrite-retrieve-read 过程,利用LLM性能作为重写模块的强化学习激励。这使重写器能够微调检索查询,从而提高读取器的下游任务性能。
在 Generate-Read [Yu et al., 2022] 等方法中,模块可以选择性地交换,其中LLM的生成模块取代了检索模块。The Recite-Read方法[Sun et al., 2022]将外部检索转换为从模型权重中检索,要求LLM首先记住特定于任务的信息,然后产生能够处理知识密集型自然语言处理任务的输出。
2、调整模块间的流程:在模块流调整领域,重点是加强语言模型和检索模型之间的交互。
DSP [Khattab et al., 2022]引入了 Demonstratre-Search-Predict 框架,将上下文学习系统视为一个明确的程序,而不是最终的任务提示,从而更有效地处理知识密集型任务。ITER-RETGEN [Shao等人,2023]方法利用生成的内容来指导检索,在检索-读取-检索-读取流程中迭代地实现“检索增强生成”和“生成增强检索”。这种方法展示了一种使用一个模块的输出来改进另一个模块的功能的创新方法。
3)优化RAG管道
优化检索过程的目的是提高检索效率和检索质量。目前的研究主要集中在整合多种搜索技术、精炼检索步骤、结合认知回溯、实现通用查询策略以及利用嵌入相似度等方面。这些努力共同努力实现检索效率和上下文信息深度在RAG系统之间的平衡。
1、混合搜索探索:RAG系统通过智能集成各种技术来优化其性能。
包括:基于关键字的搜索、语义搜索和向量搜索。这种方法利用每种方法的独特优势来适应不同的查询类型和信息需求,确保对高度相关和上下文丰富的信息进行一致的检索。使用混合搜索作为检索策略的强大补充,从而提高了RAG管道的整体效率。
2、递归检索和查询引擎:采用两步检索方式,在效率和提供上下文丰富的响应之间取得平衡。
第一步,在初始检索阶段获取较小的块以捕获关键语义。第二步,在流程的后期阶段,将向LLM提供包含更多上下文信息的大块。
3、回退提示:鼓励LLM从具体实例中转移出来,围绕更广泛的概念和原则进行推理。
相当于是把你的问题抽象一下再给大模型。实验结果表明,当使用回退提示时,在各种具有挑战性的、基于推理的任务中,性能显著提高,突出了它们对RAG过程的自然适应性。这些增强检索的步骤既可以应用于生成对回退提示的响应,也可以应用于最终的问答过程。
比如:一个物体从 100 米的高处落下到地上的速度是多少,SBP(step backward prompt) 就是在提示词里加上这样一句话“这个问题遵循什么物理规则”。
4、子查询方法:根据场景的不同,可以采用各种查询策略。
例如使用LlamaIndex等框架提供的查询引擎、利用树查询、利用向量查询或执行简单的块顺序查询。
5、假设的文档嵌入:假设文档嵌入基于生成的答案在嵌入空间中可能比直接查询更接近这一假设,通过LLM为响应查询创建一个假设文档(答案),将该文档嵌入化,并使用生成的嵌入来检索与假设文档相似的真实文档。该方法不是基于查询寻找嵌入相似度,而是关注从一个答案到另一个答案的嵌入相似度。然而,它可能不会始终产生理想的结果,特别是当语言模型不熟悉主题时,可能会导致更多带有错误的实例。
2、检索
从数据源中有效地检索相关文档是至关重要的。然而,如何精确的找到我们需要的文档面临着巨大的挑战。这部分分为三个基本问题:
1、我们如何实现准确的语义表示?
2、什么方法可以对齐查询和文档的语义空间?
3、如何使检索器的输出与大语言模型的偏好保持一致?
(1)增强语义表示
在RAG中,语义空间是必不可少的,因为它涉及查询和文档的多维映射。语义空间的检索精度显著影响RAG结果。本节将介绍构建准确语义空间的两种方法。
1)块优化
在管理外部文档时,最初的步骤包括将它们分解为更小的块,以提取细粒度的特征,然后嵌入这些特征以表示它们的语义。然而,嵌入过大或过小的文本块可能会导致次优结果。因此,确定语料库中文档的最佳块大小对于确保检索结果的准确性和相关性至关重要。
选择适当的分块策略需要仔细考虑几个重要因素,例如索引内容的性质、嵌入模型及其最佳块大小、用户查询的预期长度和复杂性,以及特定应用程序对检索结果的利用。不同的嵌入模型,在不同块大小下表现出不同的性能特征。例如,在处理单个句子时,sentence-transformer模型表现更好。而text-embedding-ada-002在处理包含256或512个token时表现更出色。
用户输入问题的长度和复杂性以及应用程序的特定需求(例如,语义搜索或问题回答)等因素也会影响分块策略的选择。这种选择可能直接受到所选LLM的令牌限制的影响,需要调整块大小。在现实中,获得精确的查询结果需要灵活地应用不同的分块策略。没有放之四海而皆准的“最佳”策略,只有最适合特定环境的策略。
目前RAG的研究探索了各种旨在提高检索效率和准确性的块优化技术。
包括:使用滑动窗口技术,通过跨多个检索过程合并全局相关信息来实现分层检索;
“small2big”方法,在初始搜索阶段利用小文本块,随后向语言模型提供更大的相关文本块进行处理。
2)微调嵌入模型
一旦确定了适当的块大小,下一个关键步骤是使用嵌入模型将这些块和查询嵌入到语义空间中。嵌入的有效性至关重要,因为它影响模型表示语料库的能力。当将通用嵌入模型应用于特定领域时,它们准确捕获特定领域信息的能力可能会受到限制。
嵌入模型在特定任务下微调,对于确保模型从内容相关性方面理解用户查询至关重要。没有调优的模型可能无法充分满足特定任务的需求。因此,对嵌入模型进行微调对于下游应用程序至关重要。在嵌入微调方法中有两种主要的范式。
1、领域知识微调
:为了确保嵌入模型准确地捕获特定于领域的信息,必须利用特定于领域的数据集进行调优。这个过程与标准语言模型微调不同,主要在于所涉及的数据集的性质。
通常,用于嵌入模型微调的数据集包含三个主要元素:查询、语料库和相关文档。该模型使用这些查询来识别语料库中的相关文档。然后,根据响应查询检索这些相关文档的能力来衡量模型的有效性。数据集构建、模型微调和评估阶段各有不同的挑战。
2、针对下游任务微调
:在利用RAG完成这些任务的领域中,通过利用llm的功能来微调嵌入模型的创新方法已经出现。
例如,PROMPTAGATOR [Dai等人,2022]利用LLM作为少量查询生成器来创建特定于任务的检索器,解决了监督微调中的挑战,特别是在数据稀缺领域。
LLM-Embedder [Zhang等,2023a],利用llm为跨多个下游任务的数据生成奖励信号。检索器使用两种类型的监督信号进行微调:数据集的硬标签和来自llm的软奖励。这种双信号方法促进了更有效的微调过程,使嵌入模型适应不同的下游应用。