第一章:RAG 是什么,解决什么问题
1.1 从一个具体的失败说起
你把公司内部的报销制度问题丢给一个通用大模型,它会给出一段听起来专业、格式工整、逻辑通顺的回答——但里面的额度标准、审批层级、报销时限可能全是错的。
问题不在措辞,而在于模型根本不知道你们公司的制度。它的训练目标是「生成看起来合理的下一个词」,不是「在证据缺失时自动停下来」。
这就是 RAG 要解决的问题的起点。
1.2 根因:知识被冻结在参数里
大模型的知识来自训练。训练完成后,所有知识都以权重的形式固化在模型参数里,既不会自动更新,也无法被查看或修改。
这一个根因,会同时表现为三个不同的症状。
flowchart TB
ROOT[根因: 知识被冻结在模型参数里] --> P1[症状一: 知识过期]
ROOT --> P2[症状二: 私有知识空白]
ROOT --> P3[症状三: 幻觉]
P1 --> D1[训练数据有截止日期]
P2 --> D2[企业内部数据从未进入训练集]
P3 --> D3[缺少依据时仍然生成流畅答案]
1.2.1 知识过期
训练数据有截止日期。截止日之后发生的事情,模型一概不知——新发布的产品、变更的政策、上个月的财报。
而且模型往往不知道自己不知道,它会用过时的信息自信作答。
1.2.2 私有知识空白
这是企业场景中更重要的一类。公司的内部文档、客户数据、业务规则、代码库,从来没有进入过任何公开模型的训练集。
这类知识的特点是:量大、更新频繁、且不可能通过公开训练获得。
1.2.3 幻觉
幻觉不是知识冻结和私有知识缺失的唯一副产品,而是证据、检索、上下文处理和生成等环节都可能造成的多因素失效。
模型在缺少依据时可能生成看似合理的答案;即使检索到材料,也可能误读、过度概括或错误引用。知识缺失是常见原因,不是唯一根因。
因此,RAG 的价值是提供可更新、可访问的外部证据并降低一部分不实输出风险,不能消除幻觉;还需要数据治理、grounding、引用校验和拒答策略(详见第十七章)。
1.3 RAG 怎么工作
RAG(Retrieval-Augmented Generation,检索增强生成)的做法是:
把知识从模型参数里搬到外部知识库,在回答问题时实时检索出相关内容,作为依据注入 Prompt,让模型基于给定材料作答。
关键在于不改动模型本身。模型的角色从「知识的存储者」转变为「材料的阅读与组织者」。
flowchart LR
Q[用户问题] --> R[检索相关材料]
KB[(外部知识库)] --> R
R --> P[材料 + 问题 拼成 Prompt]
P --> LLM[大模型]
LLM --> A[基于材料的回答 + 引用]
这个转变带来三个直接收益:
| 收益 | 原因 |
|---|---|
| 知识可热更新 | 改知识库即可生效,不需要重新训练 |
| 答案可溯源 | 每条结论都能指回具体的原文片段 |
| 可做权限控制 | 检索阶段可以按用户权限过滤材料 |
第三点经常被忽略,但在企业场景里往往是决定性的。 微调后的模型无法区分「谁能看到哪些知识」,而 RAG 可以在检索时按 ACL 过滤——这是很多企业最终必须选 RAG 的硬性原因(详见第十九章)。
1.4 完整工作流:离线与在线两个阶段
完整工作流分为离线和在线两个阶段。两者的区别在于执行频率:离线阶段在文档变化时执行,在线阶段每次用户提问都要执行。
flowchart TB
subgraph OFF[离线阶段 文档变化时执行]
D[原始文档] --> PARSE[解析与清洗]
PARSE --> CHUNK[切分 Chunking]
CHUNK --> EMB[向量化 Embedding]
EMB --> IDX[(写入索引)]
end
subgraph ON[在线阶段 每次提问执行]
Q[用户 Query] --> RW[Query 改写]
RW --> QEMB[Query 向量化]
QEMB --> SEARCH[多路召回 粗排]
IDX --> SEARCH
SEARCH --> RERANK[Rerank 精排]
RERANK --> PROMPT[Prompt 拼装]
PROMPT --> GEN[生成 + 溯源]
end
1.4.1 离线阶段
| 步骤 | 做什么 | 主要难点 | 详见 |
|---|---|---|---|
| 解析与清洗 | 把 PDF、Word、网页等转成结构化文本 | 表格、扫描件、复杂版面 | 第三章 |
| 切分 | 把长文档切成适合检索的片段 | 粒度选择、语义被切断 | 第四、五章 |
| 向量化 | 用 Embedding 模型把片段转成向量 | 模型选型与评估 | 第六、七章 |
| 写入索引 | 存入向量库与关键词索引 | 索引类型、量化、更新 | 第八、九章 |
1.4.2 在线阶段
| 步骤 | 做什么 | 主要难点 | 详见 |
|---|---|---|---|
| Query 改写 | 把口语化问题转成适合检索的形式 | 改写可能引入偏差 | 第十二章 |
| Query 向量化 | 用同一个模型把问题转成向量 | 必须与建库模型一致 | 第十章 |
| 多路召回 | 向量 + 关键词并行检索,融合结果 | 融合策略 | 第十一、十三章 |
| Rerank | 用更强的模型对候选精排 | 延迟与成本 | 第十三章 |
| Prompt 拼装 | 组织材料,约束模型只依据材料作答 | 顺序、预算、约束强度 | 第十七章 |
| 生成与溯源 | 生成答案并标注引用来源 | 引用是否真实支撑结论 | 第十七章 |
这里有一个工程约束:在线阶段的 Query 向量化,必须使用与离线建库完全相同的 Embedding 模型和版本。不同模型产生的向量位于不同的语义空间,互相计算距离没有任何意义。这也意味着换 Embedding 模型必须全量重建索引。
1.5 粗排与精排为什么要分开
Rerank 更准,但不能直接承担全库检索,因为两者的计算复杂度差了几个数量级。
- 粗排(向量检索):文档向量在离线阶段已经算好并建了索引,在线只需算一次 Query 向量,再做近似最近邻搜索。百万级库中取 Top-100 只需毫秒级。
- 精排(Rerank):需要把 Query 和每个候选拼在一起送进模型算一次相关性分数。对 100 个候选就是 100 次前向传播。
如果用 Rerank 直接扫全库,百万文档就是百万次模型调用,完全不可行。
flowchart LR
ALL[(百万级文档)] -->|粗排 毫秒级| C[Top-100 候选]
C -->|精排 百毫秒级| F[Top-5 结果]
这是典型的漏斗式设计:用便宜的方法快速缩小范围,用昂贵的方法精确排序。 搜索、推荐系统都是这个结构,RAG 只是沿用了它。
1.6 RAG 不是什么
下面几条常被混淆:
| 误解 | 实际情况 |
|---|---|
| RAG 就是「检索 + 生成」 | 这是定义不是理解;关键在于每个环节解决什么问题 |
| RAG 能消除幻觉 | 只能降低。检索失败时模型仍会编,检索正确时也可能过度发挥 |
| RAG 让模型变聪明了 | 模型能力没变,只是获得了它原本没有的材料 |
| 有了长上下文就不需要 RAG | 规模、时效、权限、成本四个约束都还在(第二章展开) |
| 检索做好了就万事大吉 | 生成层同样会出问题,需要独立的约束与校验 |
1.7 RAG 的能力边界
RAG 擅长的是「材料里写了,但模型不知道」这类问题。它不擅长:
- 需要全局统计的问题:「这一万份合同里平均违约金是多少」——这是聚合计算,不是片段检索;
- 需要多跳关系推理的问题:「A 公司的供应商的竞争对手有哪些」——单轮向量召回不显式遍历关系,常需查询分解、多轮检索或图结构(第十六章);
- 材料本身就没有答案的问题:检索不到就应该拒答,而不是让模型硬答;
- 需要改变模型行为风格的需求:这是微调的领域(第二章展开)。
后续章节里的各种高级范式,大多是在补这几类短板。
1.8 本章总结
- 知识冻结在模型参数里,会表现为知识过期、私有知识空白,并进一步放大幻觉风险;
- RAG 把知识外置到知识库,回答时实时检索并注入 Prompt,不改动模型本身;
- 这样做带来三类直接收益:知识可热更新、答案可溯源、检索阶段可做权限控制;
- 工作流分为离线和在线两段:前者负责解析、切分、向量化和入库,后者负责改写、召回、精排、拼装与生成;
- 在线与离线必须使用同一个 Embedding 模型;换模型就要全量重建索引;
- 粗排和精排分离是典型的漏斗式设计:先用便宜方法缩范围,再用昂贵方法定顺序;
- RAG 能降低但不能消除幻觉,也不擅长全局聚合和多跳推理。