RAG系列-基础篇

从当前篇开始,将推出 RAG系列的学习、思考、实践的分享,也将作为前期文章的后续延展。

之前的几篇文章:

【RAG】语义搜索的实现

【RAG】语义搜索的评测方法

【RAG】语义搜索提升准确率的方法

RAG框架的产生源于《Retrieval-Augmented Generation forKnowledge-Intensive NLP Tasks》的论文,该论文在2020年5月发布,而当时主流的大模型还是GPT-3。该框架允许模型访问超出其训练数据的信息,使其在每次生成时能够利用检索到的外部专业知识和准确数据,从而更有效地回答用户的问题。相关的原理也可以查看《语义搜索的实现》一文。


为什么需要RAG

作为产品经理,原因可能比最终实现更重要,因为其代表的是针对某些场景的缺失。成业大模型,败也大模型。RAG的产生与大模型紧密相关,更多的与模型的训练过程有关。

知识新不新

大模型的产生第一阶段即预训练,需要依赖大量的数据进行无监督的学习;而这些数据都来自于网络。所以模型在训练截止日期之前的知识是固定的,是无法进行实时更新的。每天新增的知识也没办法实时的塞入模型训练中。

知识全不全

除了网络上公开的资料之外,很多有价值的内容都在互联网围墙之内,是私有的知识和数据。这些知识是大模型无法获取和学习的。企业如果自己的数据能够被可靠的使用,RAG无疑是方案之一。

全不全的背后其实数据安全问题,大家都担心自己的数据泄露被大模型“偷师”。

知识准不准

大模型的幻觉一直存在,给出的答案也往往无法解释;通过RAG可以附带应用信息,帮助使用者进行人工的二次决策。

实现难不难

想要解决以上问题,除了RAG也可以通过微调等方式实现。但是RAG相较于微调来说,成本更低、难度更小,更加符合业界需要。


RAG与微调的关系

刚刚提到了难不难的问题,现在也对比下 RAG和微调的关系:RAG(检索增强生成)与微调(Fine-Tuning)是大语言模型优化的两种主流方法,核心区别在于知识更新方式模型调整机制

以下是关键差异的对比表格:

对比维度RAG(检索增强生成)微调(Fine-Tuning)
技术原理通过连接外部数据库实时检索信息,将检索结果与模型生成结合通过调整模型权重参数,使模型适应特定任务或领域
数据依赖依赖外部实时更新的私有数据库(如企业文档、知识库)依赖静态训练数据集(需提前标注或整理)
应用场景适合需要实时更新知识、强调事实准确性的场景(如客服问答、动态知识查询)适合固定任务模式、需深度领域适应的场景(如专业术语生成、风格迁移)
资源消耗计算成本较低(仅需检索系统与模型交互)计算成本高(需GPU资源重新训练模型)
实时更新能力支持动态更新知识库(修改数据库即可生效)更新需重新训练模型(数据变化时需重复微调)
可解释性结果可追溯(可展示检索来源)黑箱操作(无法直接追溯生成依据)
维护成本需维护数据库和检索系统(如索引优化)需定期再训练以保持性能(数据漂移时成本增加)

RAG通过外部知识增强实现动态知识扩展,适合对实时性和可解释性要求高的场景;微调通过参数优化实现模型深度适应,更适合固定任务模式下的性能突破。


RAG的缺点又有哪些

上文提到了RAG产生的原因,但任何事情都有两面性,RAG也有其不足的地方。我们需要将RAG从LLM和传统搜索两个维度上来进行相对性的比较。

相较于传统搜索,RAG系统的处理耗时是比较久的;同时,由于大模型的上下文的限制,可能存在一些有效信息的缺失。

相较于大模型而言,由于增加了检索环节,将更加依赖检索等外部环节的准确度,也更加依赖知识库的质量。


RAG的演进

洞见参考来源发布日期
提出一种名为纠正检索增强生成(CRAG, Corrective Retrieval Augmented Generation)的方法,旨在提升 RAG 系统生成内容的稳定性和准确性。其核心在于增加一个能够自我修正的组件至检索器中,并优化检索文档的使用,以促进更优质的内容生成。此外,引入了一种检索评估机制,用于评价针对特定查询检索到的文档的整体品质。通过网络搜索和知识的优化利用,能够有效提升文档自我修正和利用的效率。纠正检索增强生成(opens in a new tab)2024年1月
RAPTOR 模型通过递归方式嵌入、聚类并总结文本信息,自底向上构建出层次化的总结树。在使用时,该模型能够从这棵树中检索信息,实现对长文档在不同抽象层面上信息的综合利用。RAPTOR:递归抽象处理用于树组织检索(opens in a new tab)2024年1月
开发了一个通用框架,通过大语言模型(LLM)与检索器之间的多步骤互动,有效处理多标签分类难题。在上下文中学习用于极端多标签分类(opens in a new tab)2024年1月
研究表明,通过提取高资源语言中语义相似的提示,可以显著提升多语言预训练语言模型在多种任务上的零样本学习能力。从分类到生成:洞察跨语言检索增强的 ICL(opens in a new tab)2023年11月
针对 RAGs 模型在处理噪声较多、不相关文档以及未知情境时的稳健性进行了改善,通过为检索文档生成序列化阅读笔记,深入评估其与提问的相关性,并整合信息以构建最终答案。链式笔记:增强检索增强语言模型的鲁棒性(opens in a new tab)2023年11月
通过去除可能不会对答案生成贡献关键信息的标记,优化了检索增强阅读模型的处理流程,实现了高达 62.2% 的运行时间缩减,同时保持性能仅降低了2%。通过标记消除优化检索增强阅读器模型(opens in a new tab)
通过对小型语言模型 (LM) 进行指令式微调,我们开发了一个独立的验证器,以验证知识增强语言模型 (knowledge-augmented LMs) 的输出及其知识准确性。这种方法特别有助于解决模型在面对特定查询时未能检索相关知识,或在生成文本中未能准确反映检索到的知识的情况。知识增强语言模型验证(opens in a new tab)2023年10月
我们设立了一个基准测试,以分析不同大型语言模型 (LLMs) 在检索增强生成 (RAG) 所需的四项核心能力——噪声容忍、排除不相关信息、信息融合和对反事实情境的适应性——的表现。大型语言模型在检索增强生成中的基准测试(opens in a new tab)2023年10月
介绍了一种自我反思的检索增强生成 (Self-RAG) 框架,旨在通过检索和自我反思来提升语言模型的质量和事实性。该框架利用语言模型动态检索信息,并通过反思标记来生成和评估检索到的内容及其自生成内容。自我反思检索增强生成: 通过自我反思学习检索、生成及自我批判(opens in a new tab)2023年10月
通过生成增强检索 (GAR) 和检索增强生成 (RAG) 的迭代改善,提高了零样本信息检索的能力。该过程中的改写-检索阶段有效提升了召回率,而重排阶段则显著提高了精度。零样本信息检索中的GAR与RAG相结合的新范式(opens in a new tab)2023年10月
通过使用基于 43B GPT 模型的预训练和从 1.2 万亿 Token 中检索信息,我们预训练了一个 48B 的检索模型。进一步通过指令式微调,该模型在多种零样本任务上相比经过指令式微调的 GPT 模型显示出显著的性能提升。InstructRetro: 检索增强预训练后的指令式微调(opens in a new tab)2023年10月
通过两步精细调整,我们为大型语言模型增加了检索功能:一步是优化预训练的语言模型以更有效利用检索到的信息,另一步则是改进检索器以返回更符合语言模型偏好的相关结果。这种分阶段的微调方法,在要求知识利用和上下文感知的任务中,显著提升了性能。检索增强的双重指令微调 (RA-DIT)(opens in a new tab)2023年10月
介绍了一种提升 RAGs 在面对不相关内容时鲁棒性的方法。该方法通过在训练期间混合使用相关与不相关的上下文,自动产生数据以微调语言模型,从而有效利用检索到的文段。让基于检索增强的语言模型对无关上下文更加鲁棒(opens in a new tab)2023年10月
研究表明,采用简单检索增强技术的 4K 上下文窗口的大语言模型在生成过程中,其表现与通过位置插值对长上下文任务进行微调的 16K 上下文窗口的大语言模型相媲美。当检索遇上长上下文的大语言模型(opens in a new tab)2023年10月
在上下文融合前将检索文档压缩为文本摘要,既降低了计算成本,也减轻了模型从长文档中识别关键信息的难度。RECOMP: 用压缩和选择性增强提升检索增强语言模型(opens in a new tab)2023年10月
提出了一个迭代式的检索与生成协同工作框架,它结合了参数化和非参数化知识,通过检索与生成的互动来寻找正确的推理路径。这一框架特别适合需要多步推理的任务,能够显著提高大语言模型的推理能力。检索与生成的协同作用加强了大语言模型的推理能力(opens in a new tab)2023年10月
提出“澄清树”框架,该框架通过少样本提示并借助外部知识,为含糊问题递归构建一个消歧树。然后利用这棵树产生详细的答案。利用检索增强大语言模型回答含糊问题的“澄清树”方法(opens in a new tab)2023年10月
介绍了一种使大语言模型能够参考其之前遇到的问题,并在面对新问题时动态调用外部资源的方法。借助自我知识的大语言模型检索增强策略(opens in a new tab)2023年10月
提供了一组评估指标,用于从多个维度(如检索系统识别相关及集中上下文段落的能力、大语言模型忠实利用这些段落的能力,以及生成内容本身的质量)评价不同方面,而无需依赖人工注释的真实数据。RAGAS: 对检索增强生成进行自动化评估的指标体系(opens in a new tab)2023年9月
提出了一种创新方法——生成后阅读(GenRead),它让大型语言模型先根据提问生成相关文档,再从这些文档中提取答案。生成而非检索:大型语言模型作为强大的上下文生成器(opens in a new tab)2023年9月
展示了在 RAG 系统中如何使用特定排名器(比如 DiversityRanker 和 LostInTheMiddleRanker)来挑选信息,从而更好地利用大型语言模型的上下文窗口。提升 Haystack 中 RAG 系统的能力:DiversityRanker 和 LostInTheMiddleRanker 的引入(opens in a new tab)2023年8月
描述了如何将大型语言模型与不同的知识库结合,以便于知识的检索和储存。通过编程思维的提示来生成知识库的搜索代码,此外,还能够根据用户的需要,将知识储存在个性化的知识库中。KnowledGPT: 利用知识库检索和存储功能增强大型语言模型(opens in a new tab)2023年8月
提出一种模型,通过结合检索增强掩码语言建模和前缀语言建模,引入上下文融合学习,以此提高少样本学习的效果,使模型能够在不增加训练负担的情况下使用更多上下文示例。RAVEN: 借助检索增强编解码器语言模型实现的上下文学习(opens in a new tab)2023年8月
RaLLe 是一款开源工具,专门用于开发、评估和提升针对知识密集型任务的 RAG 系统的性能。RaLLe: 针对检索增强大型语言模型的开发和评估框架(opens in a new tab)2023年8月
研究发现,当相关信息的位置发生变化时,大型语言模型的性能会明显受影响,这揭示了大型语言模型在处理长篇上下文信息时的局限性。中途迷失:大型语言模型处理长篇上下文的方式(opens in a new tab)2023年7月
通过迭代的方式,模型能够将检索和生成过程相互协同。模型的输出不仅展示了完成任务所需的内容,还为检索更多相关知识提供了丰富的上下文,从而在下一轮迭代中帮助产生更优的结果。通过迭代检索-生成协同增强检索增强的大语言模型(opens in a new tab)2023年5月
介绍了一种新的视角,即在文本生成过程中,系统能够主动决定何时以及检索什么信息。接着,提出了一种名为FLARE的方法,通过预测下一句话来预见未来的内容,利用此内容作为关键词检索相关文档,并在发现不确定的表达时重新生成句子。主动检索增强生成(opens in a new tab)2023年5月
提出了一个能够通用应用于各种大语言模型的检索插件,即使在模型未知或不能共同微调的情况下也能提升模型性能。适应增强型检索器改善大语言模型的泛化作为通用插件(opens in a new tab)2023年5月
通过两种创新的预训练方法,提高了对结构化数据的密集检索效果。首先,通过对结构化数据和非结构化数据之间的关联进行预训练来提升模型的结构感知能力;其次,通过实现遮蔽实体预测来更好地捕捉结构语义。结构感知的语言模型预训练改善结构化数据上的密集检索(opens in a new tab)2023年5月
该框架能够动态地融合来自不同领域的多样化信息源,以提高大语言模型的事实准确性。通过一个自适应的查询生成器,根据不同知识源定制查询,确保信息的准确性逐步得到修正,避免错误信息的累积和传播。知识链:通过动态知识适应异质来源来基础大语言模型(opens in a new tab)2023年5月
此框架通过首先检索知识图谱中的相关子图,并通过调整检索到的子图的词嵌入来确保事实的一致性,然后利用对比学习确保生成的对话与知识图谱高度一致,为生成与上下文相关且基于知识的对话提供了新方法。用于知识基础对话生成的知识图谱增强大语言模型(opens in a new tab)2023年5月
通过采用小型语言模型作为可训练重写器,以适应黑盒式大语言模型(LLM)的需求。重写器通过强化学习(RL)根据 LLM 的反馈进行训练,从而构建了一个名为“重写-检索-阅读”的新框架,专注于查询优化。为检索增强的大语言模型重写查询(opens in a new tab)2023年5月
利用检索增强生成器迭代创建无限记忆池,并通过记忆选择器挑选出适合下一轮生成的记忆。此方法允许模型利用自身产出的记忆,称为“自我记忆”,以提升内容生成质量。自我提升:带有自我记忆的检索增强文本生成(opens in a new tab)2023年5月
通过为大语言模型(LLM)装配知识引导模块,让它们在不改变内部参数的情况下,获取相关知识。这一策略显著提高了模型在需要丰富知识的领域任务(如事实知识增加7.9%,表格知识增加11.9%,医学知识增加3.0%,多模态知识增加8.1%)的表现。用参数知识引导增强大语言模型(opens in a new tab)2023年5月
为大语言模型(LLM)引入了一个通用的读写记忆单元,允许它们根据任务需要从文本中提取、存储并回忆知识。RET-LLM:朝向大语言模型的通用读写记忆(opens in a new tab)2023年5月
通过使用任务不可知检索器,构建了一个共享静态索引,有效选出候选证据。随后,设计了一个基于提示的重排机制,根据任务的特定相关性重新排序最相关的证据,为读者提供精准信息。针对非知识密集型任务的提示引导检索增强(opens in a new tab)2023年5月
提出了UPRISE(通用提示检索以改善零样本评估),通过调整一个轻量级且多功能的检索器,它能自动为给定零样本任务的输入检索出最合适的提示,以此来改善评估效果。UPRISE:改进零样本评估的通用提示检索(opens in a new tab)2023年3月
结合了 SLMs 作为过滤器和 LLMs 作为重排器的优势,提出了一个适应性的“过滤-再重排”范式,有效提升了难样本的信息提取与重排效果。大语言模型不是一个理想的少样本信息提取器,但它在重排难样本方面表现出色!(opens in a new tab)2023年3月
零样本学习指导一款能够遵循指令的大语言模型,创建一个虚拟文档来抓住重要的联系模式。接着,一个名为Contriever的工具会将这份文档转化成嵌入向量,利用这个向量在大数据集的嵌入空间中找到相似文档的聚集地,通过向量的相似度来检索真实文档。无需相关标签的精确零样本密集检索(opens in a new tab)2022年12月
提出了一个名为展示-搜索-预测(DSP)的新框架,通过这个框架可以编写高级程序,这些程序能够先展示流程,然后搜索相关信息,并基于这些信息做出预测。它能够将复杂问题分解成小的、更易于解决的步骤。通过检索和语言模型组合,为复杂的自然语言处理任务提供解决方案(opens in a new tab)2022年12月
采用了一种新的多步骤问答策略,通过在思维链条的每一步中穿插检索信息,使用检索到的信息来丰富和改善思维链条。这种方法显著提升了解决知识密集型多步问题的效果。结合思维链条推理和信息检索解决复杂多步骤问题(opens in a new tab)2022年12月
研究发现,增加检索环节可以有效减轻对已有训练信息的依赖,使得RAG变成一个有效捕捉信息长尾的策略。大语言模型在学习长尾知识方面的挑战(opens in a new tab)2022年11月
通过抽样方式,从大语言模型的记忆中提取相关信息段落,进而生成最终答案。通过回忆增强语言模型的能力(opens in a new tab)2022年10月
将大语言模型用作少量示例的查询生成器,根据这些生成的数据构建针对特定任务的检索系统。Promptagator: 基于少量示例实现密集检索(opens in a new tab)2022年9月
介绍了Atlas,这是一个经过预训练的检索增强型语言模型,它能够通过极少数的示例学习掌握知识密集任务。Atlas: 借助检索增强型语言模型进行少样本学习(opens in a new tab)2022年8月
通过从训练数据中进行智能检索,实现了在多个自然语言生成和理解任务上的性能提升。重新认识训练数据的价值:通过训练数据检索的简单有效方法(opens in a new tab)2022年3月
通过在连续的数据存储条目之间建立指针关联,并将这些条目分组成不同的状态,我们近似模拟了数据存储搜索过程。这种方法创造了一个加权有限自动机,在推理时能够在不降低模型预测准确性(困惑度)的情况下,节约高达 83% 的查找最近邻居的计算量。通过自动机增强检索的神经符号语言建模(opens in a new tab)2022 年 1 月
通过将自回归语言模型与从大规模文本库中检索的文档块相结合,基于这些文档与前文 Token 的局部相似性,我们实现了模型的显著改进。该策略利用了一个庞大的数据库(2 万亿 Token),大大增强了语言模型的能力。通过从数万亿 Token 中检索来改善语言模型(opens in a new tab)2021 年 12 月
我们采用了一种创新的零样本任务处理方法,通过为检索增强生成模型引入严格的负样本和强化训练流程,提升了密集段落检索的效果,用于零样本槽填充任务。用于零样本槽填充的鲁棒检索增强生成(opens in a new tab)2021 年 8 月
介绍了 RAG 模型,这是一种结合了预训练的 seq2seq 模型(作为参数记忆)和基于密集向量索引的 Wikipedia(作为非参数记忆)的模型。此模型通过预训练的神经网络检索器访问信息,比较了两种 RAG 设计:一种是在生成过程中始终依赖相同检索的段落,另一种则是每个 Token 都使用不同的段落。用于知识密集型 NLP 任务的检索增强生成(opens in a new tab)2020 年 5 月
展示了一种仅通过密集表示实现信息检索的方法,该方法通过简单的双编码框架从少量问题和文本段落中学习嵌入。这种方法为开放域问答提供了一种高效的密集段落检索方案。用于开放域问答的密集段落检索(opens in a new tab)2020 年 4 月
滚动至顶部