type
Post
status
Published
summary
在这篇综述中,我们关注的是面向大语言模型(Large Language Model)的检索增强生成技术。这项技术通过结合检索机制,增强了大语言模型在处理复杂查询和生成更准确信息方面的能力。大语言模型 (大语言模型,LLMs) 虽展现出强大能力,但在实际应用中,例如在准确性、知识更新速度和答案透明度方面,仍存在挑战。检索增强生成 (Retrieval-Augmented Generation, RAG) 是指在利用大语言模型回答问题之前,先从外部知识库检索相关信息。RAG 被证明能显著提升答案的准确性,并特别是在知识密集型任务上减少模型的错误输出。通过引用信息来源,用户可以核实答案的准确性,从而增强对模型输出的信任。
slug
rag-summary
date
Jan 30, 2024
tags
RAG
检索增强生成
category
大语言模型
password
icon
URL
Property
Feb 29, 2024 08:21 AM
本文的目的是系统性地概述检索增强生成(RAG)的整个流程,并特别关注通过知识检索来增强大语言模型生成的研究。
相关链接
概要导图
notion image
 

引言

LLMs的局限性

  • 通用模型:
    • 可能产生不准确的信息
    • 在处理特定领域或高度专业化的查询时表现出知识缺失
    • 微调需要消耗大量计算资源,成本高昂,且需要专业技术知识
  • 特定领域的纯参数模型
    • 难以保留训练语料库中的所有知识
    • 模型参数不能动态更新,参数知识随时可能过时
    • 参数的增加会导致训练和推理的计算成本增加
为了解决这种局限,将非参数化的语料库数据库与参数化模型相结合。这种方法被称为检索增强生成(Retrieval-Augmented Generation, RAG)

RAG的优势

  • 具有明显且易于实施的效果
  • 极大地提高了答案的准确性和相关性
notion image

背景

介绍 RAG的定义,并将其与其他优化技术(如微调)进行对比

RAG 主要阶段

  • 使用编码模型根据问题找到相关的文档;
  • 以找到的上下文作为基础,系统生成文本。

RAG 与微调

  • RAG好比给学生(模型)提供一本教科书,让它根据特定的问题去查找信息
    • 适用于模型需要解答具体问题或执行特定信息检索任务的情况
    • 不适合于教会模型理解广泛的领域或学习新的语言、格式或风格
  • 微调更像是让学生(模型)通过广泛学习来吸收知识
    • 特别适用于强化模型已有的知识、调整或定制模型的输出,以及给模型下达复杂的指令
    • 不适合于向模型中添加新的知识,或者在需要快速迭代新场景的情况下使用
RAG 和微调可以相互补充,从而在不同层次上增强模型的能力。
  • RAG在优化LLMs方面的优势:
    • RAG 通过关联外部知识来提高答案的准确性
    • RAG 能够识别到最新信息保持答案的及时性
    • RAG 引用可以核实的数据保证答案的透明度
    • RAG 多领域提供专业知识实现高度的定制化
    • RAG 设置角色和安全控制保障隐私和安全性
    • RAG 数据库更新就能更新知识库更具扩展性
    • RAG 检索结果直接对应最终结果有高可控性
    • RAG 无需更新训练集和训练参数更经济实惠

RAG 框架

原始RAG,只是具备了RAG最基础的部分,离线索引构造、在线检索以及大模型生成,高级RAG则是在这3个流程里增加更多细化的工作,用于进一步优化,例如数据预处理、滑动窗口、文章切片等,重点在检索层面的优化,提升检索模块的质量,而模块化RAG则是一个更为精细的系统,把简单的RAG组件拓展成更多的复杂的模块以应对更复杂的需求,例如query和文档的改写、过滤、精排等,或者引入多模态、决策模块(或者大家爱说的agent)、后处理等。
notion image

原始 RAG (Naive RAG,朴素RAG)

原始 RAG主要模块

  • 索引:在离线状态下,从数据来源处获取数据并建立索引的过程
    • 数据索引: 包括清理和提取原始数据,将 PDF、HTML、Word、Markdown 等不同格式的文件转换成纯文本。
    • 数据分块: 将加载的文本分割成更小的片段。由于语言模型处理上下文的能力有限,因此需要将文本划分为尽可能小的块。
    • 数据嵌入:这一阶段涉及通过语言模型将文本编码为向量的过程。所产生的向量将在后续的检索过程中用来计算其与问题向量之间的相似度。由于需要对大量文本进行编码,并在用户提问时实时编码问题,因此嵌入模型要求具有高速的推理能力,同时模型的参数规模不宜过大。
    • 创建索引: 完成嵌入之后,下一步是创建索引,将原始语料块和嵌入以键值对形式存储,以便于未来进行快速且频繁的搜索。
  • 检索
    • 根据用户的输入,采用与第一阶段相同的编码模型将查询内容转换为向量。系统会计算问题向量与语料库中文档块向量之间的相似性,并根据相似度水平选出最相关的前 K 个文档块作为当前问题的补充背景信息。
  • 生成
    • 将给定的问题与相关文档合并为一个新的提示信息。随后,大语言模型(LLM)被赋予根据提供的信息来回答问题的任务。根据不同任务的需求,可以选择让模型依赖自身的知识库或仅基于给定信息来回答问题。如果存在历史对话信息,也可以将其融入提示信息中,以支持多轮对话。

朴素RAG面临的挑战

  • 检索质量: 
    • 低精度,即检索集中的文档块并不都与查询内容相关,这可能导致信息错误或不连贯。
    • 低召回率,即未能检索到所有相关的文档块,使得大语言模型无法获取足够的背景信息来合成答案。
    • 过时信息,因为数据冗余或过时可能导致检索结果不准确。
  • 生成质量: 
    • 制造错误信息,即模型在缺乏足够上下文的情况下虚构答案。
    • 回答不相关,即模型生成的答案未能针对查询问题。
    • 其他质量问题,生成有害或偏见性回应也是一个问题。
  • 增强过程: 
    • 上下文信息:如何将检索到的文段的上下文有效融入当前的生成任务。如果处理不得当,生成的内容可能显得杂乱无章。
    • 冗余和重复:当多个检索到的文段包含相似信息时,冗余和重复成为问题,这可能导致生成内容的重复。
    • 检索结果排序:如何判断多个检索到的文段对生成任务的重要性或相关性非常有挑战性,增强过程需要恰当地评估每个文段的价值。检索到的内容可能具有不同的写作风格或语调,增强过程需调和这些差异,以确保最终输出的一致性。
    • 缺乏创新和总结:生成模型可能会过度依赖于增强信息,导致生成的内容仅是重复检索到的信息,而缺乏新的价值或综合信息。

高级 RAG

  • 预检索处理(优化数据索引:旨在提高索引内容的质量)
    • 提升数据粒度:直接进行向量表征得到的向量往往粒度比较粗,为了改进文本的标准化和一致性,剔除无关信息和特殊字符,提升检索效率
    • 优化索引结构:通过调整数据块大小、改变索引路径和加入图结构信息的方式,能优化检索效果。
    • 添加元数据信息:当索引被分割成多个块时,如何高效检索便成为关键。通过将引用的元数据,如日期、用途、章节、引用小节等嵌入到数据块中,可以提高检索的效率和准确性。
    • 对齐优化: 即创建适合用每篇文档回答的问题,并将这些问题与文档结合起来。有助于解决文档间的对齐问题和不一致性。
    • 混合检索: 融合了关键词搜索、语义搜索和向量搜索等多种技术,适应不同类型的查询需求,确保能够一致地检索到最相关和内容丰富的信息。混合检索作为检索策略的重要补充,能够显著提升 RAG 流程的整体性能。
  • 嵌入 (Embedding)
    • 微调嵌入:针对特定问题、特定领域或者是特定的检索对,用特定的向量表征一般都会有比较好的效果,因此在有一定训练数据下,很推荐微调以获取更高的上限。根据文档块制定问题,其中问题和答案(文档块)构成了微调过程中的训练对。
    • 动态嵌入:根据单词出现的上下文进行调整,为每个单词提供不同的向量表示。理想的嵌入应该包含足够的上下文,以保证良好的结果。现在的模型,基本都已经算动态嵌入了。
  • 检索后处理流程
    • ReRank(重新排序):一方面,提及Diversity Ranker会根据文档的多样性进行重新排序,而LostInTheMiddleRanker则会交替地将最佳文档放在上下文窗口的开始和结束位置,从而获取更加合适而又丰富的结果,再者,为了进一步强化排序结果,通过一些精排模型,也能进一步优化排序结果,如bgererank5等。
    • prompt压缩:在进行大模型生成之前,先进行prompt压缩,减少噪音信息,凸显关键段落,有利于最终的回复。
  • RAG 管道优化: 检索过程的优化旨在提升 RAG 系统的效率和信息质量
    • 混合搜索的探索: RAG 系统巧妙结合了基于关键词、语义以及向量的多种搜索技术。从而能够应对不同的查询类型和信息需求,有效地获取最相关且内容丰富的信息。
    • 递归检索与查询引擎: 把索引文段和返回文段进行分拆,计算相似度的时候是query和小片段,但是返回的是大片段,用大片段给大模型做检索增强。
    • StepBack-prompt 方法: 通过诱导让大模型逐步探索出方案
    • 子查询: 根据不同场景,我们可以采取多种查询策略,如使用 LlamaIndex 等框架提供的查询引擎、树状查询、向量查询或基本的块序列查询。有一些类似“检索语法树”的概念,例如可以用“should”、“must”、“filter”之类的检索策略来约束整个检索,使之更加精准可控,这个是能提升检索的效果的。
    • HyDE 方法: 让大模型对query先生成一个答案,这个答案允许是错的,但里面的关键词基本不会差异很大,在这个假设下,对答案做embedding相比对原query能更接近索引中的doc的embedding,此时对检索难度是有很大程度的下降。

模块化 RAG

模块化RAG是对高级RAG的一种升级,这里面集成了大量优化策略,并将这些策略进行重组,形成完整的模块独立完成特定功能,其实很多内容和上面提及的很接近,只是更加模块化。
  • 搜索模块:相比于前面提及的RAG中的简单搜索,这里的搜索可以涵盖大量经典搜索的必要组件,如query改写、意图识别、实体检索等,还涉及多路召回等工程思路,再者,也要开始面对各种千奇百怪的文档形式,表格、数字公式等。
  • 记忆模块:借助大模型本身的记忆功能来实现,寻找和大模型历史回复最接近的,来进行回复
  • 额外生成模块:提供除生成回复结果之外的其他生成能力,例如对文档的精简,删除检索噪音等。
  • 任务适配模块:让RAG系统能够适配不同的下游任务,有些时候,类似用大模型进行分类,其实也能使用RAG的模式进行优化。
  • 对齐模块:用于对齐query和doc,毕竟query和doc本身的语义空间就有巨大差异,直接进行相似度计算的难度其实很大,因此可以进行一定的调整。
  • 验证模块:作为检索的后处理,验证query和检索结果的相关性,即确定检索得到的文档是否能够回答这个问题。
新增模块的方法:
  • 直接进行增加和替换。
  • 调整模块之间的协同流程,尤其是大模型和检索模块之间的互动。

RAG 检索组件(检索器)

如何获得准确的语义表示?

  • 分块:语义块的太大和太小对结果都有影响,固定的滑动窗口可能很难获得最优。
    • 滑动窗口技术通过多次检索,聚合全局相关信息,实现分层检索。
    • Small2big 技术在搜索过程中使用小文本块,并为语言模型提供更大的相关文本块进行处理。
    • 摘要嵌入(Abstract embedding)技术对文档摘要执行 Top K 检索,以提供完整的文档上下文。
    • 元数据过滤(Metadata Filtering)技术通过文档的元数据进行过滤。
    • 图索引(Graph Indexing)技术把实体和关系转化为节点和连接,这在处理多跳问题时显著提升了相关性。
  • 微调语义模型:简单的baseline可以用一些已有的开源模型,但后续上限提升还是离不开微调向量表征模型。
    • 领域知识微调:加入领域的数据语料进行训练。当前微调嵌入模型的主流方法使用的数据集包括查询(Queries)、语料库(Corpus)和相关文档(Relevant Docs)
    • 对下游任务的微调:直接奔着下游任务来微调,直面任务,例如我们能要从qq匹配转为qa匹配,那模型肯定要做比较大的调整了

如何协调查询和文档的语义空间?

很多时候query和doc其实本身的语义其实并不是相似,只是相关
  • 查询重写&文档特征提取
    • query侧,从query拓展出更多和doc匹配的信息
    • doc侧,也可以通过特征抽取、问题挖掘等方式来让doc和query更接近。
  • 嵌入变换
    • embedding训练是另一个思路,前面也多少有些提及了,就是优化模型了,这里提出了一些专项的方法,例如对比学习、围绕实体进行的mask等策略。

调整检索器结果以适应大语言模型的需求

在检索没什么大问题的情况下,为什么大模型仍旧回复不好,这就像是做阅读理解一样,答案就在原文里,为什么就是答不对,这里不完全是大模型或者是检索的问题,更多问题出在了两者的协同上。
  • LLM 监督下的训练:
    • 用LLM的结果来反馈给上游的检索,从而训练上游的检索模型
  • 插入适配器:外接适配器来进行模型对齐
    • 在上下文提取阶段和奖励驱动阶段训练适配器,并通过基于 Token 的自回归策略来优化检索器的输出。——PRCA[Yang et al., 2023b]
    • 计算跨注意力分数,挑选出得分最高的输入 Token,有效地进行 Token 过滤。——TokenFiltering[Berchansky et al., 2023]
    • 提取和生成压缩器,通过选择相关的句子或合成文档信息来生成摘要,实现多文档查询聚焦摘要。——RECOMP[Xu et al., 2023a]
    • 通过指令性微调将知识注入到一个白盒模型中,替换了检索器模块直接根据查询输出相关文档。——PKG[Luo et al., 2023]

RAG 生成组件

生成在绝大部分的情况下的作用就是把检索到的信息转化为针对回答、语言流畅的回复,与此同时,需要确保回复的忠诚度,以及特定场景下指令对回复风格的约束。

如何通过检索后处理提升检索结果?

通过检索器从大型文档数据库中检索到相关信息后,对这些信息进行进一步的处理、过滤或优化。
  • 信息压缩:减少信息噪音、解决上下文长度限制和提升生成效果
    • 信息提取器:训练信息提取器,提取精简的上下文——PRCA [Yang et al., 2023b]
    • 过滤排序:小语言模型 (SLMs)充当过滤器,大语言模型 (LLMs)作为排序器——[Ma et al., 2023b]
  • 文档重排
    • 对文档记录进行重新组织,优先安排最相关的内容位于前列,同时将文档总量控制在一定数量之内。——[Zhuang et al., 2023]。

如何优化生成器应对输入数据?

  • 通用优化过程
    • 有监督学习
  • 运用对比学习
    • 为了避免“暴露偏差”,即要让模型接触到更丰富的反馈,而做出的操作,能提升模型回复的多样性和鲁棒性。

RAG 技术的增强手段

RAG 在各个增强阶段的应用

  • 预训练阶段,很多研究者在尝试找到更适合学习到知识的预训练手段,例如用MLM的模式,或者是用类似RAG的方式,都能让大模型在预训练阶段学到知识,从而提升RAG整体的效果。
  • 而在微调阶段,可操作的除了大模型本身,拓展到检索器、生成器的优化,一方面能单独提升其中一个的效果,也能够两者联合训练,提升两者各自能力的同时提升他们的系统配合能力。但同时要注意,微调所需要的数据结构比预训练阶段要求是更高的,且资源也不低。
  • 至于推理阶段,即融合检索结果与大模型,此处其实还有很多可以做的工作,例如增加知识引导、跨语言、思维链引导等,其实都对两者得到融合起到很重要的好处,这些优化体现出的鲜明特点是轻量、高效、无需更新模型参数,这种经济的方式是大家在日后项目落地时能快速尝试的。

数据增强来源

  • 首先是非结构化数据,这个应该是目前最常见的部分,大部分是文本型的,最简单的处理方式是用移动窗口进行分块,当然还有类似用token、短语之类的方式,这些应该都是比较通用的处理方案了。
  • 其次是结构化数据,作者专门提到的是知识图谱(虽然不止这一个),知识图谱的引入有利于大模型使用这些知识。
  • 最后就是大模型生成的内容,让大模型自己生成的内容来辅助自己生成,这是一个比较有趣的思路,同时也带来一些意外效果,例如自己判断“已知或未知”、判断检索或者回复策略等。

增强过程

  • 迭代检索强调知识的稳健性和完整性,毕竟某些知识可能会分散在很多文档里,此时通过特定的检索策略,能够把这些分散信息给融合起来。
  • 适应性检索则强调让大模型来控制检索策略(有些agent那块的思想了),查什么、怎么查等,这样能提升检索的效率和准确性。

RAG 评估

评估方法

  • 独立评估
    • 检索模块:指标包括命中率 (Hit Rate)、平均排名倒数 (MRR)、归一化折扣累积增益 (NDCG)、精确度 (Precision) 等
    • 生成模块:指标有rouge等,主要关注上下文相关性,即检索到的文档与查询问题的关联度(评估的是检索到的文档与查询形成的LLM的输入)
  • 端到端评估:对最终结果进行评估
    • 无标签:无标注评估更多是主观性的(人工的)评估;准确性、相关性和无害性
    • 有标签:准确率 (Accuracy) 和精确匹配 (EM),rouge、bleu等

关键指标和能力

  • 关键指标
    • 答案的准确性:生成的答案与给定上下文的真实性一致,确保不会发生冲突或偏离
    • 答案的相关性:要求所答要对应所问,聚焦“答非所问”这个问题
    • 上下文相关性:关注长文本下的信息继承和提取能力,一般用在长文本的RAG问题
  • 关键能力
    • 抗噪声能力: 这项能力评估模型处理与问题相关但无效信息的噪声文档的效率。
    • 拒绝无效回答能力: 当模型检索到的文档缺乏解决问题所需的信息时,模型应正确地拒绝回答。在测试拒绝无效回答时,外部文档仅包含无效信息。理想状态下,大语言模型应发出“信息不足”或类似的拒绝信号。
    • 信息综合能力: 这项能力评价模型是否能整合多个文档中的信息,以回答更复杂的问题。
    • 反事实鲁棒性测试: 此项测试旨在评估模型在被告知检索信息可能存在风险时,是否能识别并纠正文档中的错误信息。反事实鲁棒性测试包括一些大语言模型能直接回答的问题,但相关外部文档却含有错误事实。

评估框架(自动评估方法)

  • RAGAS:关注于检索系统挑选关键上下文段落的能力、大语言模型准确利用这些段落的能力以及生成内容的整体质量
    • 答案忠实度评估:利用大语言模型 (LLM) 分解答案为多个陈述,检验每个陈述与上下文的一致性。最终,根据支持的陈述数量与总陈述数量的比例,计算出一个“忠实度得分”。
    • 答案相关性评估:使用大语言模型 (LLM) 创造可能的问题,并分析这些问题与原始问题的相似度。答案相关性得分是通过计算所有生成问题与原始问题相似度的平均值来得出的。
    • 上下文相关性评估:运用大语言模型 (LLM) 筛选出直接与问题相关的句子,以这些句子占上下文总句子数量的比例来确定上下文相关性得分。
  • ARES:自动化评价 RAG 系统在上下文相关性、答案忠实度和答案相关性三个方面的性能
    • 生成合成数据集:ARES 首先使用语言模型从目标语料库中的文档生成合成问题和答案,创建正负两种样本。
    • 训练大语言模型 (LLM) 裁判:然后,ARES 对轻量级语言模型进行微调,利用合成数据集训练它们以评估上下文相关性、答案忠实度和答案相关性。
    • 基于置信区间对 RAG 系统排名:最后,ARES 使用这些裁判模型为 RAG 系统打分,并结合手动标注的验证集,采用 PPI 方法生成置信区间,从而可靠地评估 RAG 系统的性能。

未来展望

  1. 垂直优化
      • 长上下文的处理:一旦上下文窗口的限制被移除,RAG 如何适应这一变化
      • 鲁棒性:如何增强 RAG 的鲁棒性,已成为研究者们关注的热点
      • RAG 与微调(Fine-tuning)的协同作用也是研究的重点之一
      • 大规模知识库场景中提高检索效率和文档召回率,以及如何保障企业数据安全——例如防止 LLM 被诱导泄露文档的来源、元数据或其他敏感信息——都是亟待解决的关键问题
  1. 横向扩展
      • 横向拓展指的是模态、信息或者内容结构上的拓展,例如图像、文本、代码、结构化知识、音视频等,无论是理解、检索还是生成,都仍有很大的空间。
  1. RAG 生态系统的构建
      • RAG本身不能只当做是一个检索+生成的问答系统,它本身也是大模型落地的一个重要方向,它的功能不能局限在问答本身,因此下游任务仍可以继续挖掘,再者,与之配合的评估方案也需要跟上。
      • RAG的开发对工程能力的要求相比之前要高不少,至少不再是“一个模型完成一件事”了,还有很多的组件组合,因此这块对技术栈和对应工具的要求也会变高,现在比较流行的是Langchain和LLamaIndex,但仍有优化空间。
 

名词解释

  • RAG (Retrieval-Augmented Generation):特指一种模式即:模型在回答问题或生成文本时,首先从广阔的文档库中寻找相关信息。然后,模型使用这些找到的信息来生成回答或文本,从而提高其预测的准确度。
 
 

  • Twikoo
  • Giscus
  • GitTalk