Retrieval-Augmented Generation for Large Language Models: A Survey


TL;DR

本文系统性地综述了大型语言模型(LLM)的检索增强生成(Retrieval-Augmented Generation,RAG)技术,将其发展划分为朴素(Naive)、高级(Advanced)和模块化(Modular)三个范式,并深入剖析了检索、生成与增强这三大核心组件的前沿技术、评估体系及未来挑战。

RAG概述

一个典型的RAG应用场景如图2所示。当用户向ChatGPT这类模型询问近期发生的事件时,由于其知识库截止于预训练数据,无法直接回答。RAG通过从外部知识库(如新闻文章)中检索相关信息,并将这些信息与原始问题一同作为提示(Prompt)输入给LLM,从而赋能LLM生成基于最新信息的、内容详实的回答。

一个RAG在问答任务中的典型应用实例 图2:一个RAG在问答任务中的典型应用实例。主要包含3个步骤:1) 索引:将文档分割成块,编码成向量并存入向量数据库。2) 检索:根据语义相似度,检索与问题最相关的Top-K个文本块。3) 生成:将原始问题和检索到的文本块一同输入LLM,生成最终答案。

RAG的研究范式在不断演进,本文将其归纳为三个阶段:朴素RAG、高级RAG和模块化RAG,如图3所示。

三种RAG范式的对比 图3:三种RAG范式的对比。(左) 朴素RAG主要包含索引、检索和生成三部分。(中) 高级RAG围绕检索前和检索后环节提出了多种优化策略,其流程与朴素RAG相似,仍为链式结构。(右) 模块化RAG继承并发展了前两种范式,整体展现出更大的灵活性,引入了多个特定功能模块并可替换现有模块,其流程不限于顺序执行,包含迭代和自适应检索等方式。

朴素RAG

朴素RAG是早期的主流方法,遵循“检索-阅读”(Retrieve-Read)的流程,主要包括三个步骤:

  1. 索引 (Indexing):将原始文档(如PDF、HTML等)清洗并转换为纯文本,分割成小块(Chunks),然后使用嵌入模型(Embedding Model)将其向量化,并存入向量数据库。
  2. 检索 (Retrieval):接收到用户查询后,使用相同的嵌入模型将查询向量化,并与数据库中的文本块向量计算相似度,检索出最相关的Top-K个文本块。
  3. 生成 (Generation):将原始查询和检索到的文本块整合成一个提示,交由LLM生成回答。

然而,朴素RAG存在明显缺陷:

高级RAG

为了克服朴素RAG的局限性,高级RAG引入了特定优化。它主要通过检索前(Pre-retrieval)检索后(Post-retrieval)策略来提升检索质量。

模块化RAG

模块化RAG架构提供了更高的适应性和多功能性,它不仅优化现有组件,还引入了新的模块并支持更灵活的流程编排。

新模块

模块化RAG框架引入了多个专用组件以增强其能力:

新模式

模块化RAG通过模块的替换和重组,打破了朴素和高级RAG固定的“检索-阅读”链式结构,展现出强大的灵活性。

RAG vs. 微调 (Fine-tuning)

RAG与其他模型优化方法的比较 图4:RAG与其他模型优化方法在“所需外部知识”和“所需模型适配”两个维度的比较。提示工程对模型和外部知识的改造要求最低;微调涉及对模型的进一步训练;RAG在早期对模型改造要求低,但随着发展,模块化RAG与微调技术结合得越来越紧密。

如图4所示,RAG和微调是增强LLM的两种不同路径:

RAG和微调并非互斥,可以互补使用。研究表明,在知识密集型任务上,RAG的表现通常优于无监督微调。两者的结合往往能达到最佳性能。

RAG方法总结

下表总结了本文调研的多种RAG方法的特性。

| 方法 | 检索来源 | 数据类型 | 检索粒度 | 增强阶段 | 检索过程 | |—|—|—|—|—|—| | CoG [29] | Wikipedia | 文本 | 短语 | 预训练 | 迭代 | | DenseX [30] | FactoidWiki | 文本 | 命题 | 推理 | 单次 | | EAR [31] | 数据集 | 文本 | 句子 | 微调 | 单次 | | UPRISE [20] | 数据集 | 文本 | 句子 | 微调 | 单次 | | RAST [32] | 数据集 | 文本 | 句子 | 微调 | 单次 | | Self-Mem [17] | 数据集 | 文本 | 句子 | 微调 | 迭代 | | FLARE [24] | 搜索引擎, Wikipedia | 文本 | 句子 | 微调 | 自适应 | | … | … | … | … | … | … | | GenRead [13] | LLMs | 文本 | 文档 | 推理 | 迭代 | | UniMS-RAG [74] | 数据集 | 文本 | 多种 | 微调 | 单次 | | … | … | … | … | … | … | | RoG [83] | Freebase | 知识图谱 | 三元组 | 推理 | 迭代 | | G-Retriever [84] | 数据集 | 文本图 | 子图 | 推理 | 单次 | (注:表格内容为原文TABLE I的部分示例)

检索

高效地从数据源中检索相关文档是RAG的关键。

检索源

数据结构

检索粒度

检索单元的粒度影响着信息的全面性和噪声水平。粒度从细到粗包括Token、短语、句子、命题(Proposition,文本中的原子事实表达)、文本块(Chunks)、文档等。选择合适的粒度对检索效果至关重要。

索引优化

索引构建的质量决定了检索阶段能否获取正确的上下文。

查询优化

用户原始查询往往不够精确,直接用于检索效果不佳。

Embedding

Embedding模型将文本转换为向量,其语义表征能力是RAG检索性能的关键。

生成

检索完成后,需要对检索到的内容和生成模型本身进行调整。

上下文管理

直接将所有检索信息输入LLM并非最佳实践,因为冗余信息会干扰生成,过长的上下文还会导致“中间遗忘”(Lost in the middle)问题。