检索增强生成

检索增强生成（Retrieval-augmented generation，缩写：RAG）是一种使大语言模型（LLM）能够从外部数据源中检索并整合新信息的技术。在RAG框架下，大语言模型首先查阅指定的文档集合，再对用户查询作出回应。这些文档补充了模型预训练数据中已有的信息，使模型能够利用训练数据中未包含的领域特定信息和/或最新信息。例如，该技术可帮助基于大语言模型的聊天机器人访问企业内部数据，或依据权威来源生成回答。

RAG通过在生成回答前引入信息检索环节来提升大语言模型的性能。与仅依赖静态训练数据的模型不同，RAG能够从数据库、上传文档或网络资源中提取相关文本。据《Ars Technica》报道：“RAG本质上是将大语言模型的处理流程与网页搜索或其他文档查询过程相结合，从而帮助模型更准确地遵循事实，以此提升其表现。”该方法有助于减少人工智能幻觉——此类问题曾导致聊天机器人描述并不存在的政策，或向寻求判例支持的律师推荐虚构的法律案例。

RAG还降低了为纳入新数据而重新训练大语言模型的需求，从而节省计算资源与资金成本。除提升效率外，RAG还使模型能在回答中附带信息来源，便于用户核查引用内容。这种机制增强了透明度，用户可通过比对检索到的原始内容来验证回答的准确性与相关性。

RAG这一术语最早出现于2020年发表的一篇研究论文。

## RAG与LLM的局限性

大语言模型可能提供错误信息。例如，谷歌首次演示其大语言模型工具 Google Bard（后更名为Gemini）时，该模型就詹姆斯·韦布空间望远镜提供了错误信息。这一失误导致该公司的市值蒸发约1000亿美元。RAG可用于预防此类错误，但并不能解决所有问题。例如，即使检索来源本身事实准确，若大语言模型误解了上下文，仍可能生成错误信息。《麻省理工科技评论》举了一个例子：某AI生成的回答称“美国曾有一位穆斯林总统，即巴拉克·侯赛因·奥巴马”。该模型检索自一本学术著作，其修辞性书名为Barack Hussein Obama: America's First Muslim President?，但大语言模型未能理解书名中的疑问语气，从而生成了错误陈述。

采用RAG的大语言模型被设计为优先使用新检索到的信息。这种技术被称为“提示词填充”（prompt stuffing）。在没有提示词填充的情况下，大语言模型的输入仅由用户生成；而采用提示词填充时，系统会在此输入中额外添加相关上下文以引导模型生成回答。该方法在提示词开头即提供关键信息，促使模型优先采用所供给的数据，而非依赖预训练知识。

## 流程

RAG通过引入信息检索机制来增强大语言模型的能力，使模型能够访问并利用原始训练集之外的额外数据。Ars Technica指出：“当新信息出现时，无需重新训练模型，只需用更新后的信息扩充模型的外部知识库即可”（即“增强”）。IBM表示：“在生成阶段，大语言模型会结合增强后的提示词及其对训练数据的内部表征来综合生成回答”。

### 关键阶段

<image>

通常，待引用的数据会被转换为大语言模型的嵌入向量（embeddings），即以高维向量空间形式表示的数值化表征。RAG可应用于非结构化（通常为文本）、半结构化或结构化数据（例如知识图谱）。这些嵌入向量随后被存储在向量数据库中，以支持高效的文档检索。

当用户提出查询时，系统首先调用文档检索器，选取与查询最相关的文档用于增强原始输入。此类相关性比对可采用多种方法实现，具体取决于所使用的索引类型。

模型通过提示工程对用户原始查询进行增强，将检索到的相关信息一并输入大语言模型。较新的实现方案还可集成专用的增强模块，具备将查询扩展至多个领域、利用记忆机制及自我改进能力从历史检索中持续学习等功能。

最终，大语言模型综合查询内容与检索到的文档生成输出结果。部分模型还引入额外优化步骤以提升输出质量，例如对检索结果进行重排序（re-ranking）、上下文筛选以及微调（finetuning）。

## 改进

上述基础流程可在RAG工作流的不同阶段进行优化。

### 编码器

这些方法聚焦于将文本编码为稠密向量或稀疏向量。稀疏向量用于编码词语身份，通常具有词典长度，且大部分元素为零。稠密向量则用于编码语义，结构更为紧凑且零值较少。多种增强技术可改进向量存储（数据库）中相似度的计算方式。

- 通过优化向量相似度计算可提升性能。点积可增强相似度评分，而近似最近邻搜索（ANN）相比K近邻算法（KNN）能提高检索效率。
- 晚交互（Late Interactions）技术可在检索后更精确地进行词语比对，有助于优化文档排序并提升搜索相关性，从而提高准确性。
- 混合向量方法可将稠密向量表示与稀疏独热编码向量相结合，利用稀疏点积在计算效率上优于稠密向量运算的优势。
- 其他检索技术通过优化文档选择方式来提升准确性。部分方法将SPLADE等稀疏表示与查询扩展策略相结合，以提高搜索准确率与召回率。

### 以检索器为中心的方法

这些方法旨在提升向量数据库中文档检索的质量：

- 通过“逆完形填空任务”（ICT）对检索器进行预训练，该技术通过预测文档中被遮蔽的文本来帮助模型学习检索模式。
- 有监督的检索器优化使检索概率与生成模型的似然分布对齐。具体做法是：针对给定提示检索前k个向量，评估生成回答的困惑度，并通过最小化检索器选择结果与模型似然分布之间的KL散度来优化检索效果。
- 重排序技术可在训练过程中优先选择最相关的检索文档，从而优化检索器性能。

### 语言模型

RAG专用的Retro语言模型。每个Retro模块由注意力层、分块交叉注意力层和前馈网络层组成。黑色文字框表示正在被处理的数据，蓝色文字表示执行处理的算法。

通过针对检索器重新设计语言模型，一个规模缩小25倍的网络即可获得与更大模型相当的困惑度表现。由于该方法（Retro）需从头开始训练，因此产生了原始RAG方案所避免的高昂训练成本。其假设是：在训练过程中注入领域知识后，Retro无需过多关注领域细节，可将有限的参数资源专注于语言语义建模。重新设计的语言模型结构如图所示。

有报告指出Retro难以复现，因此研究者对其进行了改进以提升可复现性。改进后的版本称为Retro++，并集成了上下文内RAG能力。

### 分块策略

分块涉及将数据切分为向量的各种策略，以便检索器能够从中定位细节信息。

不同数据格式具有特定模式，合理的分块策略可充分利用这些模式。

三种主要分块策略包括：

- 固定长度重叠分块：实现简单高效。相邻分块间的重叠有助于维持跨块的语义连贯性。
- 基于语法的分块：可将文档按句子边界切分。spaCy或NLTK等库可辅助实现。
- 基于文件格式的分块：特定文件类型具有天然分块结构，应予以尊重。例如，代码文件宜以完整函数或类为单位进行分块与向量化；HTML文件应保持`<table>标签或base64编码的<img>`元素完整；PDF文件也需考虑类似因素。Unstructured或LangChain等库可协助实现此类分块。

### 混合搜索

有时仅依靠向量数据库搜索可能遗漏回答用户问题所需的关键事实。一种缓解策略是：先执行传统文本搜索，将结果与向量搜索返回的文本块合并，再将融合后的混合文本输入语言模型进行生成。

### 评估与基准测试

RAG系统通常使用专门设计的基准测试进行评估，以检验可检索性、检索准确率与生成质量。常用数据集包括BEIR（涵盖多领域信息检索任务的测试套件）以及Natural Questions或Google QA（用于开放域问答评估）。

## 挑战

RAG并不能完全防止大语言模型产生幻觉。据Ars Technica报道：“这（RAG）并非直接解决方案，因为大语言模型在回应中仍可能围绕检索到的源材料产生幻觉。”

尽管RAG提升了大语言模型（LLM）的准确性，但它并未消除所有挑战。其局限性之一在于：虽然RAG减少了频繁重新训练模型的需求，但并未完全消除这一需求。此外，大语言模型可能难以识别自身是否缺乏足够信息来提供可靠回答。若未经专门训练，模型即便在应当表明不确定性的情况下仍可能生成答案。据IBM指出，当模型缺乏评估自身知识局限性的能力时，此类问题便可能出现。

### RAG投毒

RAG系统可能检索到事实正确但具有误导性的来源，从而导致解读错误。在某些情况下，大语言模型可能从来源中提取语句而未考虑其上下文，进而得出错误结论。此外，当面对相互矛盾的信息时，RAG模型可能难以判断哪个来源更为准确。此类局限性的最坏结果是，模型可能融合多个来源的细节，生成将过时信息与更新信息以误导性方式混合的回答。据《麻省理工科技评论》指出，这些问题的产生源于RAG系统可能对其检索到的数据产生误读。