P1-13.3 通向 RAG(retrieval-augmented generation)的流程¶
Section ID:
P1-13.3Version:v2026.07.20
在 P1-13.1 中,我们看了把文本(text)表示成向量(vector)的嵌入(embedding)。在 P1-13.2 中,我们看了如何通过相似度搜索(similarity search)找到与问题向量(query vector)接近的文档向量(document vector)。
现在要进入下一个问题:怎样把检索到的文档候选接到 LLM 的回答里? RAG(retrieval-augmented generation) 就是回答这个问题的代表性结构。
RAG 是一种先检索(retrieval)外部资料,再把检索到的内容一起放进生成(generation)输入中以形成回答的结构。
这里最重要的提醒是:RAG 不是“保证正确答案的装置”。它只是为 LLM 增加可参考的上下文(context)。如果检索结果本身有误或不足,回答也会跟着变得不稳。
Part 1 会在这里建立 RAG(retrieval-augmented generation)、检索(retrieval)、增强(augmentation)、生成(generation)、parametric memory、non-parametric memory、来源追踪(provenance) 的基本区分。13.1 介绍了嵌入,13.2 介绍了相似度搜索,而这里要把这两步连接成 对 LLM 输入上下文的增强。实现细节与服务架构会在后续小节和第 14 章再展开。
这里从概念层面看 RAG 的整体流程。向量数据库(vector database)、索引(index)、近似最近邻(approximate nearest neighbor, ANN)、基于图(graph)的搜索结构会在 P1-13.4 处理。
RAG、检索、增强、生成、parametric memory、provenance 属于不同阶段与不同类型的“记忆资源”。先把它们的作用区分如下:
| 术语 | 极简含义 | 本节中的作用 |
|---|---|---|
| RAG | 把检索结果接到生成输入中的结构 | 第 13 章的连接阶段 |
| 检索 | 寻找相关文档候选的阶段 | 准备外部资料 |
| 增强 | 把检索到的文档加入输入上下文的阶段 | 组成 LLM 的参考资料 |
| 生成 | 依据增强后的输入形成回答的阶段 | 产出最终响应 |
| parametric memory | 存在于模型参数中的内部知识 | 理解模型单独作答时依赖的内部知识 |
| non-parametric memory | 像外部文档库一样可检索的资料 | RAG 额外接入的外部知识 |
| provenance | 追踪参考了哪些来源的信息 | 与依据审查相连的要素 |
这里先把 RAG 是检索与生成的连接、外部文档是模型之外的依据、来源追踪是额外的检查要素 作为基准线。
P1-14 会继续看 RAG 在实际 AI 服务架构、工具使用(tool use)、agent 结构里放在什么位置。P1-13.3 只专注于:搜索结果是如何被放入 LLM 输入的。
这里也不会把 RAG 介绍成 消除幻觉的装置。重点是明确:RAG 是 把依据候选接进输入 的结构,而验证责任依然存在。
| 主题 | 本节要看的问题 |
|---|---|
| 检索(retrieval) | 要取回哪些外部资料? |
| 增强(augmentation) | 取回的资料如何加入输入上下文? |
| 生成(generation) | LLM 会基于增强后的输入生成什么? |
| 局限(limit) | 为什么 RAG 不能自动保证事实核查? |
把检索结果连接到生成上下文的基准¶
- 把 RAG(retrieval-augmented generation)理解为结合检索与生成的结构。
- 说明检索结果会作为 LLM 输入上下文(context)的一部分进入生成过程。
- 直觉地区分模型内部知识(parametric memory)与外部检索资料(non-parametric memory)。
- 理解 RAG 可以帮助改善最新性(recency)、依据性(evidence)、来源追踪(provenance),但不能自动保证它们。
- 为进入 P1-14 的 AI 服务结构做准备。
三个基准¶
这里不会先讲 RAG 框架怎么使用,而是专注于理解为什么要把检索放在生成之前。阅读本节时,可以用下面三个基准来把握。
| 基准 | 为什么重要 | 本节所需的理解水平 |
|---|---|---|
| RAG 是连接检索与生成的结构 | 这能显示“模型独自回答”和“检索增强回答”的差异。 | 只要理解成它会先找文档,再依据文档来回答即可。 |
| 外部文档可以补充参数之外的最新依据 | 这能区分模型记忆与文档依据。 | 只要理解成模型可能不知道的新资料,可以从文档里取回来即可。 |
| 即使用了 RAG,结果仍需审查 | 这能防止误解成“接上搜索就自动准确”。 | 只要理解成系统可能检错文档、也可能解读错误,因此仍需验证即可。 |
RAG 是先检索再生成¶
把 RAG 简化到最基本时,可以理解为下面的流程:
用户问题
-> 生成问题嵌入
-> 在文档库中检索相关候选
-> 把检索到的文档片段加入提示词上下文
-> LLM 生成回答
例如,假设用户提问:
提示词为什么不能保证事实性?
搜索系统可以找出与这个问题接近的文档片段。
| 检索候选 | 作用 |
|---|---|
| P1-12.3 提示词的限制与评估 | 提供事实性、依据性与评估标准 |
| P1-10.3 生成结果的质量与风险 | 说明幻觉与缺少依据的风险 |
| P1-13.2 相似度搜索的直觉 | 提供“搜索结果只是候选”的视角 |
然后,系统可以把这些片段一起放进 LLM 输入。
问题:
提示词为什么不能保证事实性?参考资料:
- P1-12.3 的相关段落
- P1-10.3 的相关段落
- P1-13.2 的相关段落指示:
请依据参考资料作答。
LLM 会据此生成回答。此时,回答就不再只是依赖模型内部知识,而是参考了外部检索资料的生成结果。
检索是在接入外部记忆¶
RAG 论文提出的问题意识是:预训练模型会把知识压缩进参数(parameter)里,但这种知识并不容易被精确访问,也不容易快速更新。RAG 因此被描述为把外部的非参数记忆(non-parametric memory)接到模型上。
这里可以先这样理解:
| 区分 | 直觉 |
|---|---|
| 模型内部知识(parametric memory) | 模型在训练过程中压缩进参数里的知识 |
| 外部检索资料(non-parametric memory) | 文档库、数据库、搜索索引等可以后来增删修改的资料 |
模型内部知识使用很快,但它不会自动知道最新文档、特定组织资料、个人记录,或训练后新增的内容。
相对地,外部检索资料是可以修改的。添加或更新文档后,检索对象也会随之变化。因此,RAG 可以帮助处理下面这些问题:
| 问题 | RAG 可以帮助的地方 |
|---|---|
| 最新性(recency) | 可以把最新文档加入检索目标 |
| 依据性(evidence) | 可以提供回答时引用的参考段落 |
| 来源追踪(provenance) | 可以记录回答参考了哪些文档 |
| 领域知识(domain knowledge) | 可以接入特定组织、项目或书稿资料 |
但“可以帮助”不等于“能够保证”。如果检索到的资料有误、不贴题,或者 LLM 误读了资料,回答仍然会出错。
RAG 不会取代提示词¶
RAG 不是用来取消提示词(prompt)的结构。更准确地说,它是帮助系统提前准备好要放进提示词里的上下文(context)。
| 要素 | 作用 |
|---|---|
| 提示词(prompt) | 给 LLM 任务指示、格式与约束 |
| 检索(retrieval) | 找出外部资料候选 |
| 增强(augmentation) | 把检索资料加入输入上下文 |
| 生成(generation) | LLM 基于增强后的输入生成回答 |
如果只用提示词,往往需要人手动准备参考资料。使用 RAG 时,系统可以先自动找到相关资料,再把结果接进提示词上下文。
只用提示词:
人手动整理问题与参考资料。使用 RAG:
系统先检索与问题相关的资料,再把它们加入输入上下文。
因此,RAG 并不是 prompt engineering 的反面。更准确地说,RAG 是一种更系统地准备提示词上下文的方法。
RAG 的质量会在多个阶段出现波动¶
RAG 不是一个一次完成的魔法功能。它更像一条由多个阶段连接起来的管线(pipeline)。
文档准备
-> 切块(chunking)
-> 生成嵌入
-> 检索
-> 重排或过滤
-> 组装提示词
-> 生成回答
-> 标示来源与审查
每个阶段都可能出问题。
| 阶段 | 可能出现的问题 |
|---|---|
| 文档准备 | 旧文档、错误文档、重复文档可能混在一起 |
| 切块(chunking) | 必要上下文可能被拆散到多个片段 |
| 嵌入(embedding) | 问题与文档可能没有被放进合适的意义空间 |
| 检索(retrieval) | 无关候选可能排在前面 |
| 提示词组装 | 资料过多会让重点变模糊 |
| 生成(generation) | LLM 可能掺入资料外内容或总结失真 |
| 来源标示 | 显示出的来源可能与真正的回答依据不一致 |
因此,设计 RAG 系统时,更合理的看法不是“加上检索就安全了”,而是“检索、输入组装、生成与审查必须一起设计”。
RAG 不是事实核查装置¶
初次接触 RAG 时,最需要小心的误解是:
误解:
只要使用 RAG,LLM 的幻觉就会消失。更安全的说明:
RAG 会给 LLM 提供外部资料,
让它更有可能生成有依据的回答,
但不会自动消除检索错误与生成错误。
例如,下面这些情况都可能发生:
| 情况 | 结果 |
|---|---|
| 检索到了错误文档 | LLM 可能依据错误材料回答 |
| 没有检索到相关文档 | LLM 可能转而依赖常识或猜测 |
| 只检索到文档的一部分 | 回答可能缺少完整上下文 |
| 检索到彼此冲突的资料 | 仍需要判断哪份来源更可信 |
| 给出了来源标示 | 来源标示本身并不保证回答正确 |
这个视角也和学习型文档的写作原则相连。AI 生成的说明只是草稿,事实性主张仍需要依据审查。RAG 可以帮助找到依据候选,但最终判断仍然需要检验过程。
用一个小例子看 RAG 流程¶
假设我们把一组学习文档作为搜索目标。
问题:
嵌入是意义本身吗?
在检索阶段,下面这些片段可能成为候选:
| 候选 | 原因 |
|---|---|
| P1-13.1 嵌入不是意义本身 | 与问题直接对应 |
| P1-13.2 接近的向量并不总是好答案 | 与搜索局限相连 |
| P1-11.1 统计语言模型与嵌入 | 与历史背景相连 |
RAG 的输入大致可以被组装成这样:
问题:
嵌入是意义本身吗?参考资料:
[从 P1-13.1 检索出的段落]
[从 P1-13.2 检索出的段落]回答指示:
请依据参考资料,用入门者能理解的方式说明。
不要对资料中没有的内容做武断断言。
好的回答至少应该包含下面这些视角:
嵌入不是意义本身,而是学习得到的向量表示。
搜索结果只是相关候选,而不是答案判定。
如有需要,仍应回到来源段落再次核对。
这个例子能帮助说明:RAG 不是“替你把答案发现出来”的装置,而是“把回答所需的依据候选接进 LLM 输入”的装置。
检查清单¶
- 能把 RAG(retrieval-augmented generation)解释为结合检索与生成的结构。
- 能区分检索(retrieval)、增强(augmentation)、生成(generation)各自的作用。
- 能直觉地区分模型内部知识(parametric memory)与外部检索资料(non-parametric memory)。
- 能说明 RAG 不会取代提示词(prompt),而是在为上下文(context)做准备。
- 能说明 RAG 可以帮助改善最新性(recency)、依据性(evidence)、来源追踪(provenance)。
- 能说明 RAG 不会自动保证事实核查,也不会自动消除幻觉。
- 能说明 RAG 的质量会受文档准备、切块、检索、提示词组装与生成阶段影响。
- 能把 RAG 不解释成“消除幻觉功能”,而是拆成
检索、增强、生成、审查四个环节来说明。 - 能说明即使接上检索,审查责任仍然存在。