大语言模型可以把大量的信息和知识压缩起来,提供一个友好但不精确的检索。出于神经网络的本质,它经常可能把从语料中某个领域学来的“套路”应用到完全不相干的另一个领域,“他山之石可以攻玉”,故尔往往可以给出非常惊艳的答案。但正如一个硬币有正反两面,大语言模型的这个特点,往往也使得它会在某些场景突然“扑街”。因此,应用大语言模型,首先就要“驯服”大语言模型。
日前,创新学习辅助应用RemNote创始人、EmergentVentures风投基金合伙人MoritzWallawitsch发表了一篇博文,通过一系列极具代表性的科研项目详解了RAG技术的发展历程,最久的项目远追溯到2017年,最新的项目上个月才报道。
检索增强研究
2017-2024
本文的灵感来自DouweKiela的精彩讲座“StanfordCS25:V3IRetrievalAugmentedLanguageModels”,他与PatrickLewis、EthanPerez等人于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.检索(召回)
早在2017年,稀疏召回就被用于问答类RAG(当时Transformer还在襁褓中,使用LSTM作为生成器/读取器)系统的首批实例之一(arXiv:1704.00051)。
深度学习时代来临后,人们开始尝试将深层神经网络引入NLP领域。同“稀疏召回”一样,神经网络也是用高维向量来表征次词、词语、短语、句子、段落乃至文档。不同之处在于,深度神经网络可以把从大量训练预料中提取到的语义信息注入表征向量(提取表征的过程成为“嵌入「Embedding」”),从而使得语义相近的自然语言片段在高维表征空间中的几何距离也相近。这样一来,表征向量的信息含量就大了,也没有那么多“0”。因此,此类召回技术被称为“密集召回”。
下面,本文将通过ColBERT和FAISS两个项目展开讲解密集召回器。MORITZWALLAWITSCH在原文中还陈列了其他几个密集召回项目,不太想纠结于此的读者看过ColBERT和FAISS之后就可以进入下一大节“冻结和动态RAG”。
ColBERT虽然被MORITZWALLAWITSCH归为“稀疏-密集”混合召回。但氢AI认为,该项目最大的历史意义是第一次提出了上面论述过的“密集召回”的基本原理和工作流程思想——即目前普遍被称为“暹罗塔(SiamTower)或双塔”的双编码器架构以及在线-离线流程方法,如图所示。
ColBERT(arXiv:2004.12832)
最早建立在密集嵌入之上的问答系统之一是ORQA。它经过端到端的训练,只使用问答对来联合训练证据检索和回答。它将检索视为一个通过对“反向完形填空”任务(预测句子的周围上下文)进行预训练初始化的无监督的潜在变量。(氢AI注:名为问答系统,实际上就是个密集召回器,缺少后端的大语言模型。原作者陈列这个例子是为了说明密集召回器的训练方法)
ORQA(arXiv:1906.00300)
SPLADE(arXiv:2107.05720)
DRAGON(arXiv:2302.07452)
Structure-AwareDeNseReTrievAl(SANTA)解决了将查询与结构化外部文档对齐的挑战,尤其是结构化数据(如代码或产品规范)与非结构化数据(例如文本描述)之间的不够一致的问题。它通过以下两种预训练策略增强了检索器对结构化信息的敏感性:
1.利用结构化和非结构化数据之间的内在一致性,为结构化敏感预训练方案中的对比学习提供信息;
2.实现掩蔽实体预测(利用以实体为中心的掩蔽策略,鼓励语言模型预测和填充掩蔽实体,促进对结构化数据的更深入理解)。
SANTA(arXiv:2305.19912)
2.从冻结走向动态的RAG
我们知道,在做垂直业务落地的过程中,大语言模型可能是需要精调的。但是RAG系统中除了用于生成最终答案的大语言模型,还可能有别的语言模型结构——密集召回器。那么,RAG系统在客户侧落地过程中,到底要怎么精调呢?是精调其中之一?还是分别精调?或是联合精调呢?
理想情况下,在“全动态”模型中,损失函数的梯度将回流整个系统(端到端训练):检索器、生成器和文档编码器。然而,这在计算上具有挑战性,并且尚未成功完成。
In-ContextRALM(arXiv:2302.00083)
REPLUG的方法跟上面的差不多,它是将大语言模型视作黑盒,也即不限制大语言模型的品牌型号,并在其前端加一个Contriever检索模型。首先用对比大语言模型似然度和检索模型似然度的方式,训练检索模型,使其适应大语言模型的“偏好”。在推理时,先用检索模型检索出若干个片段,与原prompt组合在一起分别输入大语言模型推理,最后将多次推理的结果加总,选得分最高者作为最终答案。
REPLUG(arXiv:2301.12652)
DREditor项目只讲检索器。上面,不论是In-ContextRALM还是REPLUG,都是生成式大语言模型不用动,但检索器需要针对不同的任务(知识领域)做适配以进一步丰富大语言模型的提示,方法是模型精调(检索器本身也是个语言模型)。DREditor提出的方法是,检索器精调也省了。当RAG系统需要适配新的客户场景时,只需要观察一些检索器在新场景中的成功和失败的例子,用观测到的误差训练一个特殊的最小二乘算子直接调整检索模型生成的文档表征,从而强行适配。DREditor宣称可在精度持平或更高的基础上,让系统适配的效率提升100到300倍。
(氢AI注:感觉迷糊的同学,可以回顾一下上面的ColBERT项目。检索器,通常是一个双塔模型,一个塔计算检索查询的语义表征,另一个塔计算文档段落的语义表征,完后通过内积等算法判断两边表征的相似度,就可以把与查询有关的段落给摘出来。为什么要用两个模型塔?因为提问和回答的语义显然是不一样的,但我们可以训练模型故意让它们的表征内积大,因此两个模型肯定不一样。好,现在有一个这样的检索模型,它在一个领域比如说医学领域,通过精调,很有效。但如果把它放在电力领域,它可能一下子就失效了。怎么办呢?正规的办法是用电力问答对再精调它一下。但是DREditor的作者告诉你,不用那么费事,有一个办法,可以不动模型参数,直接调整模型输出的表征。不精调模型,而是训练一个简单的多的表征调整算法,重新让这个模型有效,但开销大大降低了!)
DREditor(arXiv:2401.12540)
kNN-LM是一篇有趣的论文,作者试图从后端使大语言模型的输出更加可靠。为此,预先准备了一个Q-A知识对的向量数据库。当用户查询时,一方面通过大语言模型预测答案分布,一方面通过问题的语义表征到向量数据库里面找几个最临近项。通过矢量距离算出一个答案分布。把两边的答案分布结合起来得到最终答案。(氢ai注:看了这个方案,氢AI陷入了深深的思考,同学们,这个方案去掉大语言模型不行吗?有趣确实有趣)
kNN-LM(arXiv:1911.00172)
RAG就是本文开头提到的那篇确立了RAG概念的论文,是动态、端到端训练的RAG系统反向传播到检索器和生成器的想法的起源。RAG系统如果采用密集召回,则一共有三到四个Transformer堆叠。分别是:双塔型召回器的两个编码器——查询编码器、文档编码器,大语言模型的编码器(可选)和解码器。RAG项目四个都有。这里的“端到端”训练是指,在任务精调的时候,查询编码器和大语言模型联合训练,反向传播方向看下图箭头。RAG的训练过程使得查询编码器可以为任务更好地选择参考文档,而大语言模型则能更好地完成各类NLP任务。在推理时,召回器找到若干参考文档及其概率分布,把它们与原提示词拼接,逐次送入大语言模型的编码器,得到多个潜层表征。再把这些潜层表征与对应参考文档的概率分布求积之和,得到一个最终的潜层表征,送入解码器,生成答案。
RAG(arXiv:2005.11401)
在自回归的仅解码器架构走红之前,语言模型普遍采用的是编码器-解码器架构。这种架构将NLP任务抽象成从一个序列转变为另一个序列的任务,不论是问答、翻译等任务都是一样。其中编码器将输入序列映射成潜层表征,解码器再将这个表征映射成输出。因此编码器侧和解码器侧的模型架构和参数都很不一样。值得一提的是,本文介绍的ColBERT等基于语言模型的检索器,都是仅编码器架构。
FiD采用BM25、DRP等公版检索算法,先从外挂数据库中找到一些与检索查询有关的文档或片段,然后分别把它们与检索查询拼接起来。为了规避上下文窗口限制,FiD把这几个拼接分别送入编码器,逐个求出潜层表征,再把这些潜层表征给拼接起来,送入解码器,映射出最终的答案。FiD认为,这种方法有助于综合多段检索内容的意见,提升结果的准确率。FiD的整体思路跟上面REPLUG有相似之处。只不过REPLUG动解码器,FiD动模型;REPLUG的候选叠加是在最后做,而FiD则是在模型的潜层空间做。前一段,有人说OpenAISora最令人兴奋之处在于,它的很多操作是在浅层空间完成,看了FiD的方案,同学们会不会有一丝感觉?
FiD(arXiv:2007.01282)
1.结合WikiData和上下文相邻段落构建知识图谱
2.利用图神经网络(GNN)基于语义关系对段落迭代实施重排序
如此一来,将检索到的段落去粗取精,然后再与原提示词拼接起来喂给解码器,整个系统的解答就更精准了。
KG-FiD(arXiv:2110.04330)
SURGE(arXiv:2305.18846)
RETRO(2022)
3.全动态RAG
REALM(arXiv:2002.08909)
4.其他RAG研究
正常的RAG是接到一个查询,获取参考材料,生成最终答案的一过性过程。FLARE则对大语言模型还是不放心,它提出要把这个过程的颗粒度打散,每句话都要检索一次,以防答案中有个别表述不正确。(氢AI注:哭笑不得啊)
FLARE(arXiv:2305.06983)
人们表达出来的意思和内心真正的意思可能存在偏差。因此,HyDE提出来用大语言模型先发掘出提示词的真实含义,再把它交给召回器检索文档。(氢AI注:这不是RAG,这是GAR)
HyDE(arXiv:2212.10496)
该项目检索的“文档”不是来自于外挂数据库,而是来自于大语言模型的多次生成,本质上等于大语言模型多次生成结果选优。首先让大语言模型生成多段答案,然后用BM25粗排,再用密集召回细排,返回最佳结果。
MuGI(arXiv:2401.06311)
QueryRewritingforRetrieval-AugmentedLargeLanguageModels(arXiv:2305.14283)
LostintheMiddle(arXiv:2307.03172)
SILOLanguageModels(arXiv:2308.04430)
提出了一种当召回文档质量不高时,提高RAG系统鲁棒性的方法,提出以下措施:
1.使用置信度评分
2.评估检索到的文档质量,为不准确的检索启动网络搜索
CRAG提高了RAG在不同数据集的短格式和长格式生成任务中的性能,展示了其可推广性和稳健性。
CRAG(arXiv:2401.15884)
WebGPT(arXiv:2112.09332)
Toolformer是对增强生成思想的推广。它提供了一个解决方案,允许LLM通过简单的API调用外部工具。论文中显示的工具使用包括计算器、问答系统、搜索引擎、翻译系统和日历。步骤概括如下:
1.作者注释了一个大型文本数据集,并对文本中工具API调用可能有用的潜在位置进行了采样
2.在每个位置,它们生成对不同工具的可能的API调用
4.检查添加应用程序调用是否能降低了LM预测的困惑度,如果可以就保留
5.将上述步骤得到的数据用于对原始LM实施精调
该系统有许多局限性,例如无法组合使用工具、交互性使用工具,或考虑工具使用成本。
WebGPT(arXiv:2302.04761)
Toolformer的一个局限性是,会使用的工具太少。相比之下,本文的作者开发了一种基于检索的微调策略来训练一种名为Gorilla的大语言模型,使其可以使用1600多种不同的深度学习模型API(例如,来自HuggingFace或TensorFlowHub)来解决问题。首先,它下载各种工具的API文档。然后,它使用这些数据创建问答对数据集(使用自指令)。最后,以检索感知的方式在此数据集上对7B模型进行精调。
Gorilla(arXiv:2305.15334)
Self-RAG(arXiv:2310.11511)
解决了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架构。
上面总结的许多研究都处于休眠状态,应用很少。如果有企业能将这些安全、高性能的技术商业落地,实现更快、更可靠的知识访问,将非常令人兴奋。