知

模块二 · 上下文工程

第 4 / 14 节19 分钟阅读型

RAG 全链路:解析、切分、召回、拼装

RAG 不是"接个向量库",而是四个环节各有一半的失败率。这一节按链路拆开讲,并给出一条能跑起来的最小实现路径。

读完这一节,你能做到

  1. 说清 RAG 四个环节各自负责什么、最容易坏在哪。
  2. 判断一次"答错"到底出在解析、切分、召回还是拼装。
  3. 用结构优先的策略切分文档,而不是按字数硬切。
  4. 在拼装环节把引用、边界与"没有答案"的表达做对。

一、RAG 到底在解决什么

模型的知识固化在参数里,有两个逃不掉的问题:截止时间和不可核对。

RAG 的思路是:把知识放在外部,检索出相关片段,再让模型基于片段回答。它换来三件事:

  • 知识可更新(改文档即生效,不用重训)。
  • 答案可核对(能给出处)。
  • 权限可控(检索时按用户过滤)。

代价是:多了一条链路,而链路上每个环节都会引入新的失败方式。

二、四个环节与各自的失败

环节做什么典型失败
解析把 PDF/网页/表格转成文本表格被拍平、页眉页脚混入、图片字丢失
切分把长文切成可检索的块一句话被截断、标题与内容分离
召回找出最相关的几块该拿的没拿到、拿到一堆相似的噪声
拼装组织成模型能用的上下文片段太多被稀释、没要求引用、顺序混乱

一个反直觉的事实:多数"答得不对",问题都不在模型。先把召回的原文打出来看,答案在不在里面——这一步能省掉大量无效调参。

三、解析:别让上游毁掉下游

优先做的三件事

  1. 保留结构:标题、列表、表格要保留层级信息,别全部拍成纯文本。
  2. 去掉噪声:页眉页脚、页码、导航栏、版权声明,统一剥离。
  3. 表格单独处理:表格要么整块保留,要么转成"字段-值"的结构化文本,不要按字数切。

图片与扫描件

如果需要处理的资料里有大量扫描件,先确认有没有可用的文本层;没有的话,OCR 质量会直接决定整个系统的上限。

四、切分:按结构,不按字数

判断标准只有一个:单独拿出这个块,能不能表达一个完整意思?

优先级

  1. 按标题层级切(一级/二级/三级)。
  2. 按段落切;段落过长再按句子边界切。
  3. 表格、代码块整块保留。
  4. 最后才用长度兜底,并保留 10%-20% 重叠。

每个块要带的元数据

  • 来源(文档 id、标题路径)
  • 更新时间
  • 权限标签(哪些用户能看)
  • 块序号(用于回取上下文)

没有这些,"引用"和"回取整节"都做不了。

五、召回:先混合,再重排

单靠向量有两个硬伤:精确词抓不住(型号、编号、错误码)、同类文档互相挤占(top-k 全是同一个调子)。

做法

  1. 两路召回:向量 + 关键词(BM25 一类),各取 20-50 条。
  2. 合并去重:两路结果按名次融合,而不是简单拼接。
  3. 重排:用重排模型对候选逐条打分,取前 3-5 条。
  4. 元数据过滤:先按权限、时间、类型过滤,再检索。

这四步里,重排的性价比最高——通常比换更大的向量模型更有效。

六、拼装:模型看到什么,决定它怎么答

四条规则

  1. 片段要带标识:[1] 来源:某某政策 2026-03。不带来源,模型就没法引用。
  2. 指令要明确:只根据下列资料回答;资料里没有就说没有,不要推测。
  3. 顺序有意义:最相关的放最前,关键约束放首尾(中间容易被忽略)。
  4. 数量要克制:3-5 条足够。给十条,噪声会压过答案。

"没有答案"要单列

这不是一句提示词就够,要在工程上兜住:检索结果为空、或最高分低于阈值时,直接返回兜底话术,不要交给模型自由发挥。

七、最小可用实现路径

按这个顺序做,每一步都能独立验证:

① 选 20 份真实文档,跑通解析,人工检查文本质量
② 按标题切分,人工检查前 50 个块是否语义完整
③ 只做向量召回,取 top-5,人工看命中率
④ 加关键词召回与重排,再对比命中率
⑤ 拼装时加引用与"没有答案"兜底
⑥ 建 50 条评估集,之后每次改动都跑

不要跳的步骤:第 ① 和第 ②。上游脏,下游怎么调都是白费。

八、常见坑

  1. 一上来就调向量参数。 先确认解析与切分是干净的。
  2. 按固定字数切分。 语义被切断,后面怎么检索都补不回来。
  3. 只做向量召回。 精确查询场景会大面积失效。
  4. top-k 给到 10 条以上。 噪声挤占上下文,成本还翻倍。
  5. 拼装时不给来源。 模型只能凭记忆答,等于没用上 RAG。
  6. 没有"没有答案"的兜底。 检索为空时模型一定会编。

九、动手任务:自写 → AI 写 → 对比 → 取舍

四步不跳:① 自己写(限时,关掉补全)→ ② 让 AI 写同一题 → ③ 逐条比对 → ④ 说出保留谁的写法。

① 自己写

  1. 拿一份真实文档(带表格最好),手工切出 5 个块,说明每个块的边界为什么这么定。
  2. 写一段拼装模板:片段怎么标注、指令怎么写、检索为空时怎么答。

② 让 AI 写同一题

把第 1 题交给 AI,补一句 按“标题层级 → 段落 → 表格处理”说明切分理由,并指出哪些位置容易被切断。

③ 对比要盯的点

  • 它的切分是不是按字数均分?
  • 有没有处理表格与代码块?
  • 它有没有说明"块要带哪些元数据"?

④ 一句话取舍

它切出来的块,单独拿出来能看懂吗?不能的话,你会怎么改?

十、自测

  1. RAG 换来哪三件事?代价是什么?
  2. 四个环节各自的典型失败是什么?
  3. 判断切分是否合理的标准是什么?
  4. 为什么说重排的性价比最高?
  5. 拼装环节的四条规则是什么?
  6. 检索为空时,为什么必须工程兜底而不是只写提示词?

参考答案要点:可更新、可核对、权限可控,代价是多一条链路;解析/切分/召回/拼装各有失败模式;单独拿出能否表达完整意思;比换向量模型更有效;带标识、明确指令、顺序、数量克制;模型在空上下文下一定会编。

配套题目

★ 越多越该先背;点题目可看完整答案与深入版。

提示:读完可以顺手做几道对应题目,检验是否真的理解