沈毅全栈与 AI

巴黎 • 新加坡 • 上海

RAG Formation · 第 3 课 · 基础与衡量

构建可信的评估集

把对质量的期待转化为明确、可测试的真实标签。

$ lesson --status
▸ course RAG Formation
▸ lesson 03 / 16
▸ phase 基础与衡量
▸ status 已完成
● build → measure → learn

独立课程

在这里学习完整课程并检验你的理解。

RAG Formation 的 16 节课程内容已完成。本页包含完整课程内容、本地参考资料和可直接在浏览器中完成的即时练习。

本课的具体收获

学完之后,你能拆解一道评估题,并准确说明它的参考答案为什么可靠;如果不可靠,也能指出问题在哪里。

观看讲解视频

1 · 评估就是一份契约

一道评估题不只是用户可能输入的一句话,它是产品团队与评分程序之间的一份契约:

问题:用户提出的问题

预期来源:必须支持答案的文档

必需事实 / must_include正确答案必须包含的高信号事实

预期答案:评分器使用的参考含义

预期拒答 / expect_refusal语料库没有答案时,系统是否应该拒答

跳过这份契约,分数可能看起来非常严谨,却在悄悄衡量完全错误的事情。

主要阅读:OpenAI《评估最佳实践》——注意为什么非确定性的 AI 系统一开始就需要结构化评估。

2 · 阅读演示评估集

打开:

demo/eval_set.yaml

这套演示评估集包含 65 道问题,分布在 25 份合成文档中:

  • 35 道事实问题
  • 7 道参考文档查找问题
  • 9 道多跳问题
  • 5 道跨语言问题
  • 3 道缩略词问题
  • 6 道不可回答问题

这样的组合不是随意安排的。聊天机器人可能轻松解决普通语义问题,却在精确的 SOP 编号、多文档推理,或知道何时拒答这些场景中失败。

3 · 为什么检索匹配只使用元数据

以 q30 为例:

预期来源: PR-QA-MRD-001PR-QA-MRD-009

必需事实: 90 jours

这里有一个陷阱:语料库中的文档会互相交叉引用。PR-QA-MRD-001 的文本块正文里可能直接提到 PR-QA-MRD-009。如果盲目搜索整个文本块,评分器可能会错误地把 PR-QA-MRD-009 计为已检索到,尽管该文档本身从未真正出现在结果里。

这正是 eval.py 只信任来源元数据的原因——例如 sourcedocument_namefilename 字段,而不是仅仅因为正文里出现了一个编号就给检索加分。

4 · 可回答与不可回答

这六道不可回答题不是糟糕的测试设计,而是安全检查。每道题都在问一个简单问题:系统知道自己的知识边界在哪里吗?

问题类型预期来源预期行为
可回答一份或多份文档回答所问事实并引用来源
不可回答拒答,或说明已索引数据中没有答案

5 · 练习:相信题目还是拒绝它?

案例 A:expect_sources 指向 PR-QA-MRD-009,但语料库中任何地方都没有这份文件。这道题仍然有效吗?

案例 B:预期文档编号只出现在另一份文档的正文中,其他地方都没有。此时检索仍然应该得分吗?

案例 C:一道题完全没有预期来源,并标记为 expect_refusal: true。可靠的聊天机器人应该怎么做?

6 · 检查你的评估集

eval_set.yaml 的每个类别中挑一道题,并写下:

  1. 这道题到底可不可以回答?
  2. 哪些来源文档真正支持它?
  3. 正确答案必须包含哪个事实?
  4. 交叉引用会不会诱使评分器错误加分?
  5. 在这里,安全的失败应该是什么样?

企业场景连接

在 SOP、QA、法规、供应商和审计场景中,评估集不只是测试工具,也是产品安全边界的一部分。它首先定义了什么叫“有依据”“正确”和“未知”。

下一步行动

再运行一次离线一致性检查:

cd demo
python3 eval.py verify

然后从六个类别中各挑一道题,写一份简短检查报告并发给我——尤其要包含一个例子,说明只使用元数据匹配如何避免一次错误的检索加分。

对真实标签、评分逻辑或任何评估类别有疑问,尽管问我。 交完检查报告后,我会把第 3 课标记为完成。