打开 RAG 的引擎盖:解析、分块、嵌入、混合检索、重排、引用与拒答。每一步都有自己的错法,评估要逐环节定位。
本课回答的业务问题:RAG 系统为什么“找得到但答不对”?表格和扫描件为什么总出问题?引用、拒答、权限、版本在管线里怎么落地?
前置课程:第 4 课(RAG 上——什么时候用 RAG)。
读完本课你将能够:
- 按顺序说出 RAG 管线的六个环节,并指出每个环节的典型错法;
- 用“逆向定位法”从一次答错出发,判断问题出在解析、分块、检索还是生成;
- 评审供应商的 RAG 方案时,问出关于表格、版本、权限和引用的具体问题。
一句话定义
RAG 管线:解析(把原文变成文本)→ 分块(切成检索单元)→ 嵌入(变成可比对的向量)→ 检索(关键词 + 向量混合召回)→ 重排(精排挑最相关)→ 生成(带引用作答,该拒答时拒答)。每一步的错误都会伪装成“模型答错了”。
这句话里最重要的词是“管线”。它意味着:你看到的“AI 回答”,是六道工序接力出来的产物。任何一道工序出了错,最终表现都是“答错了”,但病因和药方完全不同。上一课讲了“要不要用 RAG”,这一课讲“RAG 用坏了怎么查”——就像上一课决定要不要建资料室,这一课讲资料室内部怎么管理才不出乱子。
生活化类比:资料室的全流程
把 RAG 系统想成一间资料室(虚构),收到一柜子规范和制度:
- 解析=拆箱扫描:订书钉没拆干净,扫出来就是残页;双栏排版按行扫,左右栏的文字串了行;
- 分块=编页装订:一页纸撕成两半装订,一条完整条文就被腰斩;
- 嵌入=做索引卡:给每份材料写一张“内容摘要卡”,卡片写得像不像原文,决定以后找得准不准;
- 检索=管理员粗筛:读者提问后,先从卡片堆里捞出一摞“大概相关”的;
- 重排=细挑:把粗筛的一摞摊开,按贴合程度排出前三份递给读者;
- 引用=复印原文附在答案后面:读者要能翻到原文核对。
资料室还有两件管理制度:门禁(权限——你能不能看这份文件)和版本标签(2015 版和现行版分架摆放,过期版贴黄色标签)。
类比失效处:真人资料员理解“问题意图”靠常识,嵌入模型靠统计规律——它会把“看起来字面相近”的内容排前面,哪怕业务上南辕北辙(比如把“安全生产费用”的条文捞给“生产成本”的问题)。所以不能指望检索器“懂业务”,要靠评估和调优逼近。
本质与能力边界
1. 解析是隐形地基:上游错,全错
很多人以为 RAG 的核心是“算法”,实际上多数质量事故的第一因在解析。三类高频问题:
- PDF 双栏乱序:学术论文、正式规范常用双栏排版,解析器按“从左到右”逐行读,左右两栏的文字被穿插着读出来,条款内容变成乱码级别的错乱。表现:检索根本找不到该条文,或找到的片段读不通;
- 扫描件 OCR 错字:文字层根本没有,靠 OCR 识别。印章遮挡处的字、模糊扫描件、手写批注是重灾区。表现:检索到了,但片段里的金额、编号是错的;
- 表格断行:表格被解析成一串没有行列结构的文字,“项目/数量/单价”的对应关系丢失。表现:问“某项的单价”,模型把相邻行的数字配了对。
排查动作:评 RAG 系统,先随机抽 10 份入库材料,把系统解析出的文本和原文并排对比,重点核对四类字段——金额、编号、日期、条款号:它们错一个字符就是事故,又恰是 OCR 和断行最容易弄错的地方。这一步不过关,后面调检索、换模型都是白费。行话叫 garbage in,garbage out:垃圾进、垃圾出,后面几道工序再高级也救不回来。
2. 分块:没有万能参数,“找得到整条”是唯一标准
分块是把文档切成检索单元。切大了,一块里混进多条不相关内容,检索精度下降、token 费用上升;切小了,一条完整的信息被腰斩,检索到半截条款,模型照样答错。
常见的拍脑袋做法是“每 500 字切一块”。问题在合同和规范不是均匀的文本,是结构化文件:第 12.3 条可能 800 字,第 12.4 条可能 80 字。按固定字数切,前者被切成两块(检索只能命中一半),后者和五条别的条款挤在一块(检索命中时混入大量干扰)。
正确思路是按结构切:
- 合同按“条”切(条款号是天然边界),制度按“条/款”切;
- 表格整体成块,绝不拦腰切断——块里保留表头,否则“12,400 m³”不知道自己属于哪一列;
- 相邻块适当重叠(比如重复 1–2 句),缓解跨块的指代断裂;
- 每块保留出处元数据:文件名、条款号、页码、版本、生效日期——这是后面“引用可回查”的基础。
检验标准只有一条:拿 20 个真实问题测,“答案所需的那条完整信息,是否恰好在一块里”。切多大切多小,是测出来的,不是定出来的。
还有一招值得知道,叫父子分块:检索时用小颗粒的块(命中更准),命中后把它所属的“父块”(整条、整节)交给模型——小块负责“找得到”,大块负责“看得全”,两难各解一半。验收分块质量可以开一张四问清单:随机抽 20 块,逐块问——块里是不是一条完整信息?表格有没有被切断?出处元数据齐不齐?和相邻块的衔接句通不通?四项全过,分块这道工序才算合格。
3. 嵌入:意思指纹,擅长“换个说法”,不擅长精确编号
嵌入模型把每块文本变成一串数字(向量)。你可以把它理解成指纹:内容意思相近的文本,指纹也相近;问句和它想要的答案,指纹天然接近——所以“焊缝要拍多少片子探伤”能匹配到“焊缝检测比例”的条文,尽管两者没有一个共同的词。
这是嵌入的魔法所在,也是它的死穴:
- 擅长:语义泛化。换问法、口语化、同义改写都能匹配上;
- 不擅长:精确匹配。问“第 12.3 条说什么”,正确答案就是包含“12.3”的那块——这种查询按“意思指纹”找反而绕远路,直接按条款号定位(关键词检索)一步命中。
所以成熟系统不单独依赖向量检索。见下一节。
另外要意识到:嵌入模型有领域偏好。用通用语料训练的嵌入模型,对“背靠背条款”“措施费”这类行业术语的“意思”把握可能不准——选型时要用自己的语料测,不能只看公开基准排名。
还有一个容易被忽略的工程事实:换嵌入模型=全库重灌。向量是特定模型的“方言”,两个模型算出的向量互不通用——升级嵌入模型时,所有已入库的块都要重新算一遍向量并重建索引。语料量大时这是以天计的工程,谈方案时要问清:嵌入模型将来升级,重灌成本谁承担、期间服务停不停。
4. 混合检索:关键词和向量,各补对方的短板
| 查询类型 | 关键词检索 | 向量检索 | 谁赢 |
|---|---|---|---|
| “第 12.3 条内容” | 直接命中条款号 | 按意思找,可能绕路 | 关键词 |
| “逾期付款每天罚多少” | “罚”字可能匹配不上“违约金”条文 | 语义对上“逾期付款违约金” | 向量 |
| “C30 混凝土清单量” | 型号精确命中 | 也可能被“混凝土养护”干扰 | 都要,取并集 |
混合检索=两路都跑,结果合并:向量路负责“别漏”(语义变体),关键词路负责“准”(精确标识)。工程上通常再配一个简单规则:含编号、型号、专有名词的查询,提高关键词路权重。
两路结果怎么“合并”也有讲究:关键词和向量是两套打分体系,分数口径不同、不能直接比大小相加,工程上常按名次融合——两路都排前面的块优先。你不用懂融合公式,但评审时听到“我们把两路得分直接相加”,值得追问一句怎么对齐口径。
5. 重排:解决“捞到了,没用上”
检索(召回)追求的是“宁可多捞,别漏掉”,一般捞回 20–50 块;但全部塞给模型既贵又干扰(lost in the middle,见第 1 阶段第 1 课)。重排模型对捞回的候选逐一精细打分,挑出最相关的 3–5 块给生成环节。
先算笔账感受差距(示例单价沿用第 4 课的虚构数字:输入 ¥0.002/千 token):每块约 400 token,把召回的 30 块全塞给模型=12,000 token ≈ ¥0.024/次;重排后只留 5 块=2,000 token ≈ ¥0.004/次。而重排模型只做“打分”不做“写作”,一次调用成本通常远低于生成模型(以当时报价为准)。重排是花小钱省大钱、顺带还提质量的环节。
一个高频故障模式值得单独记住:“材料明明在上下文里,模型就是没用”。你检查发现正确条文确实被检索召回了——问题出在它排在第 18 位,而只有前 5 位进了模型。这不是模型的错,是排序的错;药方是加(或换)重排,而不是换更贵的生成模型。诊断口诀:先看“给模型看了什么”,再评价“模型答得怎么样”。
6. 引用与拒答:信任的来源
- 引用:每个回答附可回查的出处——文件名 + 条款号/页码 + 版本,关键结论旁标原文摘录。引用不是装饰,是让“AI 初审、人终审”分工成立的基础:法务能 30 秒核对一条,才愿意用你的系统。引用还可以量化成验收指标——引用支持率:答案里每个关键结论,能否在它附的引用片段里找到依据(怎么测,见第 3 阶段第 1 课);
- 拒答:检索不到可靠依据时,“未在所提供资料中找到依据,建议人工核查”比硬编一个答案好一万倍。拒答策略要两层设计:提示词层(“找不到就明说,不要猜”)+ 系统层(检索得分低于阈值时直接走拒答模板,不让模型自由发挥)。注意:拒答率太高说明检索或分块有问题,要把“拒答率”当监测指标,而不是一味追求“有问必答”;
- 版本声明:新旧版本同时命中时,回答必须声明“以现行版为准,差异如下”,而不是静默选一个。
7. 权限与版本:在检索前过滤,不指望模型自觉
- 权限:该用户无权看的合同,从一开始就不能进他的召回池。如果先检索后过滤,被过滤的内容已经消耗了召回名额(正确的条文可能被挤掉),还可能在日志里泄露存在性。正确顺序:先按权限缩小资料池,再检索;
- 版本:默认只检索“现行”版本,历史版本单独归档。这一点上一课的案例(新旧制度混答)已经踩过坑。
这两件事是系统设计,写不进提示词就等于没有。
实战演练:追踪一次“数字答错”的全过程
场景(虚构):青柏产业园知识库,用户问“C30 泵送混凝土的清单量是多少”,系统答“约 1,240 m³”。台账显示应为 12,400 m³。
第 1 步:打开该回答的引用,核对片段原文。引用指向工程量清单第 7 块。人工打开这块的原文——发现块内文本就是”…C30 泵送混凝土 1,240 0m³…“(数字和单位之间被解析插进了空格,且换行把 12,400 断成”1,240 0”)。定位:解析层错误。修复:解析器开启表格保护模式,重灌这批文件。
第 2 步(假如原文是对的):片段原文是 12,400,但模型答 1,240——把片段和问题单独发给另一个模型复现。若复现同样的错,是生成层问题(长数字抄写错误),修复:数值字段加程序校验(回答中的数字必须在引用片段中出现),或要求模型逐字摘录数字。若不复现,检查是不是给了模型多个含“1,240”的干扰块——那是重排问题。
第 3 步(假如引用本身指错了块):正确条文在库里但没被引用——查召回日志:正确块排在第 22 位没进前 5。定位:重排问题,加精排或提高候选数。
三步走完,责任落在哪一层清清楚楚。这套“逆向定位法”(先引用、再上下文、最后召回日志)是运营 RAG 系统的基本功。修复后还有最后一个动作:把这道题连同历史错题一起重跑一遍——修一个问题,不能顺手引入新问题;错题集只增不减,它就是你的回归题库。
建工案例:表格与版本的两次事故
事故一(表格被切断):清单入库时按 500 字切块,“C30 泵送混凝土 | 12,400 m³ | 486 元/m³”这行被切成两块,型号和数量分家。用户问清单量,检索只命中了含型号的那半块,数量在另外半块里没跟过来,模型顺手从同块相邻行抓了个数字凑上——答案写得有模有样,和台账一比对不上才穿帮。修复:表格整体成块、块内保留表头,并用“行列对应抽查”复测:随机抽 20 个“某行某列”问题,人工对照原图核验。
事故二(版本串答):问“焊缝探伤比例”,检索同时召回 2015 旧版和现行版(虚构规范示例),模型引用了旧版——两版条文都“语义相关”,向量分不出新旧。修复:入库时版本元数据设为过滤条件,默认排除“已废止”;两版并存且用户明确要对比时,要求回答先声明版本再给结论。这两次事故的共同教训:表现是“模型答错”,病灶都在管线,换模型一个都治不好。
供应商话术拆解
话术:“我们用了最新的嵌入模型,检索准确率业界领先。”
逐问拆解:
- “准确率”是什么口径?——召回率(该找到的找到没有)、命中率(前几名里有没有正确答案)、还是端到端答案正确率?三个数字完全不同,混着说就是话术;
- 在自己的语料上测过吗?——用你们提供的 20 份合同和规范建个小测试集现场跑,比任何基准榜单都真实;
- 表格和扫描件怎么处理?——要求演示:拿一份真实格式的清单扫描件走一遍,看解析结果;
- 权限在哪一层过滤?——正确答案是检索前;“模型会注意的”是错误答案;
- 引用能逐条回查吗?——现场点开引用看是否跳转原文位置;
- 资料更新多久生效?——新签一份补充协议入库后,多久能被检索到?增量入库还是全量重建?合同履行中补充协议、变更单源源不断,更新链路慢的库,答案永远是“上个季度的事实”。
合格回答应该长什么样:“召回、精排、端到端三个口径我们分开报;愿意用贵方样本建测试集盲测;表格走专用解析通道;权限在检索层按部门过滤;引用支持点击回跳原文;新文件分钟级增量入库,旧版自动归档。”——每个问题都接具体机制,而不是形容词。
常见问答
Q1:“向量”要不要学数学? 不用。你只需要建立两个直觉:每块文本被压缩成一串数字(指纹);两串数字越接近,意思越相近。剩下的都是检索系统内部的事,你的职责是提需求和验收。
Q2:为什么我上传的 Excel 总答错? 因为表格的行列结构在“切块”时最容易被破坏——型号在 A 块、数量在 B 块,模型看到的是散落的数字。解法是表格专用解析(保留行列关系、整表成块)。这是 RAG 工程问题,不是“AI 不行”。
Q3:每次检索取几块合适? 没有标准答案,是调出来的平衡:太少漏信息,太多费用高、干扰大(中间位置利用打折)。常见起点是“重排后取 3–5 块”,然后用真实问题集测“命中率—成本”曲线再定。供应商应能说出他的取数逻辑和依据。
Q4:要不要上知识图谱? 先问要解决什么问题。多数建工场景(找条文、查制度、对条款)用“结构化分块 + 混合检索 + 重排”已经够用;图谱的强项是复杂多跳关系(“A 的分包商的母公司的资质”)。图谱构建和维护成本高,没有明确的多跳查询需求前不建议为技术而技术。
Q5:回答引用了正确条款,数字却抄错了,怎么回事? 两层可能:引用片段本身错了(解析/OCR 把数字弄错——查片段原文);或片段对、模型抄错(生成层问题——用程序校验拦:回答里的数字必须能在引用片段中找到)。这也是“引用回查”要做成自动规则的原因。
Q6:RAG 会不会把内部资料泄露给不该看的人? 如果权限在检索层正确过滤,不会;如果指望“提示模型别泄露”,不可靠。评审时直接问权限过滤的实现层(见第 3 阶段第 3 课)。
Q7:微调能不能代替 RAG? 不能互相代替:微调改模型的“习惯”,RAG 提供“本次的资料”。规范、制度这类持续更新的知识,靠检索实时供给;微调适合固化稳定的口径和风格(见第 4 阶段第 2 课)。两者常组合使用。
Q8:拒答多了是不是系统差? 拒答率是个双向指标:太高,说明检索/分块有问题(该找到的没找到);太低且答得多,要警惕硬编。健康状态是“有据必答、无据明说”,运营时把拒答率和高风险问题抽检搭配着看。一个可执行的动作:上线初期每周抽 20 条拒答记录人工核对——其中“其实库里有答案”的比例,就是检索环节的改进空间。
自测
RAG 系统回答“预付款比例”时引用了正确条款,但数字抄错了(原文 20%,答成 200%)。可能的故障环节有哪些?怎么定位?
参考要点(先自己作答,再展开对照)
按“逆向定位法”三步走:
- 查引用片段原文:打开该回答引用的块,人工核对原文是 20% 还是 200%。若片段本身是 200%——解析/OCR 层错误(把 20 认成 200,或换行断了数字),修复解析并重灌库;
- 片段对、答案错则查生成层:把该片段和原问题单独喂给另一个模型复现。复现同样的错——生成层抄写错误,修复:数值字段程序校验(回答数字必须出现在引用片段中)、要求逐字摘录;
- 查是否存在干扰:若不复现,检查当时上下文里是否有其他含“200”的块(比如另一份材料里“履约保证金 200 万元”的块被误召回,模型张冠李戴)——那是检索/重排层问题,提高精排或收紧检索范围。
答题要点:三个环节(解析、检索、生成)各对应一种病因;定位顺序永远是“先看给模型看了什么(引用与上下文),再评判模型答得怎么样”;数值错误必须有程序校验兜底,不能只靠模型自觉。
概念卡片
| 名词 | 一句话定义 |
|---|---|
| 解析 | 把 PDF/扫描件变成机器可读文本;双栏、OCR、表格是三大事故源 |
| 分块 | 把文档切成检索单元;按结构切、表格整块、带出处元数据 |
| 父子分块 | 小块负责检索命中,命中后取父块给模型——“找得到”与“看得全”兼顾 |
| 嵌入(embedding) | 把文本变成“意思指纹”向量;擅长语义变体,不擅长精确编号 |
| 混合检索 | 关键词 + 向量两路召回取并集,互补短板 |
| 重排(rerank) | 对召回候选精排取前几;“捞到没用上”是排序病不是模型病 |
| 引用与拒答 | 回答附可回查出处;无据明说不硬编 |
| 权限/版本过滤 | 检索前完成,写不进提示词就等于没有 |
延伸阅读
- 检索质量指标(召回率、引用支持率)在第 3 阶段第 1 课展开;权限设计在第 3 阶段第 3 课展开。
- 参考:Anthropic 上下文工程,核验于 2026-09-16。各嵌入/重排模型属动态选型信息,接入时用自己的语料实测对比。