一、背景
最近一年,LLM 展示了强大的能力,但是面对幻觉、最新的知识以及复杂任务时往往略显不足。RAG(Retrieval Augmented Generation,检索增强生成)通过集成外部知识库来解决类似问题,取得了很不错的效果。
这里,我们参考 [2312.10997] Retrieval-Augmented Generation for Large Language Models: A Survey 整理 RAG 相关的方案、优化手段、评估指标等内容,以便对 RAG 有更全面的了解。此外,我们也介绍了最常用的一些向量数据库和 RAG 框架。
二、摘要
是什么:RAG 是一种通过检索外部知识库来获得额外语料,并使用 ICL(In-Context-Learning,上下文学习)来改进 LLM 生成效果的范式。
为什么:LLM 受训练语料的限制,无法感知最新的内容,比如 LLM 训练后的新闻;此外,LLM 也容易产生幻觉,生成不正确的内容。
如何做:当用户发起一个生成请求时,首先基于用户的 prompt 来检索相关信息,然后这些信息会被组合到 prompt 中,为生成过程提供额外的上下文,最后将组合后的 prompt 输入 LLM 生成结果。
怎么样:RAG 的主要优势在于可以避免针对特定任务再次进行训练;用户可以额外附加外部知识库,丰富输入,从而优化模型的输出效果。RAG 因其高可用性和低门槛而成为 LLM 系统中最受欢迎的方案之一,许多 LLM 应用都会基于 RAG 构建。
三、RAG 框架
3.1. Naive RAG
3.1.1. Naive RAG 方案
Naive RAG 是最简单、最原始的 RAG 方案,也被称为 "Retrieve-Read" 框架,其包含几个关键阶段:
Indexing(离线处理):
- 从各种格式(PDF、HTML、Markdown、Word 等)的额外语料库中提取纯文本内容。
- 由于 LLM 上下文窗口的限制,比如常见的 2K、4K,需要将提取的文本内容切分为不同的 chunks。
- 使用文本 embedding 模型,针对每个 chunk 提取相应的文本 embedding。
- 将文本 embedding 和对应的 chunk 存储为索引,能一一对应。
Retrieval(在线处理):
- 使用文本 embedding 模型,针对用户 query 提取 query embedding。
- 使用 query embedding 与索引中的 chunk embedding 进行比对,找到最相似的 k 个 embedding。
- 提取 k 个最相似 embedding 对应的 chunk。
Generation(在线处理):
- 将 query 与检索到的 chunks 进行合并。
- 将合并后的 query 输入 LLM 用于生成,并返回生成结果。
![图:Naive RAG 流程示意图]
3.1.2. Naive RAG 不足
在 Naive RAG 中也有一些不足,会带来比较大的挑战:
- 检索质量:低精度的检索系统可能引导 LLM 产生幻觉,生成错误的输出;低召回的检索系统可能导致遗漏部分信息,导致 LLM 生成不准确或不全面的结果。
- 指令遵循:LLM 可能不基于 prompt 中检索到的上下文来生成答案,或者使用了不相关的上下文,从而导致生成结果出现偏差。
- 增强过程:可能无法将检索到的内容很好的与 query 相结合,或者检索到的内容中包含冗余和重复,导致生成结果中出现重复内容。
- 内容相关性:需要平衡检索到的多个内容的价值,辨别其对生成任务的重要性,此外也需尽可能保持风格一致。
- 过度依赖:LLM 可能会过度依赖检索到的内容,而忽略本身已经学习到的知识。
3.2. Advanced RAG
3.2.1. Advanced RAG 方案
Advanced RAG 相比 Naive RAG 进一步增加了 Pre-Retrieval 和 Post-Retrieval 模块。


