60天企业 AI 实战训练营 · 阶段 2 · 第 2 周

RAG 完整工程
与评测

从文档解析到可追溯回答 —— 企业级 RAG 最小闭环,今天全部打通

Day 10 讲师 · 包学斌 2026 · 09 含实操 · 请自带电脑
PDF Word chunk +meta retrieve rerank LLM grounded answer [TRAVEL:12] ✓引用 解析 → 切块 → 检索 → 精排 → 有据作答 评测闭环:Golden Set 回归

按 → 或 空格键 翻页 · F 全屏

今天这堂课解决什么问题

课程目标

01
跑通 RAG 全链路
解析 → 切块 → 索引 → 检索精排 → 有据作答 —— 八站流水线一站不缺。
02
回答可追溯
Grounded + Citation:每条结论带 [doc_id:page],用户可点开原文验证。
03
质量可度量
Golden Set 上分维度评测 —— 答错时说得清是检索的锅还是生成的锅。
它在 60 天课程中的位置
Day 7 · 大语言模型工程基础已完成
Day 8 · Prompt Engineering 与 Structured Output已完成
Day 9 · Embedding 与语义检索已完成
Day 10 · RAG 完整工程与评测今天
Day 11 · SQL 核心查询下一课
四天连招收官:Day 7 认知 → Day 8 契约 → Day 9 检索 → 今天闭环 —— 阶段 2 第一个可交付系统
互动 · 举手投票 + 点击选择

RAG 系统答错了,第一反应查哪里?

凭直觉点一个 —— 今天教你不用猜

点一个选项,看看它意味着什么 →
01
Part 01

文档进,语料出

解析与切块:RAG 的地基在模型之外

PDF / Word / OCR Chunk 策略 Overlap
Part 01 · 全景

企业 RAG 八站流水线

每点一次点亮一站 —— 今天的新站点加粗,昨天的技能在复用

Parse
解析
Chunk
切块+重叠
Embed
昨天学过
Index
元数据入库
Retrieve
混合召回
Rerank
今天新增
Generate
Grounded
Cite + Eval
可追溯+回归
离线链路(写入侧)
Parse → Chunk → Embed → Index:批处理任务,质量决定检索上限
在线链路(查询侧)
Retrieve → Rerank → Generate → Cite:每次请求实时走,延迟与成本敏感。
木桶效应:RAG 质量 = 最弱那一站。解析丢表格 → 后面全白搭。
Part 01 · 文档进,语料出

解析:结构比文字更值钱

工具矩阵
文本型 PDF:pdfplumber / pypdf / Unstructured;扫描件走 OCR(PaddleOCR / Tesseract);Word 直读样式层级。
解析目标是"纯文本 + 结构"
标题层级、表格、图片位置都要保留:标题进 metadata 让 chunk 继承;表格转 Markdown/HTML 保住行列关系。
常见坑
表格被展平成"一长串数字"——行列错位;标题层级错乱 → 后续 chunk 丢失上下文,问"第4章"永远搜不到。
# 解析产物:带结构的 chunk 素材 { "doc_id": "TRAVEL-2026", "heading": "4.2 住宿标准", "page": 12, "text": "| 城市 | 上限 |\n|---|---|\n| 一线 | 650 |", # 表格保留为 Markdown ✓ # 而不是 "650 450 350 一线城市…" }
Part 01 · 文档进,语料出

Chunk:切在结构上,缝在重叠里

切块策略谱系
固定长度 → 按句/段 → 按语义按结构(章-节)。企业制度文档优先按章节切 + 滑动窗口
Overlap 是缝合线
相邻块重叠一段文字,降低"跨段信息被切断"。连续叙述(合同、制度)适当加大 overlap。
每块都带"户口"
chunk 附标题、章节号、页码 metadata —— 检索命中后,引用与溯源全凭它。
切太大
一块混多个主题 —— 命中了,模型也抓不到重点,还烧 token。
切太碎
"标准见下表"和表被切进两块 —— 上下文断裂,条件与数值分家。
粒度判据
一块 = 一个可独立回答的语义单元;拿 Golden 问题实测召回,不靠玄学拍 512。
实操 ① · 10 分钟 · 两人一组

切块对比实验

1demo/chunk_lab.py:对内置制度样文分别按 512 定长 / 章节 / 章节+15% overlap 三种策略切块
2用脚本的 7 个探针问题跑召回,记录每种策略的命中情况
3找到那个"条件在上一段、数值在下一段"的问题 —— 看 overlap 怎么救它
4demo/data/ 里换成你们部门的真实文档(md/txt),再对比一轮
10:00
验收标准
三策略 × 5 问题的命中矩阵已填
指出 overlap 拯救了哪条查询
给出你们文档的推荐切法与理由

chunk_lab 内置离线代理向量,无需 API Key

02
Part 02

召回升级:过滤与精排

先找得对,再排得准

Metadata Rerank 两阶段检索
Part 02 · 召回升级

Metadata:chunk 的身份证

// 每个 chunk 的结构化标签 { "doc_id": "TRAVEL-2026", "chapter": "4.2 住宿标准", "page": 12, "dept": "FIN", "security": "internal", // 必填! "effective": "2026-01-01" // 版本过滤 }
schema 一旦上线就是契约
后期改字段 → 老数据过滤不到 —— 第一天就把权限与版本字段设计齐。
三大用途
过滤(tenant/dept/密级/生效日期)· 排序(新版优先)· 引用(生成答案时直接取 doc_id+page)。
检索时过滤 ≠ 生成后过滤
昨天的结论再讲一遍:越权内容不进候选、不进上下文、不进日志 —— 权限判断交给模型 prompt = 迟早事故。
制度类知识库标配
"仅检索 effective <= 查询日 且状态=生效" —— 答旧版制度是企业知识库的隐形事故源。
Part 02 · 召回升级

两阶段检索:便宜的召回,昂贵的精排

阶段一 · 召回(快而便宜)
做法混合检索 Top-20~30(昨天两路+RRF)
评分Bi-Encoder:查询与文档各自编码,算距离
特点可预计算、毫秒级 —— 但没看过"查询×文档"组合
阶段二 · Rerank(慢而精准)
做法Cross-Encoder 逐对精算 → 留 Top-3~5
模型bge-reranker · Cohere Rerank
特点查询与文档拼一起过模型,相关性判断强得多
成本账
Cross-Encoder 每对都要推理一次,只能用在候选少的第二站 —— 召回 20~30 → 精排 3~5 是企业问答的默认配方;精排对精度的提升显著,成本完全可控。
两个坑
跳过 rerank 让 LLM"自己挑重点"——贵且不靠谱;rerank 模型与业务领域不匹配 —— 通用模型对专业术语精排会失准,要实测。
互动 · 找茬游戏

数据侧六连判

先心里给个判断,再点击揭晓

制度按"章-节"切块,每块继承标题与页码 结构优先 + metadata 完整
PDF 表格直接抽成纯文本流,行和列各排各的 结构丢失:650 属于哪个城市没人知道
overlap 设为块长的 10–20%,且只在连续叙述类文档加大 缝合跨段语义,又不至于重复命中
权限过滤等答案生成后,再由后端删掉涉密引用 涉密内容已进模型与日志 —— 过滤必须在检索层
召回 Top-25 交给 bge-reranker,取前 4 进上下文 两阶段检索的标准剂量
新制度发布后,旧版文档直接从库里物理删除 历史问题要用 effective 过滤答旧版 —— 删除破坏可追溯
03
Part 03

有据作答与引用

答案的每一句话,都要回得起查

Grounded Answer Citation 拒答也是答案
Part 03 · 有据作答

Grounded:只说材料里有的话

# 生成端 prompt 骨架(Day 8 五要素落地) <policy> [TRAVEL-2026:12] 一线城市住宿≤650元/晚… [TRAVEL-2026:13] 餐费补贴一线每日150元… </policy> Rules(硬性): 1) 仅使用 <policy> 中的内容回答; 2) 材料未提及 → 回答"无法确认", 禁止凭常识补充; 3) 每条结论句尾标注 [doc_id:page]。
技术手段三层叠加
Prompt 强约束(上面的 Rules)+ 带引用输出(结构化字段)+ 外部校验(引用完整性程序检查)—— 三层都上,缺一不可。
两个坑
模型会编造引用:格式对、内容错 —— 引用要程序化回查;context 过长会漏读关键段 —— rerank 截断在前,Day 7 首尾规律在后。
拒答是功能不是缺陷
材料没写的,"无法确认"就是正确答案 —— 拒答率进评测指标(Part 04)。
Part 03 · 有据作答

Citation:把"信我"变成"查它"

引用怎么生成
① chunk 自带 doc_id + page(解析时已定)
② 回答句尾附 [编号],编号对应上下文条目
③ Structured Output 把 cited_docs 收进 schema(Day 8)
④ 后端校验引用存在性与内容匹配
引用要能点
前端把 [TRAVEL-2026:12] 渲染为链接,点击直达原文第 12 页高亮段 —— 用户的验证成本越低,系统可信度越高。
引用不足要告警:一段结论挂零引用 = 高幻觉嫌疑。
{ "answer": "一线城市住宿每晚不超过 650 元 [TRAVEL-2026:12]。", "cited_docs": [{"doc_id": "TRAVEL-2026", "page": 12, "url": "/docs/TRAVEL-2026#p12"}], "confidence": "high" }
实操 ② · 12 分钟 · 两人一组

串起端到端 RAG 问答

1复用昨天 demo/ 的 pgvector 库;打开 demo/rag_app.py 补全 generate()
2链路:混合检索 Top-20 →(模拟)rerank 取 4 → 组装 <policy> → Grounded prompt → structured 输出
3跑 3 个探针:"住宿标准"(应命中引用)/ "调薪方案"(HR 身份应拒答)/ "打车费"(无据应拒答)
4把引用的 page 与库中原文对照 —— 确认没有"编造引用"
12:00
验收标准
命中类答案全部带 [doc_id:page]
两条无据问题都得到"无法确认"
引用回查与原文一致

rerank 无真模型时用脚本内置的关键词精排代理

04
Part 04

评测:闭环的最后一站

没有 Golden Set 的 RAG 只是在"演示"

三维指标 归因分离 改动必回归
Part 04 · 评测

RAG 评测:三个维度各管一段

Retrieval · 找没找到
Recall@K 证据进没进候选
MRR 正确证据排第几
nDCG 整体排序质量
找不到,后面全白搭。
Grounding · 用没用
答案是否只基于检索上下文
引用正确率:指对页了吗
忠实度:有句没据 = 幻觉嫌疑
找到了≠照着说。
Answer · 对不对
答案正确率(对 Golden 答案)
幻觉率 · 拒答率 分别统计
拒答率过高 = 过度保守,也是病
业务只看这一维,工程必须看三维。
归因纪律:答错先问"证据进上下文了吗"—— 进了没用好 → 查生成侧;没进 → 查解析/切块/检索。别让 Prompt 背检索的锅。
Part 04 · 评测

Golden Set:RAG 的回归测试

先做 50–100 条
覆盖典型场景 + 边界情况(多跳、无据应拒答、旧版本、跨部门权限);每条带标准答案与应引用文档。
改动必回归
prompt、模型、切分策略任何一个变了 → 全套重跑,通过率写进 CHANGELOG(Day 8 纪律的兑现)。
常见坑
只看"答案好不好"不知道是 retrieval 不到还是 generate 不对 —— 两维不拆开,调优全靠抽签。
// golden.jsonl 一条合格用例 { "question": "深圳出差住宿上限?", "gold_answer": "650 元/晚", "gold_docs": ["TRAVEL-2026:12"], "category": "typical", "expect_refused": false } // 一次回归输出的三维记分卡 Recall@8 92% ↑ 检索达标 Grounding 88% ↓ 引用错位 3 条 RefuseRate 95% ✓ 该拒的都拒了
实操 ③ · 15 分钟 · 综合演练

给你们的 RAG 打出第一张记分卡

1demo/golden_rag.jsonl 扩到 15 条:10 典型 + 3 应拒答 + 2 注入用例
2运行 python eval_rag.py:输出 Recall@K / Grounding / 幻觉率 / 拒答率 记分卡
3归因练习:任选一条失败用例,按"证据进没进上下文"判定该修哪一站
4改一处(切块或 K 值)重跑,记录指标变化 —— 体会"改动必回归"
5结果 commit + 记分卡截图发群 —— 这就是你的阶段 2 首个交付
15:00
验收清单
三维记分卡已产出
一条失败用例完成归因
一处改动的前后指标对比
已 git commit

卡住就举手 —— 实操环节助教会巡场

互动 · 快问快答

评测三连问

先举手投票,再点击揭晓答案

1. 换了切块策略,只测 5 个"感觉重要"的问题就够了?
不够 —— 切块是地基级改动,必须全量 Golden Set 回归;5 个样本的波动淹没在噪声里。
✗ 全量跑
2. 模型主动说"无法确认",算失败吗?
对无据问题,拒答是正确行为;拒答率与幻觉率要一起看 —— 全拒保平安的指标同样难看。
✓ 看场景
3. Recall@K 掉点,优先怀疑 prompt 写得不好?
反了 —— Recall 是检索侧指标,prompt 再差也不影响证据进没进候选;先查切块、embedding 与过滤条件。
✗ 查错层
Part 04 · 复盘 · 互动讨论

三大血泪坑

1
解析阶段丢了表格结构
"650 对应哪个城市"变成玄学 —— 检索命中率再高也答不对;解析质量决定 RAG 天花板。
2
把权限与版本判断交给 LLM
"请不要引用已废止文件" —— 模型照引;旧文件没打 effective 标签,检索层想过滤都没有抓手。
3
Demo 跑通就宣布上线
没有 Golden Set、没有三维记分卡 —— "演示一次对一次"不等于"一万次查询 95% 可信"。
课堂讨论 · 2 分钟
业务方说:"把 800 页员工手册直接塞进 128K 窗口,省掉 RAG 多好。"你答应吗?
答案:不答应,并给出三条依据
每次请求成本与延迟爆炸(Day 7);lost in the middle 让 800 页中段形同虚设;没有权限过滤维度 —— 全员可问出薪酬表。RAG 不是省 token 的技巧,是权限、溯源与成本的架构。
总结

今天你带走了什么

链路
八站流水线:离线写入 + 在线查询两段论
链路
解析保结构:表格转 Markdown、标题进元数据
链路
块=语义单元:章节切分 + overlap 缝合线
链路
两阶段检索:召回 20~30 → 精排 3~5
规范
metadata 第一天就带权限与生效日期
规范
Grounded:仅凭材料作答 + 无据必拒答
规范
引用可点击可回查,零引用要告警
规范
旧版制度用 effective 过滤,不物理删除
评测
三维记分卡:Retrieval / Grounding / Answer
评测
Golden Set 50–100 条,改动必回归
评测
答错先归因:证据进没进上下文
心法
RAG 是权限、溯源与成本的架构,不是省 token 的技巧
"可追溯的答案,才是可上线的答案。"
课后作业 · 明日预告

阶段 2 收官,明天换把"数据尺"

作业 1 · 知识库上线包
选部门一份真实制度文档,交付:解析脚本 + 切块方案说明 + metadata schema(含权限/版本字段)。
作业 2 · Golden Set 50
把回归用例扩到 50 条(典型 35 + 应拒答 10 + 注入/权限 5),跑出第一版三维记分卡。
作业 3 · 阅读
FastGPT 知识库/RAG 文档(doc.fastgpt.io/zh-CN/guide/dataset/rag);复习明天关键词:SELECT / WHERE / GROUP BY。
明日预告 · Day 11
SQL 核心查询
AI 处理的不只是文档,更是企业经营数据 —— 明天进入第 3 周:用 SQL 完成数据的筛选、分组与排序,为"Text-to-SQL"打地基。
讲师 · 姜荣佳

谢谢 · Q&A —— 实操问题随时在群里 @ 包学斌

Day 10 · RAG 完整工程与评测 · 包学斌
1 / 24