模块添加或替换策略:维持检索-阅读的结构,同时引入额外的模块来增强特定功能。例如,RRR[Ma et al., 2023a] 提出了重写-检索-阅读过程,使用LLM性能作为强化学习中重写器模块的奖励。这允许重写器调整检索查询,提高阅读器的下游任务性能。类似地,可以在Generate-Read[Yu et al., 2022]方法中选择性地替换模块,其中LLM生成模块替换了检索模块。Recite-Read [Sun et al., 2022] 将外部检索转换为从模型权重中检索,让LLM先记住任务相关信息,再生成输出,以处理知识密集型自然语言处理任务。
(2)调整模块间流程
模块间流程调整:强调增强语言模型与检索模型之间的互动。DSP[Khattab et al., 2022] 引入了展示-搜索-预测框架,将上下文学习系统视为显式程序而不是终端任务提示,以解决知识密集型任务。ITER-RETGEN [Shao et al., 2023] 利用生成内容指导检索,迭代执行“检索增强生成”和“生成增强检索”,形成检索-阅读-检索-阅读的流程。Self-RAG[Asai et al., 2023b] 遵循决定-检索-反思-阅读过程,引入了一个用于主动判断的模块。这种自适应和多样化的方法允许在模块化RAG框架内动态组织模块。
将查询和文档的语义对齐最直观的方式是重写查询。如Query2Doc[Wang et al., 2023b]和ITER-RETGEN[Shao et al., 2023]所提到的,利用大型语言模型的内在能力生成伪文档,并将原始查询与这个伪文档合并形成新的查询。在HyDE[Gao et al., 2022]中,通过使用文本指示符建立查询向量,使用这些指示符生成一个相关但可能并不存在的“假设”文档,它只需要捕获相关模式。RRR[Ma et al., 2023a]引入了一种新框架,将检索和阅读的顺序颠倒,专注于查询重写。此方法使用大型语言模型生成查询,然后使用网络搜索引擎检索上下文,最后使用小型语言模型作为训练重写器服务于冻结的大型语言模型。STEP-BACKPROMPTING[Zheng et al., 2023]方法可以使大型语言模型进行抽象推理,提取高层次概念和原则,并基于此进行检索。最后,Multi Query Retrieval方法涉及使用大型语言模型生成多个搜索查询,这些查询可以并行执行,检索结果一起输入,这对于依赖多个子问题的单一问题非常有用。
4.2.2 嵌入变换
如果有像重写查询这样的粗粒度方法,那么也应该有针对嵌入操作的更细粒度实现。在LlamaIndex[Liu, 2023]中,可以在查询编码器后连接一个适配器,并微调适配器以优化查询嵌入的表示,将其映射到更适合特定任务的潜在空间。当查询和外部文档的数据结构不同时,如非结构化查询和结构化外部文档,使查询与文档对齐非常重要。SANTA[Li et al., 2023d]提出了两种预训练方法,使检索器意识到结构化信息:1) 使用结构化数据和非结构化数据之间的自然对齐关系进行对比学习,以进行结构化意识的预训练。2) Masked Entity Prediction,设计了一种以实体为中心的遮蔽策略,并要求语言模型填充被遮蔽的实体。
许多研究利用大型语言模型的不同反馈信号来微调嵌入模型。AAR[Yu et al., 2023b]通过编码器-解码器架构的LM为预训练检索器提供监督信号。通过确定LM偏好的文档,并利用FiD跨注意力得分进行微调检索器,然后使用硬负采样和标准交叉熵损失。最终,微调后的检索器可以直接用于增强未见过的目标LM,从而在目标任务中表现更好。
REPLUG[Shi et al., 2023]使用检索器和LLM计算检索到的文档的概率分布,然后通过计算KL散度进行监督训练。这种简单有效的训练方法通过使用LM作为监督信号来提升检索模型的性能,无需任何特定的跨注意力机制。
4.3.2 插入适配器
由于使用API实现嵌入功能或本地计算资源不足等因素,微调嵌入模型可能具有挑战性。因此,一些研究选择外部附加适配器进行对齐。PRCA[Yang et al., 2023b]通过上下文提取阶段和奖励驱动阶段训练适配器,并根据基于token的自回归策略优化检索器的输出。
TokenFiltering[Berchansky et al., 2023]方法计算跨注意力得分,选择得分最高的输入token来有效过滤token。RECOMP[Xu et al., 2023a]提出了抽取和生成压缩器,通过选择相关句子或合成文档信息来生成摘要,实现多文档查询重点摘要。此外,一种新方法PKG[Luo et al., 2023]通过指令微调将知识注入白盒模型,并直接替换检索器模块,用于直接根据查询输出相关文档。
指的是包含(输入,输出)对的训练数据,旨在训练模型在给定输入x的情况下生成输出y的能力。在Self-mem[Cheng et al., 2023b]的工作中,采用了一种相对经典的训练过程。给定输入x,检索相关文档z(论文中选择Top-1),整合(x,z)后,模型生成输出y。论文采用了两种常见的微调范式,即联合编码器[Arora et al., 2023, Wang et al., 2022b, Lewis et al., 2020]和双编码器[Xia et al., 2019, Cai et al., 2021, Cheng et al., 2022]。
5.2.2 利用对比学习
在准备训练数据的阶段,通常生成输入和输出之间的交互对。在这种情况下,模型只能访问唯一真实的输出,可能会引起“暴露偏差”问题[Ranzato et al., 2015]:在训练阶段,模型只暴露于单个真实反馈,无法访问任何其他生成的token。这可能会损害模型在应用中的性能,因为它可能过度适应训练数据中的特定反馈,而无法有效地泛化到其他场景。因此,SURGE[Kang et al., 2023]提出了一种图文对比学习方法。
5.2.3 优化目标
在处理涉及结构化数据的检索任务时,SANTA[Li et al., 2023d]使用了三阶段训练过程来充分理解结构和语义信息。在检索器的训练阶段,采用了对比学习,主要目标是优化查询和文档的嵌入表示。
非结构化数据主要包括文本数据,通常来自纯文本语料库。此外,其他文本数据也可以作为检索源,例如用于大型模型微调的提示数据[Cheng et al., 2023a]和跨语言数据[Li et al., 2023b]。
文本粒度方面,除了常见的块(包括句子),检索单元可以是词汇(例如,kNN-LM[Khandelwal et al., 2019])、短语(例如,NPM[Lee et al., 2020], COG[Vaze et al., 2021])和文档段落。更细粒度的检索单元通常能更好地处理罕见模式和域外场景,但增加了检索成本。
SKR[Wang et al., 2023d] 使用标记的训练集,将模型可以直接回答的问题分类为已知,需要检索增强的分类为未知。模型被训练以辨别问题是否已知,仅将检索增强应用于识别为未知的输入,而直接回答其他问题。
GenRead[Yu et al., 2022] 将LLM生成器替换为检索器。实验结果表明,生成的上下文文档包含正确答案的情况比Naive RAG检索到的情况更普遍。生成的答案也展示出更高的质量。作者将这归因于生成文档级上下文的任务与因果语言建模的预训练目标之间的一致性,允许更好地利用模型参数中存储的世界知识。
Selfmem[Cheng et al., 2023b] 迭代使用检索增强生成器来创建一个无界的内存池。使用内存选择器选择输出作为后续生成的内存。这个输出作为原始问题的对偶问题。通过结合原始问题和对偶问题,检索增强的生成模型可以利用自己的输出来增强自己。
这些多样化的方法展示了RAG检索增强的创新策略,旨在提升模型性能和有效性。
6.3 过程增强
RAG(检索-生成增强)研究中,大多数情况下仅执行一次检索和生成过程。然而,单次检索可能包含冗余信息,导致“中间迷失”现象[Liu et al., 2023]。这种冗余信息可能会掩盖关键信息或包含与真实答案相反的信息,从而对生成效果产生负面影响[Yoran et al., 2023]。此外,单次检索获得的信息在需要多步推理的问题上是有限的。
根据原始查询和生成的文本定期收集文档可以为LLM提供额外的材料[Borgeaud et al., 2022, Arora et al., 2023]。多次迭代检索中提供额外参考资料已提高了后续答案生成的鲁棒性。然而,这种方法可能在语义上不连贯,并可能导致收集噪声和无用信息,因为它主要依赖于一系列n个令牌来分离生成和检索的文档。
递归检索和多跳检索用于特定的数据场景。递归检索可以首先通过结构化索引处理数据,然后逐级检索。在检索层次丰富的文档时,可以为整个文档或长PDF的每个部分制作摘要,然后根据摘要进行检索。确定文档后,对内部块进行第二次检索,从而实现递归检索。多跳检索通常用于进一步挖掘图结构数据源中的信息[Li et al., 2023c]。
6.3.2 自适应检索
RAG方法中描述的前两个部分遵循的是一种被动方法,即优先考虑检索。这种方法,涉及根据上下文查询相关文档并输入到LLM中,可能导致效率问题。自适应检索方法,如Flare[Jiang et al., 2023b]和Self-RAG[Asai et al., 2023b],优化了RAG检索过程,使LLM能够主动判断检索的时机和内容,帮助提高检索信息的效率和相关性。
实际上,LLM主动使用工具和做出判断的方式并非起源于RAG,而是已在大型模型的代理中广泛使用[Yang et al., 2023c, Schick et al., 2023, Zhang, 2023]。Graph-Toolformer[Zhang, 2023]的检索步骤大致分为:LLMs主动使用检索器,Self-Ask和DSP[Khattab et al., 2022]尝试使用小样本提示触发LLM搜索查询。当LLM认为有必要时,可以决定搜索相关查询以收集必要材料,类似于代理的工具调用。
端到端评估评估RAG模型针对给定输入生成的最终响应,涉及模型生成答案与输入查询的相关性和一致性。从内容生成目标的角度来看,评估可以分为无标签内容和有标签内容。无标签内容评估指标包括答案的忠实度、相关性、无害性等,而有标签内容评估指标包括准确度和EM。此外,从评估方法的角度来看,端到端评估可以分为人工评估和使用LLM的自动评估。上述概括了RAG的端到端评估的一般情况。此外,根据RAG在特定领域的应用,采用特定的评估指标,例如问答任务中的EM[Borgeaud et al., 2022, Izacard et al., 2022],总结任务中的UniEval和E-F1[Jiang et al., 2023b],以及机器翻译中的BLEU[Zhong et al., 2022]。这些指标有助于理解RAG在各种特定应用场景中的性能。
最近OpenAI的报告[Jarvis and Allard, 2023]提到了用于优化大型语言模型(LLMs)的各种技术,包括RAG及其评估指标。此外,最新的评估框架,如RAGAS[Es et al., 2023]和ARES[Saad-Falcon et al., 2023],也涉及RAG评估指标。综合这些工作,主要关注以下三个核心指标:答案的忠实度、答案相关性和上下文相关性。
近年来,大型语言模型(LLM)社区一直在探索使用“LLM作为评判”进行自动评估的方法,许多研究者利用强大的LLM(如GPT-4)来评估其自身LLM应用的输出。Databricks使用GPT-3.5和GPT-4作为LLM评判来评估其聊天机器人应用表明,使用LLM作为自动评估工具是有效的[Leng et al., 2023]。他们认为这种方法也可以高效且成本效益地评估基于RAG的应用。
RAGAS考虑了检索系统识别相关和关键上下文段落的能力,LLM忠实使用这些段落的能力,以及生成本身的质量。RAGAS是一个基于简单手写提示的评估框架,使用这些提示以完全自动化的方式衡量答案忠实度、答案相关性和上下文相关性的三个方面的质量。在这个框架的实施和实验中,所有提示都使用通过OpenAI API提供的gpt-3.5-turbo-16k模型进行评估[Es et al., 2023]。
如文献[Xu et al., 2023c]所述,RAG的生成阶段受限于LLMs的上下文窗口。如果窗口太短,可能不包含足够的相关信息;如果太长,可能导致信息丢失。目前,扩展LLMs的上下文窗口,甚至达到无限制上下文,是LLM发展的一个关键方向。然而,一旦移除上下文窗口限制,RAG应如何适应仍然是一个值得注意的问题。
RAG的鲁棒性:
如果检索过程中出现无关噪声,或检索内容与事实相矛盾,可能会显著影响RAG的有效性。因此,增强RAG的鲁棒性越来越受到研究者的关注,如[Yu et al., 2023a, Glass et al., 2021, Baek et al., 2023]所示。
RAG与微调的协同:
混合方法已逐渐成为RAG的主流方法之一,如RADIT [Lin et al., 2023]所示。如何协调二者之间的关系,同时获得参数化和非参数化的优势,是一个需要解决的问题。
RAG的工程实践:
RAG的实施便利性和与企业工程需求的一致性促成了其崛起。然而,在工程实践中,如何提高大规模知识库场景中的检索效率和文档回调率,以及如何确保企业数据安全(例如防止LLMs泄露文档的来源、元数据或其他信息)是需要解决的关键问题[Alon et al., 2022]。
BLIP-2[Li et al., 2023a]的提出使用冻结的图像编码器和大型语言模型进行视觉语言预训练,降低了模型训练成本。此外,该模型可以从零样本生成图像到文本的转换。
代码领域:
RBPS[Nashid et al., 2023]用于与代码相关的小规模学习。通过编码或频率分析,自动检索与开发者任务类似的代码示例。该技术已在测试断言生成和程序修复任务中证明了其有效性。
结构化知识领域:
方法如CoK[Li et al., 2023c]首先从知识图谱中检索与输入问题相关的事实,然后以提示的形式将这些事实添加到输入中。这种方法在知识图谱问答任务中表现良好。
音频和视频领域: GSS[Zhao et al., 2022]方法检索并串联来自口语词汇库的音频片段,立即将MT(机器翻译)数据转换为ST(语音翻译)数据。UEOP[Chan et al., 2023]在端到端自动语音识别中引入了新的突破,通过引入外部离线策略进行声音到文本的映射。Vid2Seq[Yang et al., 2023a]架构通过引入特殊的时间标记,使语言模型能够在同一输出序列中无缝预测事件边界和文本描述。
在RAG的生态系统中,相关技术栈的发展发挥了推动作用。例如,随着ChatGPT的普及,LangChain和LLamaIndex迅速成为知名的RAG相关API提供者,逐渐成为大模型时代不可或缺的技术之一。同时,不断有新型技术栈被开发。虽然这些技术栈不像LangChain和LLamaIndex提供那么多功能,但更注重其独特特性。例如,Flowise AI 强调低代码,允许用户通过拖放操作实现各种AI应用,包括RAG,无需编写代码。其他新兴技术包括HayStack、Meltno和Cohere Coral。