- 什么是 RAG?
- 为什么使用 RAG?
- LLM 微调 和 RAG?
- 实战
什么是 RAG?
RAG 在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中被引入,原论文是这样描述的:
探索了一种 通用的 检索增强生成(RAG)微调方案 —— 这种模型结合了 预训练的参数化记忆 和 非参数化记忆,用于语言生成。提出的 RAG 模型中,参数化记忆是一个预训练的 seq2seq 模型,而 非参数化记忆是一个由预训练神经检索器访问的维基百科稠密向量索引。
以提示“地球上的第一种哺乳动物是什么时候出现的?”为例,RAG 可能会提取关于“哺乳动物”、“地球历史”和“哺乳动物进化”的文档。这些支持性文档随后被连接为上下文,与原始输入一起输入到 seq2seq 模型中,该模型生成实际输出。
因此,RAG 拥有两种知识来源:seq2seq 模型在其参数中存储的知识(参数化记忆)以及 RAG 从文档库中检索到的段落所存储的知识(非参数化记忆)。
图 1:概览。将一个预训练的检索器(查询编码器 + 文档索引)与一个 预训练的 seq2seq 模型(生成器)相结合,并进行端到端微调。对于查询 xxx,我们使用 最大内积搜索(MIPS)找到前 KKK 篇文档 ziz_izi。在得到最终预测 yyy 时,将 zzz 视为潜在变量,并对不同文档下的 seq2seq 预测结果进行边际化处理。
每个步骤可以大致分解为:
- 检索:根据查询从源中寻找相关信息。例如,根据问题从数据库中获取相关的维基百科文本段落。
- 构建/索引文档库(预处理):把外部知识源(比如维基百科)拆分成文档/段落,编码成向量 并 建立检索索引(如向量索引,支持 MIPS/ANN 查询)。
- 查询编码与检索:把输入查询 xxx 用检索器的查询编码器编码,进行向量检索,返回前 KKK 个最相关的文档 z1,...,zKz_1,...,z_Kz1,...,zK。
- 增强:使用相关检索到的信息来修改输入到生成模型(例如 LLM)中的内容。将检索到的文档与生成器结合,即把检索到的文档作为 条件信息 喂入 预训练的 seq2seq 生成器。这里有两种常见形式:
- RAG-Sequence(或 RAG-固定):对整个输出序列都使用同一组检索段落作为上下文。
- RAG-Token(或 RAG-逐 token):生成每个 token 时可使用不同的检索段落(更细粒度)。
- 生成:根据输入生成输出。例如,在 LLM 的情况下,根据输入提示生成一段文本。
- 生成与边际化(推理):将文档 zzz 视为潜在变量,计算最终输出的概率为对不同检索文档的边际化 p(y∣x)=∑zp(z∣x)p(y∣x,z)\;p(y|x)=\sum_z p(z|x)\,p(y|x,z)p(y∣x)=∑zp(z∣x)p(y∣x,z)。实现上可以对每个 ziz_izi 生成 p(y∣x,zi)p(y|x,z_i)p(y∣x,zi) 再加权求和,得到最终预测。
- 端到端微调(训练):将检索器(查询编码器)和生成器一起端到端微调,使得检索更契合生成任务、生成更能利用检索到的证据。训练时通常会最大化边际似然或相应损失。
- (可选)输出后处理与可追溯性:返回生成文本同时附加证据来源(即用到的检索片段),便于验证与更新知识库。
为什么使用 RAG?
Retrieval Augmented Generation: Streamlining the creation of intelligent natural language processing models
LLM(大型语言模型)的参数,本质上代表了人类使用词语构造句子的一般模式。参数化的知识让 LLM 在回答通用问题时非常有用,但对于想深入探索某类特定信息的用户来说,这种方式并不够。
RAG(检索增强生成)可以将生成式 AI 服务与外部资源连接起来,尤其是那些包含最新技术细节的资源。它被称为一种“通用微调方案”,因为几乎任何 LLM 都可以用它来连接几乎任何外部资源。
- 使用自定义数据。许多 基础 LLMs 使用互联网规模文本数据进行训练。这意味着它们具有强大的语言建模能力,然而,它们 通常缺乏特定领域的知识。RAG 系统可以向 LLMs 提供 特定领域的数据,如医疗信息或公司文档,从而 根据特定用例定制它们的输出。
- RAG 会为模型 提供可引用的来源,就像科研论文中的脚注一样,让用户能够核查模型的说法。
- 防止幻觉。LLMs 非常出色,但它们容易产生潜在的幻觉,也就是说,生成看似正确但实际上不正确的内容。RAG 管道可以通过提供事实性(检索到的)输入来帮助 LLMs 生成更符合事实的输出。即使从 RAG 管道生成的答案看起来不正确,由于检索功能,也可以获取其来源的资料。
- RAG 的真正优势在于其灵活性。改变预训练语言模型所知的内容需要用新文档重新训练整个模型。而使用 RAG,只需更换其用于知识检索的文档,就能控制它所知的内容。通过用旧版维基百科数据集替换原始数据集,并询问诸如“冰岛的总理是谁?”等问题来测试这一行为。结果显示,RAG 利用替换进来的语料库中的知识调整了其答案,尽管参数化知识保持不变。这种适应方法在事实随时间变化的情况下非常有价值。
RAG 也可以是一个比在特定数据上微调 LLM 更快的解决方案。
LLM 微调 和 RAG?
LLM 微调(Fine-tuning):在下游数据上更新模型参数,使模型直接 在内部参数中编码任务或领域知识。包括全量微调,也包括参数高效微调(如 LoRA、Prompt-Tuning、Adapters 等,统称 PEFT)。LoRA 是典型方法之一,能显著减少可训练参数并节省显存。
RAG(Retrieval-Augmented Generation):把 外部非参数化知识库(文档/段落向量索引)与生成模型结合,在 推理时检索相关文档并以此条件化生成,生成端对不同检索结果做边际化或融合以产出答案;检索库可以独立更新,从而实现 更新知识而不重训模型。RAG 在知识密集型任务上被提出并验证效果优于仅参数化模型。
维度 | LLM 微调(全量/PEFT) | RAG(检索增强生成) |
---|---|---|
知识存储位置 | 模型参数(内隐) | 外部索引(显式)+ 模型(局部决策) |
更新知识 | 需重训或增量微调 | 更新索引即可(无需重训模型) |
推理延迟 | 较低(单次前向) | 增加检索与文档处理延迟(检索/编码/聚合)。 |
计算/成本(训练) | 全量微调高;PEFT 低(显存 & 存储节省) | 检索器训练 + 生成器微调(可仅微调生成器或与检索器联合微调),索引构建有成本 |
可解释性 / 溯源 | 较差(内部权重难溯源) | 好:可返回支持文档作证据。 |
抗幻觉 / 事实准确性 | 依赖模型及数据;难以快速修正错误 | 更易 grounding,若检索到高质量文档,生成更事实性 |
小样本/数据效率 | PEFT 在少数据下表现好 | 依赖检索质量;在少标注下可借外部知识补充 |
工程复杂度 | 相对简单(若仅单模型部署) | 复杂:需索引/检索服务、向量数据库、检索器与生成器协同 |
最佳适用场景 | 任务固定、知识静态、可承受模型更新成本 | 知识频繁更新、需要来源/可解释性、知识密集型 QA 与事实生成 |
实战
本地 RAG 教程
使用 smolagents、LlamaIndex、LangGraph 来构建 RAG 工具的完整例子,见 HF Agent Course