23年12月同济大学和复旦大学的综述论文“Retrieval-Augmented Generation for Large Language Models: A Survey”。
大语言模型(LLM)展示了强大的功能,但在实际应用中仍然面临挑战,如幻觉、知识更新缓慢以及答案缺乏透明度。检索增强生成(RAG)是指在使用LLM回答问题之前,从外部知识库中检索相关信息。RAG已被证明可以显著提高答案的准确性,减少模型幻觉,尤其是在知识密集型任务中。通过引用来源,用户可以验证答案的准确性,并增加对模型输出的信任。它还促进了知识更新和特定领域知识的引入。RAG有效地将LLM的参数化知识与非参数化的外部知识库相结合,使其成为实现大型语言模型的最重要方法之一。本文概述了LLM时代RAG的发展范式,总结了三种范式:天真RAG、高级RAG和模块RAG。然后总结和组织了RAG的三个主要组成部分:检索器、生成器和增强方法,以及每个组成部分的关键技术。此外,还讨论了如何评估RAG模型的有效性,介绍了RAG的两种评估方法,强调了评估的关键指标和能力,并提出了最新的自动评估框架,以及RAG的技术堆栈和生态系统。
术语“检索增强生成(RAG)”最早由[Lewis2020]引入。它将预训练的检索器与预训练的seq2seq模型(生成器)相结合,并进行端到端的微调,以更可解释和模块化的方式获取知识。在大模型出现之前,RAG主要专注于端到端模型的直接优化。在检索端进行密集检索,例如使用基于向量的Dense Passage Retrieval(DPR)[Carpukhin2020],以及在生成端训练较小的模型是常见的做法。由于总体参数大小较小,检索器和生成器经常进行同步的端到端训练或微调[Izacard2022]。
RAG算法和模型的发展如图所示。从时间上看,大多数与RAG相关的研究都出现在2020年之后,2022年12月ChatGPT发布时出现了重大转折。自ChatGPT发布以来,自然语言处理领域的研究已进入大模型时代。天真RAG技术很快得到了重视,导致相关研究的数量迅速增加。在增强策略方面,自RAG概念引入以来,关于预训练和监督微调阶段强化的研究一直在进行中。然而,大多数关于推理阶段强化的研究都出现在LLM时代。这主要是由于与高性能大模型相关的高训练成本。研究人员试图通过在推理阶段包括RAG模块,以成本效益高的方式结合外部知识来增强模型生成。关于增强数据的使用,早期的RAG主要关注非结构化数据的应用,特别是在开放领域问答的背景下。随后,用于检索的知识源范围扩大,使用高质量的数据作为知识来源,有效地解决了大模型中错误知识的内化(internalization)和幻觉等问题。这包括结构化知识,知识图就是一个典型的例子。最近,人们越来越关注自检索,它涉及挖掘LLM本身的知识以提高其性能。
RAG的含义随着技术的发展而扩展。在大语言模型时代,RAG的具体定义是指在回答问题或生成文本时,首先从大量文档中检索相关信息的模型。随后,它利用这些检索到的信息来生成响应或文本,从而提高预测的质量。RAG方法允许开发人员避免为每个特定任务重新训练整个大模型。相反,他们可以附加一个知识库,为模型提供额外的信息输入,并提高其响应的准确性。RAG方法特别适用于知识密集型任务。总之,RAG系统由两个关键阶段组成:
1.利用编码模型,基于问题去检索相关文档,如BM25、DPR、Col-BERT和类似方法[Roberson2009,Karpukhin2020,Khattab&Zaharia2020]。
2.生成阶段:使用检索的上下文作为条件,系统生成文本。
在大语言模型(LLM)的优化中,除了RAG,另一个重要的优化技术是微调。
RAG类似于为模型提供教科书,允许它基于特定查询检索信息。这种方法适用于模型需要回答特定查询或处理特定信息检索任务的场景。然而,RAG不适合教导模型理解广泛的领域或学习新的语言、格式或风格。
微调类似于让学生通过广泛的学习内化知识。当模型需要复制特定的结构、样式或格式时,这种方法非常有用。微调可以提高非微调模型的性能,并使交互更加高效。它特别适合于强调基础模型中的现有知识,修改或自定义模型的输出,以及为模型提供复杂的指令。然而,微调不适合将新知识纳入模型,也不适合需要快速迭代新用例的情况。RAG和微调(FT)之间的具体比较可以在表中说明。
RAG和微调并不互斥,但可以相互补充,增强模型在不同层面的能力。在某些情况下,将这两种技术相结合可以实现最佳的模型性能。使用RAG进行优化和微调的整个过程可能需要多次迭代才能获得令人满意的结果。
现有研究表明,与其他优化大语言模型的方法相比,检索增强生成(RAG)具有显著优势[Shuster 2021,Yasunaga 2022,Wang 2023c,Borgeud 2022]:
RAG通过将答案与外部知识相关联来提高准确性,减少语言模型中的幻觉问题,并使生成的回答更加准确可靠。
用检索技术可以识别最新的信息。与仅依赖训练数据的传统语言模型相比,RAG保持了响应的及时性和准确性。
透明度是RAG的一个优势。通过引用来源,用户可以验证答案的准确性,增加对模型输出的信任。
RAG具有定制功能。通过索引相关的文本语料库,可以针对不同的领域定制模型,为特定领域提供知识支持。
在安全和隐私管理方面,RAG凭借其在数据库中内置的角色和安全控制,可以更好地控制数据使用。相比之下,微调后的模型可能缺乏谁可以访问哪些数据的明确管理。
RAG的可扩展性更强。它可以处理大规模数据集,而无需更新所有参数和创建训练集,从而提高了经济效率。
最后,RAG产生的结果更值得信赖。RAG从最新数据中选择确定性结果,而微调模型在处理动态数据时可能会出现幻觉和不准确,缺乏透明度和可信度。
如图是RAG和其他优化(提示和微调)方法的比较:
天真RAG研究范式,代表了在ChatGPT广泛采用后不久获得重视的最早方法。天真RAG涉及传统的过程:索引、检索和生成。天真RAG也被概括为“检索”-“阅读”框架[Ma2023a]。
天真RAG在三个领域面临主要挑战:检索质量、响应生成质量和增强过程。
关于检索质量,问题是多方面的。主要问题是精度低,检索集中的所有块都与查询相关,这会导致潜在的幻觉和空半空坠落问题。第二个问题是低召回率,当没有检索到所有相关块时,会出现这种情况,从而阻止LLM获得足够的上下文来合成答案。此外,过时的信息带来了另一个挑战,即数据冗余或过时的数据可能导致不准确的检索结果。
就产生反应的质量而言,问题同样多样化。幻觉是一个突出的问题,模型编造了一个上下文中不存在的答案。不相关是另一个问题,模型生成的答案无法解决查询问题。此外,毒性或偏见,即模型产生有害或冒犯性反应,是另一个问题。
最后,增强过程也面临着几个挑战。至关重要的是,将检索到的段落中的上下文与当前的生成任务有效地结合起来至关重要。如果处理不当,输出可能会显得不连贯或不连贯。冗余和重复是另一个问题,特别是当多个检索到的段落包含相似的信息,导致生成步骤中的内容重复时。此外,确定多个检索到的段落对生成任务的重要性或相关性是具有挑战性的,并且增强过程需要适当平衡每个段落的值。检索的内容也可能来自不同的写作风格或语调,增强过程需要调和这些差异以确保输出的一致性。最后,生成模型可能过度依赖增强信息,导致输出仅重复检索到的内容,而不提供新的价值或合成信息。
高级RAG针对天真RAG的不足进行了有针对性的改进。在检索生成的质量方面,高级RAG结合了检索前和检索后的方法。为了解决天真RAG遇到的索引问题,高级RAG通过滑动窗口、细粒度分割和元数据等方法优化了索引。同时,提出了多种优化检索过程的方法。在具体实现方面,高级RAG可以通过流水线或端到端的方式进行调整。
从数据库中检索到有价值的上下文后,将其与查询合并以输入LLM会带来挑战。同时向LLM呈现所有相关文档可能会超过上下文窗口限制。将大量文档连接起来形成冗长的检索提示是无效的,这会引入噪声并阻碍LLM对关键信息的关注。为了解决这些问题,需要对检索到的内容进行额外的处理。
检索过程的优化旨在提高RAG系统的效率和信息质量。目前的研究主要集中在智能地结合各种搜索技术,优化检索步骤,引入认知回溯(cognitive backtracking)的概念,灵活应用各种查询策略,并利用嵌入相似性。这些努力共同努力实现RAG检索中上下文信息的效率和丰富性之间的平衡。
模块化RAG结构打破了传统的天真RAG索引、检索和生成框架,在整个过程中提供了更大的多样性和灵活性。一方面,它集成了各种方法来扩展功能模块,例如在相似性检索中加入搜索模块,并在检索器中应用微调方法[Lin 2023]。此外,特定问题导致了重组RAG模块的出现[Yu2022]和迭代方法,如[Shao2023]。模块化RAG范式正在成为RAG领域的主流,允许跨多个模块的串行化流水线或端到端训练方法。
模块化RAG的组织方法是灵活的,允许根据特定的问题上下文替换或重新配置RAG过程中的模块。对于由检索和生成两个模块组成的天真RAG(在一些文献中称为读取或合成),该框架提供了适应性和丰富性。目前的研究主要探讨两种组织范式,包括模块的添加或替换,以及模块之间组织流动的调整。
三种RAG范式之间的比较如图所示:
RAG核心组件的类别如图所示:
在RAG的上下文中,“R”代表检索,在从庞大的知识库中检索前k个相关文档的RAG流水线中发挥作用。然而,制作一只高质量的检索器是一项不平凡的任务。有三个关键问题值得讨论:
1)如何获得准确的语义表示?在RAG中,语义空间是查询和文档映射的多维空间。当重新检索时,它是在语义空间内测量的。如果语义表达不准确,那么它对RAG的影响是致命的,
2) 如何匹配查询和文档的语义空间?在RAG应用程序中,一些检索器使用相同的嵌入模型对查询和文档进行编码,而另一些检索器则使用两个模型分别对查询和单据进行编码。此外,用户的原始查询可能存在表达不佳和缺乏语义信息的问题。因此,对齐用户查询和文档的语义空间是非常必要的。
3) 如何将检索器的输出与大语言模型的首选项对齐?在RAG流水线中,即使采用上述技术来提高检索命中率,也可能无法提高RAG的最终效果,因为检索的文档可能不是LLM所需要的。
RAG的另一个核心组件是生成器“G”,负责将检索到的信息转换为自然流畅的文本。它的设计灵感来自传统的语言模型,但与传统的生成模型相比,RAG的生成器通过利用检索的信息来提高准确性和相关性。在RAG中,生成器的输入不仅包括传统的上下文信息,还包括通过检索器获得的相关文本片段。这使生成器能够更好地理解问题背后的背景,并产生信息更丰富的回答。此外,生成器以检索的文本为指导,以确保生成的内容和检索到的信息之间的一致性。正是输入数据的多样性导致了生成阶段的一系列有针对性的工作,所有这些工作都旨在使大模型更好地适应查询和文档中的输入数据。
如何通过检索后处理增强检索结果?就未经编辑的大语言模型而言,大多数研究都依赖于公认的大语言模式,如GPT-4[OpenAI,2023],利用其强大的内部知识优势来全面检索文档知识。然而,这些大模型的固有问题,如文本长度限制和冗余信息的漏洞,仍然存在。为了缓解这些问题,一些研究在检索后处理方面做出了努力。检索后处理是指对检索器从大型文档数据库中检索到的相关信息进行进一步处理、滤波或优化的过程。其主要目的是提高检索结果的质量,以更好地满足用户需求或后续任务。它可以被理解为对检索阶段获得的文档进行再处理的过程。检索后处理的操作通常涉及到信息压缩和结果重新排序。
如何优化生成器以适应输入数据?在RAG模型中,生成器的优化是架构的关键组成部分。生成器的任务是获取检索到的信息并生成相关文本,从而提供模型的最终输出。优化生成器的目标是确保生成的文本既自然又有效地利用检索到的文档,从而更好地满足用户的查询需求。在典型的语言模型(LLM)生成任务中,输入通常是一个查询。在RAG中,主要区别在于输入不仅包括查询,还包括检索器检索的各种文档(结构化/非结构化)。额外信息的引入可能会对模型的理解产生重大影响,尤其是对于较小的模型。在这样的场景中,微调模型以适应查询+检索文档的输入变得尤为重要。具体来说,在向微调模型提供输入之前,通常会对检索器检索到的文档进行检索后处理。需要注意的是,RAG中微调生成器的方法基本上类似于LLM的一般微调方法。
RAG的“A”是增强,包括增强的各个阶段、增强的数据源和增强的过程。
作为一项知识密集型任务,RAG在语言模型训练的预训练、微调和推理阶段采用了不同的技术方法。
增强的预训练阶段,其优势和局限性是显而易见的。从积极的方面来看,这种方法提供了一个更强大的基础模型,在困惑(perplexity)、文本生成质量和下游任务性能方面优于标准GPT模型。此外,与纯预训练的模型相比,它使用更少的参数来实现更高的效率。它特别擅长处理知识密集型任务,允许通过对特定领域语料库的训练来创建特定领域的模型。然而,也存在缺点,包括需要大量的预训练数据和更大的训练资源,以及更新速度较慢的问题。特别是随模型大小的增加,检索增强训练的成本变得相对较高。尽管存在这些局限性,但该方法在模型鲁棒性方面表现出显著的特点。经过训练后,基于纯预训练的检索增强模型消除了对外部库依赖性的需求,提高了生成速度和操作效率。
增强的微调阶段存在局限性,例如需要专门为RAG微调准备的数据集,以及与推理阶段的RAG相比需要大量的计算资源。总的来说,在微调过程中,研究人员可以根据特定的需求和数据格式灵活地定制模型,与预训练阶段相比,减少了资源消耗,同时保留了调整模型输出风格的能力。
增强的推理阶段具有重量轻、成本效益高、不需要额外训练以及利用强大的预训练模型的优点。主要优势在于在微调过程中冻结LLM的参数,重点是提供更符合要求的文本,具有快速和低成本的特点。然而,这种方法也有一些局限性,包括需要额外的数据处理和流程优化,同时受到基础模型能力的限制。通常,这种方法通常与过程优化技术相结合,如逐步推理、迭代推理和自适应检索,以更好地满足不同任务的要求。
数据来源是RAG有效性的关键因素。各种数据源提供了不同的知识粒度和维度,需要不同的处理方法。它们主要分为三类:非结构化数据、结构化数据和LLM生成的内容。
非结构化数据主要包括文本数据,通常源自纯文本语料库。此外,其他文本数据可以作为检索源,例如用于大模型微调的提示数据[Cheng 2023a]和跨语言数据[Li 2023b]。
结构化数据源(如知识图(KG))逐渐融入RAG的范式。经过验证的KG可以提供更高质量的上下文,降低模型幻觉的可能性。
观察到RAG回忆的辅助信息并不总是有效的,甚至可能产生负面影响,一些研究通过深入研究LLM的内部知识来扩展RAG的范式。这种方法利用LLM本身生成的内容进行检索,旨在提高下游任务的性能。
大多数RAG研究通常只执行单个检索和生成过程。然而,单次检索可能包含冗余信息,导致“中间丢失”现象[Liu 2023]。这种冗余信息可能会模糊关键信息或包含与真实答案相反的信息,对生成效果产生负面影响[Yoran2023]。此外,从单个检索中获得的信息在需要多步骤推理的问题中是有限的。
目前优化检索过程的方法主要包括迭代检索和自适应检索。这些允许模型在检索过程中多次迭代,或者自适应地调整检索过程,以更好地适应不同的任务和场景。