RAG:检索增强的前世今生

发布于: Android转发:0回复:0喜欢:3

2024-03-17 氢AI

大语言模型可以把大量的信息和知识压缩起来,提供一个友好但不精确的检索。出于神经网络的本质,它经常可能把从语料中某个领域学来的“套路”应用到完全不相干的另一个领域,“他山之石可以攻玉”,故尔往往可以给出非常惊艳的答案。但正如一个硬币有正反两面,大语言模型的这个特点,往往也使得它会在某些场景突然“扑街”。因此,应用大语言模型,首先就要“驯服”大语言模型。

目前,RAG(Retrieve Augment Generation,检索增强)是“驯服”大语言模型的主要手段之一。它允许大语言模型在从固定的数据库中抽取相关内容的基础上生成答案,从而限制随意发挥,提升答案的可靠性。可以说,RAG是目前各类大模型落地项目不可缺少的实用技术组件。是从事或希望加入大语言模型相关产业的同学们必须了解的知识点。

日前,创新学习辅助应用RemNote创始人、Emergent Ventures风投基金合伙人Moritz Wallawitsch发表了一篇博文,通过一系列极具代表性的科研项目详解了RAG技术的发展历程,最久的项目远追溯到2017年,最新的项目上个月才报道。

氢AI相信,对一门技术,只有了解它发明的初衷、中间遇到的问题和解决的过程、目前的状态以及未来的趋势,才能更好地了解它本身。作为技术大拿,Wallawitsch的文章写得高度概括,有一定阅读门槛,因此,氢AI将其进一步整理、细化,呈现给读者朋友。

检索增强研究

2017-2024

本文的灵感来自Douwe Kiela的精彩讲座“Stanford CS25:V3 I Retrieval Augmented Language Models”,他与Patrick Lewis、Ethan Perez等人于2020年5月发明了RAG(氢AI注:并不是首次提出类似概念,而是首次提出RAG这个名字)。自2023年1月以来,RAG领域又发生了很多事情,因此本文试图综述该领域的研究。

对于RAG的定义,氢AI愿意引用上述论文(arXiv:2005.11401)的摘要,讲得很好:

大型预训练语言模型已被证明可以将事实知识存储在其参数中,并在对下游NLP任务进行精调时获得最好的结果。然而,它们访问和精确操作知识的能力仍然有限,因此在知识密集型任务中,它们的性能落后于面向特定任务的系统架构。此外,为它们的决定提供依据和方便地更新它们的世界知识仍然是悬而未决的研究问题。到目前为止,具有对显式非参数存储器的可微访问机制的预训练模型仅用于可提取的下游任务。我们探索了一种用于检索增强生成(RAG)的通用精调方法——该模型将预先训练的参数和非参数记忆相结合,用于语言生成。我们介绍了RAG模型,其中参数记忆是预训练的seq2seq模型,非参数记忆是维基百科的密集向量索引,由预训练的神经召回器访问。我们比较了两种RAG公式,一种是在整个生成序列中条件相同的检索段落,另一种是每个token可以使用不同的段落。我们在广泛的知识密集型NLP任务上对我们的模型进行了微调和评估,并在三个开放域QA任务上取得了Sota,优于(没采用RAG的)seq2seq模型和特定任务的检索和提取架构。对于语言生成任务,我们发现RAG模型生成的语言比最先进的仅参数seq2seq基线更具体、更多样、更真实。

RAG系统主要包括两个部分:检索器和生成器。其中生成器可以理解为就是大语言模型(货架商品或深度定制),而检索器有的是基于语言模型、有的是基于词频算法、有的是两者结合使用。围绕RAG系统的科学研究主要内容是系统架构、训练方法、技术组合和各类奇思妙想。下面,本文将从检索器开讲。

RAG代表性工作进化树(arXiv:2312.10997)

RAG术语表

1. 检索(召回)

使计算机能够从知识库中提取信息以辅助语言任务的想法可以追溯到几十年前,20世纪60年代的早期问答系统和IBM的Watson Jeopardy系统都有类似的概念基础。为了深入了解RAG,必须首先了解底层的检索技术。

(氢AI注:既然是介绍检索增强,那么第一部分先介绍什么叫“检索(Retireve)”。检索,或更直接的翻译“获取”,或更专业一点的术语“召回”,是指在一个文档的集合中,找出与用户查询相关的子集的过程。在下面的文章中,检索、召回均对应Retrieve)

稀疏召回

检索,指从用户特定的信息需求出发,对特定的信息集合采用一定的方法、技术手段,根据一定的线索与规则从中找出相关信息。这是百度百科对“检索”一词的定义。这个定义指出了“检索”的三个要素,即“用户需求”、“信息集合”和“线索与规则”。在信息领域,怎样才能实现一个能满足各种各样检索需求的信息系统呢?第一个出现的想法是,构建一个包含所有可能被用于检索的关键词的词典,文档集合通常是现成的。以关键词为线索对所有的文档实施分析,从而得到一个形如下图的矩阵,其中“1”表示包含、“0”表示不包含。有了这个矩阵,就可以提供关键词检索服务了,当用户检索某个关键词时,取出矩阵对应横列中“1”对应的文档返回给用户即可。也可以提供基于布尔逻辑的多关键词“语义”检索功能——只要对矩阵相关行按位实施同样的布尔逻辑操作,再将结果向量中“1”对应的文档返回给用户即可。在下面的矩阵中,行向量有一个名字,叫倒排索引(Inverted Index),而列向量则在一定程度上描述了对应文档的内容,因此可以视作它的表征向量。

上面的矩阵虽然可以初步解决召回问题,但它还远远不够好。主要问题是过于简单地用包含和不包含来描述关键词与文档之间的关系,一旦文档集合很大或关键词区分度不强,检索出来的结果就会太多且完全无法区分主次。为解决这个问题,新的思路出现了,人们发明了一类称作TF*IDF(词频*逆文档频率)的词频算法。词频算法考虑一个词在某篇文档中出现的次数以及它在整个文档集合中出现的平均次数。如果前一个值和后一个值的比值(姑且这么理解)越大,就说明关键词和文档至少在内容上越相似,因此会给它打一个高分。这类算法目前最流行的叫Okapi BM25,它是一种略为复杂、缺乏明确理论支持的经验算法。应用词频算法后的矩阵如下图所示。现在如果我们必须返回给用户有限个数的检索结果,那我们可以优先选择分高者。词频算法也可以提供简单的语义检索功能,并且不需要布尔逻辑表达式。当用户同时搜索多个关键词时,可以找出所有相关文档(比如至少包括一个关键词)的表征向量,去除无关项后,用余弦相似性衡量这些文档与查询本身之间的内容相似性。

上面的矩阵方法在今天的产业界和学术界仍有广泛使用,它的主要优势是在提供了一定功能的前提下算法效率很高:词典建好后将文档集合分析一遍放在那就好了,有变动可以小修小补,查询可以通过哈希。它的主要问题在于,因为是以关键词为单位,系统无法将词与词之间的位置关系和语义联系纳入考虑,丢失太多语义信息,表征向量的信息含量很稀疏(到处都是很多0)。因此这种方案被称作“稀疏召回(Sparse Retrieve)”。另外,氢AI在介绍“稀疏召回”的时候,始终强调它表征的是“内容相似性”。这是因为,从召回的严格意义上来说,相似性不等于相关性,更不等于质量好。比如,上面对“检索”一词的定义本身不包含“检索”二字。与此同时,这条定义也可能未必是最严谨的、最易懂的、或者最合某个特定用户心意的。

早在2017年,稀疏召回就被用于问答类RAG(当时Transformer还在襁褓中,使用LSTM作为生成器/读取器)系统的首批实例之一(arXiv:1704.00051)。

密集召回

深度学习时代来临后,人们开始尝试将深层神经网络引入NLP领域。同“稀疏召回”一样,神经网络也是用高维向量来表征次词、词语、短语、句子、段落乃至文档。不同之处在于,深度神经网络可以把从大量训练预料中提取到的语义信息注入表征向量(提取表征的过程成为“嵌入「Embedding」”),从而使得语义相近的自然语言片段在高维表征空间中的几何距离也相近。这样一来,表征向量的信息含量就大了,也没有那么多“0”。因此,此类召回技术被称为“密集召回”。

要实现密集召回,需要有两个Transformer编码器,一个是查询编码器,另一个是文档编码器。可以采用已经预训练好了的双向大语言模型(如BERT)的编码器部分x2,然后用优质的“查询-文档”对联合精调它们,使得两边得出的表征向量距离相近。然后,用文档编码器事先将客户的数据库处理一遍,把“文档片段-表征向量”存入向量数据库待查即可。查询时,用查询编码器推理出查询表征,然后在向量数据库中找到最相关的几段文本,交给大语言模型生成答案。这就是RAG系统的基本原理流程。

下面,本文将通过ColBERT和FAISS两个项目展开讲解密集召回器。MORITZ WALLAWITSCH在原文中还陈列了其他几个密集召回项目,不太想纠结于此的读者看过ColBERT和FAISS之后就可以进入下一大节“冻结和动态RAG”。

ColBERT召回器

ColBERT虽然被MORITZ WALLAWITSCH归为“稀疏-密集”混合召回。但氢AI认为,该项目最大的历史意义是第一次提出了上面论述过的“密集召回”的基本原理和工作流程思想——即目前普遍被称为“暹罗塔(Siam Tower)或双塔”的双编码器架构以及在线-离线流程方法,如图所示。

ColBERT(arXiv:2004.12832)

FAISS向量数据库

密集召回可以使语义相似的语言片段对应的表征向量在空间中的几何距离也相似。那么给出两个成千上万维的向量,怎么才能知道它们的空间距离是相近还是不相近呢?提供这个功能的数学工具叫最大内积搜索(Maximum Inner-Product Search,MIPS),就是把向量间对应位置的数字相乘,再把所有的乘积加起来,总和越大,就越近。但是这种算法的时间开销是O(n),如果向量很多,就不可接受。为此,研究者们提出了很多种ANN(Approx. Nearest Neighbours)算法,这种算法的时间复杂度取决于其参数设置。只要设置得当,就可以用很低的开销给出一个虽不精确但可接受的近似结果。FAISS(Meta,开源)就是这样一个内嵌了ANN算法的向量数据库,专门为各类密集召回系统提供服务。

ORQA

最早建立在密集嵌入之上的问答系统之一是ORQA。它经过端到端的训练,只使用问答对来联合训练证据检索和回答。它将检索视为一个通过对“反向完形填空”任务(预测句子的周围上下文)进行预训练初始化的无监督的潜在变量。(氢AI注:名为问答系统,实际上就是个密集召回器,缺少后端的大语言模型。原作者陈列这个例子是为了说明密集召回器的训练方法)

ORQA(arXiv:1906.00300)

SPLADE

SPLADE巧妙地将稀疏获取和密集获取相结合。它是一个稀疏检索器,使用查询扩展、识别查询的同义词和相关术语,增强了即使不包含在查询中也能捕获语义的能力。

SPLADE(arXiv:2107.05720)

DRAGON

DRAGON是一种广义的密集检索器,它通过渐进式数据扩充进行训练。这种方法在多次训练迭代中逐渐引入了更具挑战性的监督和不同的相关性标签,使模型能够有效地学习复杂的相关性模式。通过将模型暴露于各种监督和语义难度很高的反例,DRAGON可以生成高质量的表征,提高查询和文档的检索效率,并在没有训练过的场景也有很强的泛化能力。(氢AI注:这是一个在现代搜索引擎中广泛应用的思想。语言模型能够广泛应用于搜索引擎的一个重要原因,是它有很强的泛化能力。也就是它形成的能力可以覆盖到很长尾的角落。这是倒排索引、链接分析都解决不了的问题。)

DRAGON(arXiv:2302.07452)

SANTA

Structure-Aware DeNse ReTrievAl(SANTA)解决了将查询与结构化外部文档对齐的挑战,尤其是结构化数据(如代码或产品规范)与非结构化数据(例如文本描述)之间的不够一致的问题。它通过以下两种预训练策略增强了检索器对结构化信息的敏感性:

1.利用结构化和非结构化数据之间的内在一致性,为结构化敏感预训练方案中的对比学习提供信息;

2.实现掩蔽实体预测(利用以实体为中心的掩蔽策略,鼓励语言模型预测和填充掩蔽实体,促进对结构化数据的更深入理解)。

SANTA(arXiv:2305.19912)

2. 从冻结走向动态的RAG

我们知道,在做垂直业务落地的过程中,大语言模型可能是需要精调的。但是RAG系统中除了用于生成最终答案的大语言模型,还可能有别的语言模型结构——密集召回器。那么,RAG系统在客户侧落地过程中,到底要怎么精调呢?是精调其中之一?还是分别精调?或是联合精调呢?

理想情况下,在“全动态”模型中,损失函数的梯度将回流整个系统(端到端训练):检索器、生成器和文档编码器。然而,这在计算上具有挑战性,并且尚未成功完成。

动态检索器,固定生成器

In-Context RALM

In-Context RALM提出了一种典型的RAG方案。它的主要思想是,利用大语言模型的情境学习(In-context learning)能力,对于某个prompt,如果可以在提交给大语言模型生成答案之前,先把prompt当做查询,(从某个外部资料库中)检索出一些相关的段落,一并提交给大语言模型,就能降低答案的困惑度(Perplexity)。为此,该方案简单地用BM25算法从WikiText-103(假设Wikipedia就是某一种行业数据库)数据集上做召回,并直接把召回内容放在原prompt前边,就能使345M参数的GPT-2模型性能比肩1.5B参数的GPT-2。如果再训一个110M的GPT-2对BM25的召回结果做个重排,效果更佳。如果模型改用LLaMA、任务改为开放域问答,结论也一样。其中所谓固定生成器,是指生成模型直接采用货架模型;动态检索器,是指用于重排序的那个模型需要根据具体任务微调。

In-Context RALM(arXiv:2302.00083)

REPLUG

REPLUG的方法跟上面的差不多,它是将大语言模型视作黑盒,也即不限制大语言模型的品牌型号,并在其前端加一个Contriever检索模型。首先用对比大语言模型似然度和检索模型似然度的方式,训练检索模型,使其适应大语言模型的“偏好”。在推理时,先用检索模型检索出若干个片段,与原prompt组合在一起分别输入大语言模型推理,最后将多次推理的结果加总,选得分最高者作为最终答案。

REPLUG(arXiv:2301.12652)

DREditor

DREditor项目只讲检索器。上面,不论是In-Context RALM还是REPLUG,都是生成式大语言模型不用动,但检索器需要针对不同的任务(知识领域)做适配以进一步丰富大语言模型的提示,方法是模型精调(检索器本身也是个语言模型)。DREditor提出的方法是,检索器精调也省了。当RAG系统需要适配新的客户场景时,只需要观察一些检索器在新场景中的成功和失败的例子,用观测到的误差训练一个特殊的最小二乘算子直接调整检索模型生成的文档表征,从而强行适配。DREditor宣称可在精度持平或更高的基础上,让系统适配的效率提升100到300倍。

(氢AI注:感觉迷糊的同学,可以回顾一下上面的ColBERT项目。检索器,通常是一个双塔模型,一个塔计算检索查询的语义表征,另一个塔计算文档段落的语义表征,完后通过内积等算法判断两边表征的相似度,就可以把与查询有关的段落给摘出来。为什么要用两个模型塔?因为提问和回答的语义显然是不一样的,但我们可以训练模型故意让它们的表征内积大,因此两个模型肯定不一样。好,现在有一个这样的检索模型,它在一个领域比如说医学领域,通过精调,很有效。但如果把它放在电力领域,它可能一下子就失效了。怎么办呢?正规的办法是用电力问答对再精调它一下。但是DREditor的作者告诉你,不用那么费事,有一个办法,可以不动模型参数,直接调整模型输出的表征。不精调模型,而是训练一个简单的多的表征调整算法,重新让这个模型有效,但开销大大降低了!)

DREditor(arXiv:2401.12540)

固定检索器,动态生成器

kNN-LM

kNN-LM是一篇有趣的论文,作者试图从后端使大语言模型的输出更加可靠。为此,预先准备了一个Q-A知识对的向量数据库。当用户查询时,一方面通过大语言模型预测答案分布,一方面通过问题的语义表征到向量数据库里面找几个最临近项。通过矢量距离算出一个答案分布。把两边的答案分布结合起来得到最终答案。(氢ai注:看了这个方案,氢AI陷入了深深的思考,同学们,这个方案去掉大语言模型不行吗?有趣确实有趣)

kNN-LM(arXiv:1911.00172)

RAG

RAG就是本文开头提到的那篇确立了RAG概念的论文,是动态、端到端训练的RAG系统反向传播到检索器和生成器的想法的起源。RAG系统如果采用密集召回,则一共有三到四个Transformer堆叠。分别是:双塔型召回器的两个编码器——查询编码器、文档编码器,大语言模型的编码器(可选)和解码器。RAG项目四个都有。这里的“端到端”训练是指,在任务精调的时候,查询编码器和大语言模型联合训练,反向传播方向看下图箭头。RAG的训练过程使得查询编码器可以为任务更好地选择参考文档,而大语言模型则能更好地完成各类NLP任务。在推理时,召回器找到若干参考文档及其概率分布,把它们与原提示词拼接,逐次送入大语言模型的编码器,得到多个潜层表征。再把这些潜层表征与对应参考文档的概率分布求积之和,得到一个最终的潜层表征,送入解码器,生成答案。

RAG(arXiv:2005.11401)

FiD

FiD解决了许多RAG系统的一个核心限制——生成式大语言模型上下文窗口长度。上下文窗口长度受限的根本原因在于自注意力机制的运算复杂度是输入长度的平方级。本来长度就受限,再一做检索增强,添加相关的线索,输入就更长了。为解决这个问题,FiD把目光投向了大语言模型的结构。

在自回归的仅解码器架构走红之前,语言模型普遍采用的是编码器-解码器架构。这种架构将NLP任务抽象成从一个序列转变为另一个序列的任务,不论是问答、翻译等任务都是一样。其中编码器将输入序列映射成潜层表征,解码器再将这个表征映射成输出。因此编码器侧和解码器侧的模型架构和参数都很不一样。值得一提的是,本文介绍的ColBERT等基于语言模型的检索器,都是仅编码器架构。

FiD采用BM25、DRP等公版检索算法,先从外挂数据库中找到一些与检索查询有关的文档或片段,然后分别把它们与检索查询拼接起来。为了规避上下文窗口限制,FiD把这几个拼接分别送入编码器,逐个求出潜层表征,再把这些潜层表征给拼接起来,送入解码器,映射出最终的答案。FiD认为,这种方法有助于综合多段检索内容的意见,提升结果的准确率。FiD的整体思路跟上面REPLUG有相似之处。只不过REPLUG动解码器,FiD动模型;REPLUG的候选叠加是在最后做,而FiD则是在模型的潜层空间做。前一段,有人说OpenAI Sora最令人兴奋之处在于,它的很多操作是在浅层空间完成,看了FiD的方案,同学们会不会有一丝感觉?

FiD(arXiv:2007.01282)

KG-FiD

KG-FiD将知识图谱引入FiD,用于进一步筛选检索内容。作者们指出,FiD和其他RAG框架有一个错误的假设,即检索到的段落的内容是彼此无关的。然而,事实恰恰相反,因为语义彼此近似,检索到的段落中引用的实体不但可能彼此相关,而且它们的关系还可以建模。因此,KD-FiD提出的潜层操作步骤是(用DPR获取并用编码器计算出有关的段落的嵌入后):

1. 结合WikiData和上下文相邻段落构建知识图谱

2. 利用图神经网络(GNN)基于语义关系对段落迭代实施重排序

3. 在检索到的段落中清除相关性不强的、增强相关性最强的,并更新嵌入

如此一来,将检索到的段落去粗取精,然后再与原提示词拼接起来喂给解码器,整个系统的解答就更精准了。

KG-FiD(arXiv:2110.04330)

SURGE

SURGE在KG-FiD基础上更进一步解决了基于图的检索技术中生成式大语言模型可能被无关内容混淆的问题。该框架旨在只检索与上下文相关的子图,并且可以与生成模型一起进行端到端训练。

基于GNN的上下文相关子图检索器从知识图(无向量数据库)中提取相关知识片段,并提取候选三元组(3个节点)。对于每个三元组,通过计算上下文嵌入(基于对话历史)和候选三元组之间的内积来生成检索分布。这个过程包括对三元组嵌入和上下文嵌入的内积进行幂运算,从而得到一个分数,该分数决定了三元组与对话历史的相关性。

该项目利用对比学习来训练模型,以区分基于知识的反馈(使用检索到的子图)和不相关的替代反馈,减轻在训练过程中只展示输入和单个“正确”输出所产生的暴露偏差。

SURGE(arXiv:2305.18846)

RETRO

RETRO是一篇有争议的论文。首先,Google DeepMind从未正式发表过这篇论文。其次,有一线AI大厂宣称无法重复论文中的实验结果。但RETRO论文中有一个表格可以帮助比较几个RAG项目方案的异同。

RETRO(2022)

3. 全动态RAG

REALM

REALM提出了第一个全动态RAG模型(在适配落地场景时,查询编码器、文档编码器、大语言模型需要联合精调)。这篇博客的原作者Wallawitsch认为,REALM从学术角度非常完美,唯一的瑕疵是它使用的大语言模型不是生成式的,因此限制了生成完全新颖/自由形式文本的能力。但氢AI则认为,REALM的最大问题在于,它为了端到端而端到端,由此导致了一个问题。回顾ColBERT项目,我们知道,在应用密集召回器对大型的文档集做召回的时候,是不可能逐一推理查询与文档的相似性的,因为时间成本根本无法接受。实际的方法是,文档编码器需要在离线的时候完成对文档集的扫描,然后把文档的表征保存在类似FAISS的向量数据库中,被查。须知,RAG系统即使在落地后,也是有可能需要重新训练的,比如说要适配新的任务类型,或增添新的场景。然而一旦训练,向量数据库中的表征就过时了,不能用了,需要重新扫描文档集。如果文档集很大,这个成本就会很高。这个缺点,RAG的论文隐晦地提及过,说因为发现精调文档编码器与否对整体性能影响很小,但带来的成本又很高,因此没有采用。也正是因为这个原因,RAG被Wallawitsch归入了静态召回器的范畴,实际上人家只是在端到端的路径中跳过了文档编码器而已。

REALM(arXiv:2002.08909)

4. 其他RAG研究

FLARE

正常的RAG是接到一个查询,获取参考材料,生成最终答案的一过性过程。FLARE则对大语言模型还是不放心,它提出要把这个过程的颗粒度打散,每句话都要检索一次,以防答案中有个别表述不正确。(氢AI注:哭笑不得啊)

FLARE(arXiv:2305.06983)

HyDE

人们表达出来的意思和内心真正的意思可能存在偏差。因此,HyDE提出来用大语言模型先发掘出提示词的真实含义,再把它交给召回器检索文档。(氢AI注:这不是RAG,这是GAR)

HyDE(arXiv:2212.10496)

MuGI

该项目检索的“文档”不是来自于外挂数据库,而是来自于大语言模型的多次生成,本质上等于大语言模型多次生成结果选优。首先让大语言模型生成多段答案,然后用BM25粗排,再用密集召回细排,返回最佳结果。

MuGI(arXiv:2401.06311)

Query Rewriting for Retrieval-Augmented Large Language Models

HyDE的思想被引入进来了。用户查询首先交给大语言模型,生成一个整理后的查询,然后召回相关文档,一并提交给语言模型生成最终答案。本项目的创新之处在于,它引入强化学习的方式训练第一个语言模型。

Query Rewriting for Retrieval-Augmented Large Language Models(arXiv:2305.14283)

Lost in the Middle

这篇文章之前火过,但当时大家的关注点是大语言模型对长文本的内容理解集中在一头一尾。对RAG的启发是,在参考文档检索时,目前的检索器是按相关性排序,而更好的方法也许应该把最相关的文档一部分放在头部、一部分放在尾部。

Lost in the Middle(arXiv:2307.03172)

SILO Language Models

这篇论文为最近的版权侵权诉讼提出了一个解决方案,在这些诉讼中,像《纽约时报》这样的公司起诉模型训练公司,要求对其版权数据付费。作者建议在训练期间仅使用公共领域数据,把版权数据放在外挂数据库里,供项目落地以后使用(方便随时删掉也不影响模型性能)。(氢AI注:模型公司的同学们应该记住这个观点)

SILO Language Models(arXiv:2308.04430)

CRAG

提出了一种当召回文档质量不高时,提高RAG系统鲁棒性的方法,提出以下措施:

1. 使用置信度评分

2. 评估检索到的文档质量,为不准确的检索启动网络搜索

3. 使用分解然后重新组合算法(将文档分割成细粒度的条带,对每个条带的相关性评分,过滤出不相关的条带并连接相关条带)来精炼知识。

CRAG提高了RAG在不同数据集的短格式和长格式生成任务中的性能,展示了其可推广性和稳健性。

CRAG(arXiv:2401.15884)

WebGPT

网络搜索增强生成。信息检索模型接收查询,并可以输出浏览器命令(如点击和滚动),从其确定为信息丰富的网页中提取相关段落。它通过模仿学习(行为克隆)在人类演示例子上训练。接下来,一个单独的文本合成模型对答案进行合成。最后,通过一个奖励模型预测系统的输出分数,然后使用人类反馈强化学习(RLHF)对整个系统进行微调。

WebGPT(arXiv:2112.09332)

Toolformer

Toolformer是对增强生成思想的推广。它提供了一个解决方案,允许LLM通过简单的API调用外部工具。论文中显示的工具使用包括计算器、问答系统、搜索引擎、翻译系统和日历。步骤概括如下:

1. 作者注释了一个大型文本数据集,并对文本中工具API调用可能有用的潜在位置进行了采样

2. 在每个位置,它们生成对不同工具的可能的API调用

3. 执行这些API调用,并将调用+响应插入到原始文本中(如“[QA(谁创立了苹果?)->Steve Jobs]”)

4. 检查添加应用程序调用是否能降低了LM预测的困惑度,如果可以就保留

5. 将上述步骤得到的数据用于对原始LM实施精调

该系统有许多局限性,例如无法组合使用工具、交互性使用工具,或考虑工具使用成本。

WebGPT(arXiv:2302.04761)

Gorilla

Toolformer的一个局限性是,会使用的工具太少。相比之下,本文的作者开发了一种基于检索的微调策略来训练一种名为Gorilla的大语言模型,使其可以使用1600多种不同的深度学习模型API(例如,来自HuggingFace或TensorFlow Hub)来解决问题。首先,它下载各种工具的API文档。然后,它使用这些数据创建问答对数据集(使用自指令)。最后,以检索感知的方式在此数据集上对7B模型进行精调。

Gorilla(arXiv:2305.15334)

Self-RAG

作者指出了大多数RAG系统的问题,即它们不分青红皂白地检索段落,而不管事实基础是否有用。Self-RAG算法使用一种称为“反思token”的特殊类型的令牌在算法的不同部分之间进行通信:Retrieve、IsRel(相关性)、IsSup(完全支持或不支持)和IsUse(有用响应)等。

Self-RAG(arXiv:2310.11511)

GRIT

解决了Self-RAG提出的类似问题,同时具有很强的性能。作者通过生成式指令精调训练单个大语言模型来执行文本生成和嵌入任务。换句话说,GRIT的模型架构允许它处理输入文本、创建嵌入和生成输出文本。

除了有条件的工具使用功能外,还可以通过复用来进一步提高性能:首先,将查询的向量表征用于检索和生成;其次,复用文档键-值存储(基本上是原始检索的向量数据库数据)进行生成。

GRIT在海量文本嵌入基准(MTEB)和各种其他评估基准上的生成和嵌入任务性能超出了所有其他同等尺寸的模型,从而树立了一个新的基准。(氢AI注:GRIT实际上是将召回器和生成器集成到一个模型里面了)

GRIT(arXiv:2402.09906)

5. 小结

我们每天使用的产品,如Intercom的AI聊天机器人、Perplexity.AI、You.com、phind.com、Komo.AI或集成在Bing中的ChatGPT,都是基于某种冻结或不太动态的RAG架构。

上面总结的许多研究都处于休眠状态,应用很少。如果有企业能将这些安全、高性能的技术商业落地,实现更快、更可靠的知识访问,将非常令人兴奋。