前面介绍了RAG的基础内容,下面来具体梳理一下RAG的优点。
RAG的一个优点是它能够生成高质量的回答。因为在生成过程中,检索器可以从大量文档中检索问题相关的信息,然后基于这些信息生成回答。这使得整个系统能够充分利用现有知识生成更准确、更具深度的回答,也意味着模型出现幻觉答案的概率更小。
在图1-1和图1-2中,我们分别询问了ChatGPT和Bing Chat两个问题:“RAG是什么?”“为什么大模型都是Decoder结构?”。可以明显感受到,使用了RAG的Bing Chat对自己的答案更加自信,并且给出的答案更加专业。而ChatGPT的结果更倾向于罗列各种可能性,它并不知道近期这些名词在哪些领域更热门。
RAG具有很好的可扩展性,这意味着它可以轻松地适应新的数据和任务。由于RAG采用了检索—生成的框架,因此只需更新检索部分的数据,就可以使模型适应新的知识领域。这使得RAG在面对新领域或不断更新的知识库时具有很强的适应性。
RAG具有一定程度的可解释性,这意味着我们可以理解模型是如何生成回答的。由于RAG的特性,我们可以很容易地追溯模型是从哪些文档中提取信息的。这使得我们可以评估模型的回答是否基于可靠的数据来源,从而提高模型的可信度。例如,在前面图1-2的例子中,Bing Chat不仅回答了我们提出的问题,还给出了模型从哪些文档中提取了信息。如果这些文档来自权威的科学出版物或者知名的网站,那么我们就可以相信模型的回答是准确的。
由于RAG的知识库能够与生成模型解耦,因此只要拥有一定的数据量,企业便可将RAG作为微调的替代方法,而微调可能需要大量资源。这种模式对中小企业非常友好。从另一个角度来看,由于企业的数据都是私有的,提供相关文档作为背景信息可以使生成结果更加准确、更具实用性,以满足企业的特定任务需求。
与任何技术一样,RAG也有其局限性和缺点。
RAG系统给出的答案极其依赖于检索的质量。如果检索到的文档与问题无关或质量较低,生成的回答也可能质量较低。如果搜索的文档并未覆盖到问题的答案,那模型也基本无法回答用户提出的问题。因此,在实际应用中,我们会利用很多策略来提高文档片段的召回率。在很多场景中,文档片段的时效性也是要考虑的一部分,例如金融场景,用户咨询10月份的金股是什么,如果召回片段不包含10月份的券商金股研报,甚至召回很多旧的金股研报,那对最后的大模型生成会产生很大的干扰。还有很多其他的召回情况都会影响到模型的结果生成,因此想构建一个好的RAG系统,检索部分是极其重要的,需要花费大量的时间来打磨。
RAG依赖于一个现有的文档数据库进行检索。首先,如果没有一个大规模的知识库,就无法发挥RAG的优点。其次,如果知识库覆盖面不够,无法召回相应的知识块,那么模型因为需要遵循指令的约束而无法给出答案,这就会影响到整个系统的问题覆盖率。
由于RAG系统需要先检索文档,然后生成答案,相比于纯粹的大模型推理,整个系统的推理耗时会更长。在这种情况下,对于一些延时要求高的场景就无法满足需求。不过这个耗时问题属于大模型的通病,在使用网页端ChatGPT的时候,它以流式打字机的模式展示并按字来输出结果,所以用户可能不会感觉很慢,但如果统计从问题发送到答案完整生成这个过程,耗时还是非常长的。
召回模块输出的文档片段数量需要考虑到生成模型能处理的最大长度,例如最早的ChatGPT(GPT-3.5-turbo)的最大上下文长度是4096个token。如果你的文档片段是512个token的长度,那实际上需要使用8个片段(512×8=4096),所以召回部分就需要考虑如何在这8个片段中把召回率做到最优。不过也有其他的折中方案,可以召回更多的文档片段。例如,可以采用对检索的文档片段进行压缩,借助大模型进行要点总结之类的策略。也可以对生成端的模型应用长度外推技巧,现有的长度外推策略已经比较成熟,有很多非常优秀的外推策略,可以让模型推理的长度远远超过训练阶段的长度。