Course Builder个人学习工作台 · 本地模式
LLM Eval 实战:用 Python 评测 Skill 与 System Prompt

L001:先认识 Eval,再为 course-builder 写一份最小 Contract

目标:理解 Eval 的基本组成及其与 Demo、测试、Benchmark 和监控的区别,并能写出一份最小 Evaluation Contract。

为什么这一课是下一步

你已经有丰富的 LLM 产品、Pi 插件和 Skill 开发经验,但“会构建”不自动等于“会系统评测”。原版本直接让你写 Evaluation Contract,跳过了 Eval 的背景、结构和示例。修订后的这一课先建立共同语言,再让你完成一个更小的练习。

0–6 分钟:什么是 Eval

在这门课里,Eval 是一套可重复的测量过程,用来判断一个 LLM 系统在一组有代表性的任务上表现如何,并支持一个具体决策。

一套最小 Eval 通常包含六部分:

  1. Decision:结果要支持什么决定,例如是否采用新版 prompt。
  2. Cases:系统要面对哪些输入和情境。
  3. Target:被评测的 prompt、Skill、Agent 或完整工作流。
  4. Outputs / traces:系统最终输出了什么,过程中做了什么。
  5. Graders:如何判断每个输出是否满足标准。
  6. Report:如何汇总结果、不确定性、失败样例和成本,并作出决定。

OpenAI 的 Eval 工作流把测试数据与 testing criteria,也就是 graders,连接起来。[S01] 对会调用工具的 Agent 或 Skill,仅看最终文本可能不够,还需要区分 task、trial、trajectory、outcome 和 harness。[S03]

可以把它写成:

Eval = 明确决策 + 代表性 cases + 可观察输出 + 合适 graders + 可解释报告

Eval 不等于什么

  • 不是 Demo:Demo 证明系统有一次能工作,Eval 测量它在一组条件下多大程度上可靠。
  • 不只是单元测试:确定性测试可以成为 grader,但开放式质量通常还需要 rubric、模型判断或人工判断。
  • 不只是 Benchmark:Benchmark 通常用于标准化比较;你的 Eval 应围绕自己的用户、风险和产品决策设计。
  • 不只是线上监控:监控告诉你线上发生了什么;Eval 还可以在发布前比较候选版本并阻止回归。

6–11 分钟:为什么 LLM 系统特别需要 Eval

传统代码在相同输入和环境下通常得到稳定结果,而 LLM 系统可能受到模型采样、上下文、工具环境、prompt 细节和模型版本影响。

更重要的是,“质量”不是一个单一维度。一个回答可以语言流畅,却引用错误政策;一个 Skill 可以生成漂亮课程,却错误地把“看过”当作“掌握”。如果把安全、正确性、成本和延迟压成一个平均分,严重失败可能被大量普通 case 掩盖。[S07]

Eval 主要解决四类问题:

  1. 发布前比较:新版是否真的优于当前版?
  2. 防止回归:修复一种失败时,是否破坏了原本正常的行为?
  3. 定位问题:失败来自 cases、target、grader、harness,还是系统本身?
  4. 积累证据:团队为什么保留、修改或回滚一个版本?

一个 Eval 不需要从几千条 case 开始。第一轮可以很小,但 case 必须与真实决策和失败模式相连。

11–18 分钟:例子一,评测 System Prompt

假设有一个 LLM,需要把客服消息转换成 JSON:

{
  "category": "refund | delivery | account | other",
  "urgency": "low | medium | high",
  "summary": "一句话摘要"
}

候选改动是给 system prompt 增加更详细的退款和紧急程度规则。我们要决定是否从 prompt-v1 切换到 prompt-v2。

Cases

至少包含:

  • 明确的退款请求;
  • 信息不完整的配送问题;
  • 同时涉及账户和退款的冲突请求;
  • 带有 prompt injection 的用户消息;
  • 不属于任何已知类别的请求。

Graders

可以组合使用:

  • JSON 是否可以解析;
  • 字段是否完整,枚举值是否合法;
  • 已有人类标签时,category 是否匹配;
  • summary 是否忠实于原消息;
  • 是否错误服从用户消息中的 system prompt 覆盖指令。

决策

不能只问“平均准确率是否提高”。还要检查:

  • prompt-v2 是否减少重要退款误判;
  • 是否产生新的 injection 回归;
  • 输出 token 和延迟是否明显增加;
  • 提升是否足以抵消成本和风险。

这个例子中,JSON 检查和 enum 检查适合确定性 grader;摘要忠实度可能需要 rubric、模型 grader 或人工校准。Eval 的关键不是尽量使用复杂 grader,而是为每项标准选择足够可靠且主观性最低的方法。[S01]

18–25 分钟:例子二,评测 Pi Skill

Pi 会根据 Skill 的名称和 description 发现能力,在任务匹配时加载 SKILL.md,也可以通过 Skill command 显式调用。[S08] 因此 Skill Eval 至少有两个不同层面。

层面一,是否正确触发

以 course-builder 为例:

应该触发:
“帮我创建一门持续八周的 LLM Eval 课程。”
“继续上次课程的下一课。”

不应该触发:
“Eval 这个英文单词是什么意思?”
“把这段 release note 改得更自然。”

这里可以测量:

  • 应触发 case 中成功触发的比例;
  • 不应触发 case 中避免误触发的比例;
  • 修改 description 后出现了哪些新增错误。

层面二,触发后是否做对

即使 Skill 正确触发,也可能违反行为约束。例如:

  • 没有先创建完整路线;
  • 只生成第一课,导致静态部署缺少后续 Lesson;
  • 没有证据就提升知识状态;
  • 对时间敏感的内容没有检查主要来源;
  • 修改了 Skill 自身,而不是课程状态。

这些标准中,有些可以通过 Python 检查文件和 JSON 状态,有些需要查看最终课程是否真正符合学习目标。对会使用工具的 Skill,还需要关注它执行了哪些操作以及最终产物是否正确。[S03]

一个可能的评测决策

是否修改 course-builder 的 description,
让“持续学习 / 创建课程”请求更稳定地触发,
同时不增加一次性事实问答的误触发?

这比“新版 description 感觉更清楚”更适合 Eval,因为它明确了候选改动、正向行为、负向行为和最终决策。

25–28 分钟:快速理解检查

请先不回看上文,回答三个问题。每题完成后再展开参考答案,不要先看答案再作答。

问题 1

为什么一次成功 Demo 不能证明系统可靠?

完成后查看参考答案

Demo 只能说明系统在某一次输入、环境和随机结果下成功。它没有覆盖代表性 cases,也没有使用一致标准重复测量,因此不能估计系统在正常、边界和失败条件下的可靠程度。

问题 2

Cases 和 Graders 分别解决什么问题?

完成后查看参考答案

Cases 定义这次 Eval 抽样覆盖哪些输入和情境。Graders 根据明确标准判断每个输出是否满足要求,可以给出标签、分数或解释。Cases 不能保证覆盖所有情形,Graders 也不能弥补缺失的重要 case。

问题 3

如果新版总体分数更高,但出现一次“无证据提升学习状态”,是否应该直接采用?为什么?

完成后查看参考答案

不应该直接采用。总体分数提高是正向证据,但“无证据提升学习状态”违反不可妥协约束。严重回归不能被大量普通 case 的平均分抵消,应先修复、重新评测,再决定采用、修改或回滚。

这三题用于判断概念解释是否清楚,不要求使用标准术语。

通过标准

  • 能解释 Eval 与一次 Demo 的差异。
  • 能区分 Cases、Target、Outputs 和 Graders 的作用。
  • 最小 Contract 对应一个真实的 keep / revise / rollback 决策。
  • 至少给出两个正向触发和两个负向触发输入。
  • 三个失败模式具体、可观察,并能说明影响。
  • 不可妥协约束不会被平均分抵消。
  • 不确定信息被明确保留给后续课程,而不是伪装成事实。

Sources used

  • S01 OpenAI, Working with evals.
  • S03 Anthropic, Demystifying evals for AI agents.
  • S07 Anthropic, Challenges in evaluating AI systems.
  • S08 earendil-works, Pi Coding Agent: Skills.