【检索增强】Retrieval-Augmented Generation for Large Language Models:A Survey

本文简介

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的软奖励。这种双信号方法促进了更有效的微调过程,使嵌入模型适应不同的下游应用。

(2)查询与文档对齐

(3)检索器和LLM对齐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/501158.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

A fatal error occurred: MD5 of file does not match data in flash!问题解决

采用的芯片是ESP32-S3-WROOM,16MB FLASH 开发环境是Arduino,烧录到100%后直接报错。 以为是Arduino的问题,用esp-idf开发的程序, 烧录的过程中,也是直接报错如下: esptool.py v4.7.0 Serial port /dev/…

【MySQL】DQL-条件查询语句全解(附带代码演示&案例练习)

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

The Divide-and-Conquer Paradigm分而治之范式

In general, the divide-and-conquer paradigm consists of the following steps. The divide step. The input is partitioned into 1 ≤ p ≤ n parts. The conquer step. This step consists of performing p recursive call(s) if the problem size is…

java分割回文串(力扣Leetcode131)

分割回文串 力扣原题链接 问题描述 给定一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。 示例 示例 1: 输入:s “aab” 输出:[[“a”,“a”,“b”],[“aa”,“b”]] 示例 2: 输…

07-工作流设计:如何设计合理的多人开发模式?

一个企业级项目是由多人合作完成的,不同开发者在本地开发完代码之后,可能提交到同一个代码仓库,同一个开发者也可能同时开发几个功能特性。这种多人合作开发、多功能并行开发的特性如果处理不好,就会带来诸如丢失代码、合错代码、…

css简单动画实现

html源码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>西安工程大学</title><link …

计算机毕业设计Python+Spark知识图谱高考志愿推荐系统 高考数据分析 高考可视化 高考大数据 大数据毕业设计 机器学习 深度学习 人工智能

学院&#xff08;全称&#xff09;&#xff1a; 专业&#xff08;全称&#xff09;&#xff1a; 姓名 学号 年级 班级 设计&#xff08;论文&#xff09; 题目 基于Spark的高考志愿推荐系统设计与实现 指导教师姓名 职称 拟…

AWTK 开源串口屏开发(15) - 通过 MODBUS 访问远程设备数据

在 AWTK 串口屏中&#xff0c;内置了 MODBUS Client 的模型&#xff0c;支持用 MODBUS 协议从远程设备获取数据。不用编写一行代码即可实现对远程设备数据的显示和修改。 1. 功能 不用编写代码&#xff0c;实现对远程设备数据的显示和修改。 2. 创建项目 从模板创建项目&am…

火狐浏览器垂直标签页对比 Sidebery vs Tab Center Reborn

Sidebery 链接 商店 评价 大而全&#xff0c;各种功能&#xff0c;以及相关的配置项&#xff0c;应有尽有&#xff1b;功能包括但不限于&#xff1a; 树形标签页、着色、面板、容器、快照最近关闭、标签页、历史 默认的配置就已经很好用了&#xff1b; 快捷键&#xff1a;F…

英伟达文本生成3D模型论文:Magic3D: High-Resolution Text-to-3D Content Creation解读

一、摘要 摘要&#xff1a;DreamFusion 最近展示了使用预训练的文本到图像扩散模型来优化神经辐射场 (NeRF) 的实用性&#xff0c;实现了显着的文本到 3D 合成结果。然而&#xff0c;该方法有两个固有的局限性&#xff1a;&#xff08;a&#xff09;NeRF 的优化极慢和&#xf…

抢先一步,搞定阿里面试难题——双亲委派机制揭秘!

希望本文对你有所帮助,欢迎继续关注我的公众号“知其然亦知其所以然”,一起探索更多有趣的技术话题! 大家好,我是小米,欢迎来到我的微信公众号!今天,我们将深入探讨一道备受关注的面试题目——“双亲委派机制”。这个话题是阿里巴巴等顶尖科技公司面试中常常涉及的一环…

大电流电感的作用和特点

大电流电感又称为高功率电感&#xff0c;一般是指绕线型电感&#xff0c; 一、主要作用 1.在低频时&#xff0c;起蓄能和滤高频&#xff1b; 2.在高频时&#xff0c;它的阻抗特性表现的很明显。有耗能发热&#xff0c;感性效应降低等现象。 简单来说就是对交流信号进行隔离、…

快速上手Spring Cloud 九:服务间通信与消息队列

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

怎么更新sd-webui AUTOMATIC1111/stable-diffusion-webui ?

整个工程依靠脚本起来的&#xff1a; 可直接到stable-diffusion-webui子目录执行&#xff1a; git pull更新代码完毕后&#xff0c;删除venv的虚拟环境。 然后再次执行webui.sh&#xff0c;这样会自动重新启动stable-diffusion-webui.

微服务架构介绍

单体架构 单体&#xff0c;即&#xff1a;一个进程完成全部的后端处理&#xff0c;如果搞不定&#xff0c;就多个进程一起&#xff0c;单体中一般包含&#xff1a;客户端&#xff08;App、H5、Web&#xff09;、服务端部署&#xff08;反向代理、数据库、中间件等&#xff09;&…

设计模式之工厂方法模式精讲

工厂方法模式又叫虚拟构造函数&#xff08;Virtual Constructor&#xff09;模式或者多态性工厂&#xff08;Polymorphic Factory&#xff09;模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口&#xff0c;将实际创建性工作推迟到子类中。 工厂模式可以分为简单工厂…

零基础入门转录组数据分析——绘制差异火山图

零基础入门转录组数据分析——绘制差异火山图 差异分析的火山图(Volcano Plot)在生物信息学数据分析中,特别是在基因表达差异分析中,是一个非常直观和有用的工具。 本教程将从导入的数据结构开始,一步步带大家在R中绘制好看的火山图,最后对火山图进行解读,确保读者理解…

STL第二弹

3.5 stack容器 3.5.1 stack容器基本概念 概念&#xff1a; stack是一种先进后出的数据结构&#xff0c;他只有一个出口 栈中只有顶端的元素才可以被外界使用&#xff0c;因此栈不允许有遍历行为 3.5.2 stack常用接口 构造函数&#xff1a; stack stk; //stack采用模板类实…

Spark-Scala语言实战(7)

在之前的文章中&#xff0c;我们学习了如何在IDEA中导入jars包&#xff0c;并做了一道例题&#xff0c;了解了RDD。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢…

conda使用记录

linux 使用conda创建新一个新的python环境过程 conda create -n recommendation_env python3.8.18 # 指定python版本 conda env list # 查看所有的环境 conda activate recommendation_env # 激活创建的新环境 pip install flask # 安装依赖 或者 pip install flask版本号 或者…