论文阅读_检索增强生成 RAG 综述
英文名称: Retrieval-Augmented Generation for Large Language Models: A Survey 中文名称: 大型语言模型的检索增强生成:一项调查 链接: http://arxiv.org/abs/2312.10997v5 作者: Yunfan Gaoa, Yun Xiongb, Xinyu Gaob, Kangxiang Jiab, Jinliu Panb, Yuxi Bic, Yi Daia, Jiawei Suna, Meng Wangc, and Haofen Wang a,c 机构: 上海智能自主系统研究所, 同济大学, 上海数据科学重点实验室, 复旦大学, 创意设计学院, 同济大学 日期: 2023-12-18 引用:499 |
1 摘要
- 目标:探讨检索增强生成(RAG)作为解决大型语言模型(LLMs)遇到的挑战的有效方法,以提高生成的准确性和可信度,特别是对于知识密集型任务。
- 方法:综合评述了 RAG 范式的发展,包括单纯 RAG,先进 RAG 和模块化 RAG,并详细审查了 RAG 框架的三方基础:检索、生成和增强技术。
- 结论:介绍了嵌入在每个关键组件中的最新技术,深入了解了 RAG 系统的发展。还引入了最新的评估框架和基准,并指出了当前面临的挑战以及未来研究和发展的方向。
2 读后感
文章正文约有 16 页,其中约 13 页为文字内容,不算很长。
首先,论文提出了 RAG 的三个阶段:单纯 RAG、高级 RAG 和模块化 RAG。我觉得,发展到后面模块化 RAG 和 Agent 感觉有点像,RAG 与 Agent 日趋一致可能成为一种趋势,最终可能演变成一个半自主的机器人,能够自动收集信息并进行判断总结,而不仅仅是一个升级版的搜索工具。在完全实现 AGI(通用人工智能)之前,对于不同任务的 RAG 做法也不尽相同。构建 RAG 对于工程师来说就像在炒菜,这篇文章则是列出了很多可用的“食材”和操作注意事项。
论文的优势在于其工作量大,基于 100 多个工具和论文进行了抽象化处理,因此具有整体感和宏观视角。对于不太熟悉 RAG 的读者,可以通过本文构建整体结构并理解一些概念术语;对于已有一定经验的读者,可以查缺补漏。文章还介绍了一些优化方法,可以从中找到适用于自己项目的方法。有些内容很有启发性,比如索引优化章节,它不仅针对 RAG,对我们个人的信息管理也有启发。
本文仍然以导读方式呈现,列出了我认为重要的内容,然后划重点,总结。针对问题进行三层抽象:原文(论文)-> 抽取(本文)-> 提炼(标注黑体斜体)-> 感受(读后感)。
1 引言
RAG 需要解决的问题主要包括:幻觉、过时的知识以及不透明且无法追踪的推理过程。它将 LLMs 的内在知识与外部数据库的庞大动态存储库相结合。
图 1:RAG 研究的技术树。涉及 RAG 的阶段主要包括预训练、微调和推理。对 RAG 的研究最初主要集中在推理阶段,之后到融入微调 LLMs,并一直在探索在预训练阶段增强语言模型的方法。
2 概述
论文提出了 RAG 的三个阶段:单纯 RAG、高级 RAG 和模块化 RAG。
图 3:RAG 的三种范式之间的比较。(左)Naive RAG 主要由三个部分组成:索引、检索和生成。(中)Advanced RAG 围绕 pre-retrieval 和 post-retrieval 提出了多种优化策略,其过程类似于 Naive RAG,仍然遵循链状结构。(右)模块化 RAG 继承并发展自以前的范式,总体上表现出更大的灵活性。整个过程不限于顺序检索和生成; 它包括迭代检索和自适应检索等方法。
2.1 Naive RAG
Naive RAG 遵循包括索引、检索和生成在内的传统过程。
- 索引:从清理和提取各种格式的原始数据开始,将其转换为统一的纯文本格式。这些文本被分割成更小、更易于理解的块。然后,使用嵌入模型将这些块编码为向量表示,并存储在向量数据库中。这对于在后续检索阶段实现高效的相似性搜索至关重要。
- 检索:收到用户查询后,RAG 系统使用与索引阶段相同的编码模型,将查询转换为向量表示。然后计算查询向量与索引语料库中的块向量之间的相似性分数。系统确定优先级,并检索与查询最相似的前 K 个数据块。这些块随后用作 prompt 中的扩展上下文。
- 生成:提出查询和所选文档被合成到一个连贯的提示中,然后由一个大型语言模型生成响应。
图 2:RAG 流程的代表性实例应用于问答。它主要包括 3 个步骤。1)索引:文档被拆分为块,编码为向量,并存储在向量数据库中。2)检索:根据语义相似性检索与问题最相关的前 k 个块。3)生成:将原始问题和检索到的 chunk 一起输入到 LLM 以生成最终答案。
其缺点在于:
- 检索挑战:在检索阶段,通常难以实现精度和召回率。这可能导致选择错位或不相关的块,以及丢失关键信息。
- 生成困难:模型可能会面临幻觉问题,从而降低响应的质量和可靠性。
- 增强障碍:检索到的信息可能与不同的任务不匹配或冗余。面对复杂的问题,基于原始查询的单次检索可能不足以获取足够的上下文信息。
鉴于以上问题,很多时候人们可能更关注检索的结果,而不是模型生成的回答。
2.2 高级 RAG
高级 RAG 旨在克服 Naive RAG 的局限性,专注于提高检索质量,采用检索前和检索后策略。
- 预检索过程:优化索引结构和原始查询。涉及的策略有:增强数据粒度、优化索引结构、添加元数据、对齐优化和混合检索。
- 检索后过程:选择基本信息、强调关键部分并缩短要处理的上下文。主要方法包括重新排序块(rerank chunks)和上下文压缩(context compressing)。
(检索优化的具体方法详见下一章)
2.3 模块化 RAG
模块化 RAG 架构提供了增强的适应性和多功能性。它结合了多种策略来改进各个组件,例如添加用于相似性搜索的搜索模块,并通过微调来优化检索器。
2.3.1 新模块
Modular RAG 框架引入了新组件以提升检索和处理能力,如图所示:
- Search 模块适应特定场景,使用 LLM 生成的代码和查询语言,直接搜索各类数据源,如搜索引擎和数据库。
- RAGFusion 通过多重查询策略并行搜索和智能重新排序,解决传统搜索的局限性,发现更多知识。
- Memory 模块利用 LLM 的记忆创建一个无限的记忆池,通过自我增强优化文本与数据的匹配。
- Routing 模块根据查询选择最佳路径,如摘要、数据库搜索或信息合并。
- Predict 模块通过直接生成上下文减少冗余,确保信息相关性。
- Task Adapter 模块为不同任务定制 RAG,自动化提示检索并通过少量示例生成任务专用检索器。
2.3.2 新模式
允许模块替换或重新配置以解决特定挑战,提供卓越的适应性。这超越了之前的固定结构。模块化 RAG 通过集成新模块或调整现有模块之间的交互流程,扩展了这种灵活性,从而增强其在不同任务中的适用性。
RAG 系统的灵活架构使其更易于与其他技术集成,如微调或强化学习。可以针对更好的检索结果微调检索器,或者通过协同微调优化输出。
2.4 RAG 与微调
在 LLMs 中,RAG 经常与 Fine-tuning(FT)和提示工程进行比较。每种方法都有其独特的特性。提示工程利用模型的固有功能,对外部知识和模型适应的需求最小。RAG 可以提供量身定制的信息检索,非常适合精确的信息检索任务。FT 则相当于学生随着时间的推移内化知识,适用于需要复制特定结构、风格或格式的场景。
RAG 和 FT 并不相互排斥,可以相互补充,从而在不同层面增强模型的能力。在某些情况下,它们的结合使用可能会带来最佳性能。优化 RAG 和 FT 的过程可能需要多次迭代才能获得令人满意的结果。
3 检索
检索的几个关键问题包括:检索来源、检索粒度、检索的预处理,以及嵌入模型的选择。
3.1 检索源
3.1.1 数据的结构
最初,文本是主流的检索来源。随后,检索源扩展到包括半结构化数据(PDF)和结构化数据(知识图谱 KG)以进行增强。最近的研究越来越倾向于利用大语言模型(LLMs)进行检索和增强。
非结构化数据:文本是使用最广泛的检索源。除了百科全书式数据外,常见的非结构化数据还包括跨语言文本和特定领域的数据(如医学和法律)。
半结构化数据:通常指包含文本和表格信息组合的数据,例如 PDF。在处理半结构化数据时,一种方法是利用 LLMs 对数据库内的表格进行分析。或者,可以使用基于文本的方法将表格转换为文本格式,以便进一步分析。
结构化数据:例如知识图谱(KG),需要额外的工作来构建、验证和维护。
LLMs 生成的内容:利用 LLMs 的内部知识,有时生成的上下文包含更准确的答案,因为它与因果语言建模预训练目标更加一致。这可能需要将问题分类为已知或未知,并有选择地利用外部数据。
3.1.2 检索粒度
粗粒度检索单元可以为问题提供更相关的信息,但它们也可能包含冗余内容,可能会分散下游任务中的检索器和语言模型的注意力。细粒度检索单元增加了检索的负担,并且不能保证语义完整性和满足所需的知识。
在文本中,检索粒度范围从精细到粗略,包括 Token、Phrase、Sentence、Proposition、Chunks 和 Document。在知识图谱(KG)上,检索粒度包括 Entity、Triplet 和 sub-Graph。
请注意检索的粒度需要适应下游任务。
3.2 索引优化
在索引阶段,文档会被处理、分割,并转换为 Embeddings 存储在矢量数据库中。
3.2.1 分块策略
最常见的方法是将文档拆分为固定数量的标记块。这可能会导致句子被截断。通过使用优化的递归分割和滑动窗口方法,可以在多个检索过程中合并全局相关信息,从而实现分层检索。例如,Small2Big 方法将句子(small)作为检索单元,并将前后句子(big)作为上下文提供给 LLMs。
3.2.2 附加元数据
可以使用元数据信息(如页码、文件名、作者、类别时间戳)来丰富块的信息。通过这些元数据可以进行筛选和检索,从而限制检索范围,确保知识的时效性并避免过时信息的干扰。
除了从原始文档中提取元数据外,还可以人工构建元数据。例如:添加段落的摘要,以及引入假设性问题。这种方法也称为反向 HyDE。具体做法是,使用 LLM 生成文档可以回答的问题,然后在检索时计算原始问题与假设问题之间的相似度,以减少问题与答案之间的语义差距。
3.2.3 结构索引
增强信息检索的一种有效方法是为文档建立层次结构。RAG 系统可以加快相关数据的检索和处理。
分层索引结构:文件以父子关系排列,并有块链接到它们。数据摘要存储在每个节点上,有助于快速遍历数据并帮助 RAG 系统确定要提取的块。这种方法还可以减轻区块提取问题引起的错觉。
知识图谱索引:利用知识图谱 (KG) 构建文档的层次结构有助于保持一致性。它描绘了不同概念和实体之间的联系,显著减少了幻觉。为了捕捉文档内容和结构之间的逻辑关系,KGP 提出了一种使用 KG 在多个文档之间构建索引的方法。此 KG 由节点(表示文档中的段落或结构)和边缘(表示段落或关系之间的语义/词汇相似性)组成,有效地解决了多文档环境中的知识检索和推理问题。
3.3 查询优化
制定一个精确而清晰的问题是困难的,尤其对于复杂问题来说。语言的复杂性和歧义性使得这一过程更加具有挑战性。语言模型在处理专业词汇、多义词或模糊缩写时,经常会遇到困难。
3.3.1 查询扩展
将单个查询扩展为多个查询可以丰富查询的内容。
- 多查询:使用提示工程扩展查询,并通过大语言模型来处理,这些查询常可同时执行。
- 子查询:子问题规划的过程是生成必要的子问题来提供上下文和完整回答原始问题。这类似于查询扩展。具体来说,复杂问题可以通过从最少到最多提示法分解成一系列简单的子问题。
- 验证链:经过 LLM 验证后的扩展查询可以减少虚假信息。验证后的扩展查询通常更可靠。
3.3.2 查询转换
基于转换后的查询而不是用户的原始查询来检索数据块。
查询重写:提示 LLM 重写查询。除了使用 LLM 进行查询重写外,还可以使用专门的小型语言模型。
另一种查询转换方法是使用提示工程,让 LLM 在原始查询的基础上生成一个高级概念问题,以便后续检索。使用 Step-back Prompting 方法,将原始查询抽象出来,生成一个更高层次的问题。
3.3.3 查询路由
基于不同的查询,路由到不同的 RAG 管道,适用于多功能 RAG 系统,旨在适应不同的场景。
元数据路由器/过滤器:第一步涉及从查询中提取关键字(entity),然后根据块中的关键字和元数据进行筛选,以缩小搜索范围。语义路由器是一种利用查询语义信息的路由方法。
3.4 嵌入
在 RAG 中,检索是通过计算问题块和文档块嵌入之间的相似性来实现的。嵌入模型的语义表示能力在这一过程中起着关键作用。这主要包括一个稀疏编码器(BM25)和一个密集检索器(基于 BERT 架构的预训练语言模型)()。
Hugging Face 有 MTEB 和 C-MTEB 排行榜。关于“使用哪种嵌入模型”,没有万能答案。不过,某些特定模型更适合特定用例。
3.4.1 混合/混合检索
稀疏和密集嵌入方法可以捕获不同的相关性特征,并且通过利用互补的相关性信息,相互受益。 例如,稀疏检索模型可用于为训练密集检索模型提供初始搜索结果。此外,可以使用预训练语言模型(PLM)来学习术语权重,以增强稀疏检索。这还证明了稀疏检索模型可以增强密集检索模型的零样本检索能力,帮助密集检索器处理包含稀有实体的查询,从而提高鲁棒性。
3.4.2 微调嵌入模型
在上下文明显偏离预训练语料库的情况下,尤其是在充满专有术语的高度专业化学科中,在自己的领域数据集上微调嵌入模型变得至关重要。这不仅能补充领域知识,还能对齐 retriever 和 generator。
3.5 适配器
为了避免对整个模型进行完全的微调(fine-tuning),可以使用一个轻量的适配器模块来帮助模型适应新的任务或功能需求。例如,轻量级的提示检索器能够从预先构建的提示池中自动检索出适合给定任务输入的提示,从而优化多任务能力。
4 生成
4.1 情境管理
冗余信息和过长的上下文会干扰 LLM。LLM 往往只关注长文本的开头和结尾,而忘记了中间部分。
4.1.1 重新排序
Reranking 从根本上重新排序文档块,既是增强器又是过滤器。可以使用基于规则的方法进行重新排序,这些方法依赖于预定义的指标,如多样性、相关性和 MRR,或者使用基于模型的方法,如 BERT 系列的编码器 - 解码器模型,以及通用的大型语言模型。
4.1.2 上下文选择/压缩
在 RAG 流程中,一个常见的误解是认为检索尽可能多的相关文档并将它们连接起来以形成冗长的检索提示是有益的。
LLMLingua 通过小型语言模型压缩提示内容,保留重要信息,减少不必要的词语,同时保持语言的完整性。PRCA 和 RECOMP 采用类似的方法,分别训练信息提取器和信息浓缩器,通过对比学习提高模型效率。
除了压缩上下文之外,减少文档数量还有助于提高模型答案的准确性。一种简单有效的方法是让 LLM 在生成最终答案之前评估检索到的内容相关性。
4.2 LLM 微调
当 LLM 在特定领域缺乏数据时,可以通过微调使其更好地适应场景和数据特征。微调的另一个好处是能够调整模型的输入和输出,使 LLM 适应特定的数据格式,如结构化数据的检索任务。
通过强化学习将 LLM 的输出与人类或检索器的偏好对齐是一种有效的方法。这可以通过人工标注和反馈来实现。此外,还可以通过蒸馏更强大的模型以及协调 LLM 与检索器的微调来进一步优化对齐效果。
5 RAG 中的 增强过程
在 RAG 领域,标准实践通常包括一个单一的检索步骤,然后是生成。这种方法可能效率低下,特别是在处理需要多步骤推理的复杂问题时,通常显得不足。
图 5:除了最常见的一次检索外,RAG 还包括三种类型的检索增强过程。(左)迭代检索(中)递归检索涉(右)自适应检索
5.1 迭代检索
根据初始查询和当前生成的文本,对知识库进行重复搜索的过程已被证明有效。通过多次检索迭代,能够提供更多上下文引用,从而增强后续答案生成的准确性。然而,这一过程可能会受到语义不连续和不相关信息积累的影响。
5.2 递归检索
根据先前搜索结果迭代优化查询。递归检索通过反馈循环逐渐找到最相关的信息,从而增强搜索体验。特别是在用户需求不明确或所寻信息高度专业化和复杂的情况下,它非常有用。
5.3 ### 自适应检索
使 RAG 系统能够自主确定是否需要外部知识检索以及何时停止检索和生成。例如,Flare 通过监控生成过程的置信度来自动进行检索。这简化了使用检索机制的决策过程,并提高了模型生成准确响应的自主判断能力。
6 任务与评价
6.1 下游任务
RAG 的核心任务仍然是问答(QA),包括传统的单跳/多跳 QA、多项选择、特定领域的 QA 以及适合 RAG 的长格式场景。除了 QA,RAG 还不断扩展到多个下游任务,例如信息提取(IE)、对话生成、代码搜索等。表 2 总结了 RAG 的主要下游任务及其相应的数据集。
(图表中的模型序号需要连接到引文,请见正文)
6.2 评估目标
从历史看,RAG 模型的评估主要集中在它们在特定下游任务中的表现。专门用于评估 RAG 模型独特特征的研究明显缺乏。主要评估目标包括:检索质量(命中率、MRR 和 NDCG)以及生成质量(忠实度、相关性、无害性和准确性)。
6.3 评估维度
RAG 模型的当代评估实践强调三个主要质量分数和四个基本能力,它们共同为 RAG 模型的两个主要目标的评估提供信息:检索和生成。
6.3.1 质量分数
质量分数包括上下文相关性、答案忠实度和答案相关性。
6.3.2 所需能力
四种能力:噪声鲁棒性、负抑制、信息集成和反事实鲁棒性。
- 噪声鲁棒性:评价模型在处理包含噪声(与问题相关但缺乏实质信息的文档)时的表现。
- 负面拒绝:评估模型能否在检索到的文档不包含回答问题所需知识时,正确选择不作答。
- 信息整合:评估模型从多个文档中整合信息以回答复杂问题的能力。
- 反事实鲁棒性:测试模型识别并忽略文档中已知错误信息的能力,即使被告知可能存在错误。
6.4 评估基准和工具
7 讨论与未来展望
阅读这部分时,摘录了一些比较触动我的内容:
- 目前,LLMs 可以轻松管理超过 200,000 个令牌的上下文。然而,RAG 仍然不可替代。一方面是长上下文模型的受推理速度的影响,另一方面,基于 RAG 的生成可以快速定位数据,以帮助用户验证生成的答案。
- 错误信息可能比完全没有信息更糟糕。因此,反事实输入能力是衡量 RAG 关键性能指标之一。
- RAG 与微调相结合正成为领先策略。
- 在工程化方面,需要提高检索效率、增加大型知识库中的文档调用率,并确保数据安全。
- 多模态 RAG,包括图像、音视频和代码 RAG,越来越受到重视。
RAG 生态系统总结如下图: