模块二 · 上下文工程
RAG 全链路:解析、切分、召回、拼装
RAG 不是"接个向量库",而是四个环节各有一半的失败率。这一节按链路拆开讲,并给出一条能跑起来的最小实现路径。
读完这一节,你能做到
- 说清 RAG 四个环节各自负责什么、最容易坏在哪。
- 判断一次"答错"到底出在解析、切分、召回还是拼装。
- 用结构优先的策略切分文档,而不是按字数硬切。
- 在拼装环节把引用、边界与"没有答案"的表达做对。
一、RAG 到底在解决什么
模型的知识固化在参数里,有两个逃不掉的问题:截止时间和不可核对。
RAG 的思路是:把知识放在外部,检索出相关片段,再让模型基于片段回答。它换来三件事:
- 知识可更新(改文档即生效,不用重训)。
- 答案可核对(能给出处)。
- 权限可控(检索时按用户过滤)。
代价是:多了一条链路,而链路上每个环节都会引入新的失败方式。
二、四个环节与各自的失败
| 环节 | 做什么 | 典型失败 |
|---|---|---|
| 解析 | 把 PDF/网页/表格转成文本 | 表格被拍平、页眉页脚混入、图片字丢失 |
| 切分 | 把长文切成可检索的块 | 一句话被截断、标题与内容分离 |
| 召回 | 找出最相关的几块 | 该拿的没拿到、拿到一堆相似的噪声 |
| 拼装 | 组织成模型能用的上下文 | 片段太多被稀释、没要求引用、顺序混乱 |
一个反直觉的事实:多数"答得不对",问题都不在模型。先把召回的原文打出来看,答案在不在里面——这一步能省掉大量无效调参。
三、解析:别让上游毁掉下游
优先做的三件事
- 保留结构:标题、列表、表格要保留层级信息,别全部拍成纯文本。
- 去掉噪声:页眉页脚、页码、导航栏、版权声明,统一剥离。
- 表格单独处理:表格要么整块保留,要么转成"字段-值"的结构化文本,不要按字数切。
图片与扫描件
如果需要处理的资料里有大量扫描件,先确认有没有可用的文本层;没有的话,OCR 质量会直接决定整个系统的上限。
四、切分:按结构,不按字数
判断标准只有一个:单独拿出这个块,能不能表达一个完整意思?
优先级
- 按标题层级切(一级/二级/三级)。
- 按段落切;段落过长再按句子边界切。
- 表格、代码块整块保留。
- 最后才用长度兜底,并保留 10%-20% 重叠。
每个块要带的元数据
- 来源(文档 id、标题路径)
- 更新时间
- 权限标签(哪些用户能看)
- 块序号(用于回取上下文)
没有这些,"引用"和"回取整节"都做不了。
五、召回:先混合,再重排
单靠向量有两个硬伤:精确词抓不住(型号、编号、错误码)、同类文档互相挤占(top-k 全是同一个调子)。
做法
- 两路召回:向量 + 关键词(BM25 一类),各取 20-50 条。
- 合并去重:两路结果按名次融合,而不是简单拼接。
- 重排:用重排模型对候选逐条打分,取前 3-5 条。
- 元数据过滤:先按权限、时间、类型过滤,再检索。
这四步里,重排的性价比最高——通常比换更大的向量模型更有效。
六、拼装:模型看到什么,决定它怎么答
四条规则
- 片段要带标识:
[1] 来源:某某政策 2026-03。不带来源,模型就没法引用。 - 指令要明确:
只根据下列资料回答;资料里没有就说没有,不要推测。 - 顺序有意义:最相关的放最前,关键约束放首尾(中间容易被忽略)。
- 数量要克制:3-5 条足够。给十条,噪声会压过答案。
"没有答案"要单列
这不是一句提示词就够,要在工程上兜住:检索结果为空、或最高分低于阈值时,直接返回兜底话术,不要交给模型自由发挥。
七、最小可用实现路径
按这个顺序做,每一步都能独立验证:
① 选 20 份真实文档,跑通解析,人工检查文本质量
② 按标题切分,人工检查前 50 个块是否语义完整
③ 只做向量召回,取 top-5,人工看命中率
④ 加关键词召回与重排,再对比命中率
⑤ 拼装时加引用与"没有答案"兜底
⑥ 建 50 条评估集,之后每次改动都跑
不要跳的步骤:第 ① 和第 ②。上游脏,下游怎么调都是白费。
八、常见坑
- 一上来就调向量参数。 先确认解析与切分是干净的。
- 按固定字数切分。 语义被切断,后面怎么检索都补不回来。
- 只做向量召回。 精确查询场景会大面积失效。
- top-k 给到 10 条以上。 噪声挤占上下文,成本还翻倍。
- 拼装时不给来源。 模型只能凭记忆答,等于没用上 RAG。
- 没有"没有答案"的兜底。 检索为空时模型一定会编。
九、动手任务:自写 → AI 写 → 对比 → 取舍
四步不跳:① 自己写(限时,关掉补全)→ ② 让 AI 写同一题 → ③ 逐条比对 → ④ 说出保留谁的写法。
① 自己写
- 拿一份真实文档(带表格最好),手工切出 5 个块,说明每个块的边界为什么这么定。
- 写一段拼装模板:片段怎么标注、指令怎么写、检索为空时怎么答。
② 让 AI 写同一题
把第 1 题交给 AI,补一句 按“标题层级 → 段落 → 表格处理”说明切分理由,并指出哪些位置容易被切断。
③ 对比要盯的点
- 它的切分是不是按字数均分?
- 有没有处理表格与代码块?
- 它有没有说明"块要带哪些元数据"?
④ 一句话取舍
它切出来的块,单独拿出来能看懂吗?不能的话,你会怎么改?
十、自测
- RAG 换来哪三件事?代价是什么?
- 四个环节各自的典型失败是什么?
- 判断切分是否合理的标准是什么?
- 为什么说重排的性价比最高?
- 拼装环节的四条规则是什么?
- 检索为空时,为什么必须工程兜底而不是只写提示词?
参考答案要点:可更新、可核对、权限可控,代价是多一条链路;解析/切分/召回/拼装各有失败模式;单独拿出能否表达完整意思;比换向量模型更有效;带标识、明确指令、顺序、数量克制;模型在空上下文下一定会编。
配套题目
★ 越多越该先背;点题目可看完整答案与深入版。
- ★★★★★ RAG 全链路里哪一步最容易出问题?
- ★★★★☆ 文档切分的 chunk 大小和重叠怎么定?
- ★★★★☆ 表格、代码、扫描件这类资料怎么进 RAG?
- ★★★★★ 向量检索为什么经常“召回到了但不相关”?
提示:读完可以顺手做几道对应题目,检验是否真的理解