评估驱动开发(Eval-Driven Development, EDD)
概述
评估驱动开发(EDD)将评估(Eval)视为"AI 开发的单元测试":在实现之前定义预期行为,在开发过程中持续运行评估,用 pass@k 指标衡量可靠性,并通过每次变更追踪回归。它提供了一个正式的评估框架,涵盖能力评估(Capability Eval)和回归评估(Regression Eval)两种类型。
二、评估类型
2.1 能力评估(Capability Eval)
测试 Claude 是否能做到之前做不到的事情:
[能力评估: feature-name]
任务: 描述 Claude 应该完成什么
成功标准:
- [ ] 标准 1
- [ ] 标准 2
- [ ] 标准 3
预期输出: 预期结果描述
2.2 回归评估(Regression Eval)
确保变更不会破坏现有功能:
[回归评估: feature-name]
基线: SHA 或检查点名称
测试:
- existing-test-1: 通过/失败
- existing-test-2: 通过/失败
- existing-test-3: 通过/失败
结果: X/Y 通过 (之前 Y/Y)
三、评估器类型
3.1 基于代码的评估器(Code-Based Grader)
使用代码进行确定性检查:
# 检查文件是否包含预期模式
grep -q "export function handleAuth" src/auth.ts && echo "PASS" || echo "FAIL"
# 检查测试是否通过
npm test -- --testPathPattern="auth" && echo "PASS" || echo "FAIL"
# 检查构建是否成功
npm run build && echo "PASS" || echo "FAIL"
3.2 基于模型的评估器(Model-Based Grader)
使用 Claude 评估开放式输出:
[模型评估器提示]
评估以下代码变更:
1. 是否解决了陈述的问题?
2. 结构是否良好?
3. 边界情况是否处理?
4. 错误处理是否适当?
评分: 1-5 (1=差, 5=优秀)
理由: [说明]
3.3 人工评估器(Human Grader)
标记需要人工审查的内容:
[需要人工审查]
变更: 变更内容描述
原因: 为什么需要人工审查
风险等级: 低/中/高
四、核心指标
pass@k(至少一次成功)
"在 k 次尝试中至少一次成功"
- pass@1:首次尝试成功率
- pass@3:3 次内成功
- 典型目标:pass@3 > 90%
pass^k(全部成功)
"k 次试验全部成功"
- 更高的可靠性门槛
- pass^3:连续 3 次成功
- 用于关键路径
五、评估工作流
第 1 步:定义(编码前)
## 评估定义: feature-xyz
### 能力评估
1. 能创建新用户账户
2. 能验证邮箱格式
3. 能安全地哈希密码
### 回归评估
1. 现有登录仍然正常
2. 会话管理未变
3. 登出流程完好
### 成功指标
- 能力评估的 pass@3 > 90%
- 回归评估的 pass^3 = 100%
第 2 步:实现
编写代码以通过定义的评估。
第 3 步:评估
# 运行能力评估
[对每个能力评估运行,记录 通过/失败]
# 运行回归评估
npm test -- --testPathPattern="existing"
# 生成报告
第 4 步:报告
评估报告: feature-xyz
========================
能力评估:
create-user: 通过 (pass@1)
validate-email: 通过 (pass@2)
hash-password: 通过 (pass@1)
总计: 3/3 通过
回归评估:
login-flow: 通过
session-mgmt: 通过
logout-flow: 通过
总计: 3/3 通过
指标:
pass@1: 67% (2/3)
pass@3: 100% (3/3)
状态: 准备审查
六、命令用法
/eval define <name> -- 创建评估定义
在 .claude/evals/feature-name.md 创建评估定义文件:
## EVAL: feature-name
创建时间: $(date)
### 能力评估
- [ ] [能力描述 1]
- [ ] [能力描述 2]
### 回归评估
- [ ] [现有行为 1 仍然正常]
- [ ] [现有行为 2 仍然正常]
### 成功标准
- 能力评估 pass@3 > 90%
- 回归评估 pass^3 = 100%
/eval check <name> -- 运行评估
- 读取
.claude/evals/feature-name.md中的评估定义 - 对每个能力评估:尝试验证标准,记录通过/失败
- 对每个回归评估:运行相关测试,与基线比较
- 报告当前状态
/eval report <name> -- 生成完整报告
评估报告: feature-name
=========================
生成时间: $(date)
能力评估
----------------
[eval-1]: 通过 (pass@1)
[eval-2]: 通过 (pass@2) - 需要重试
[eval-3]: 失败 - 见备注
回归评估
----------------
[test-1]: 通过
[test-2]: 通过
[test-3]: 通过
指标
-------
能力 pass@1: 67%
能力 pass@3: 100%
回归 pass^3: 100%
备注
-----
[问题、边界情况或观察]
建议
--------------
[可发布 / 需要改进 / 被阻塞]
/eval list -- 显示所有评估
评估定义列表
================
feature-auth [3/5 通过] 进行中
feature-search [5/5 通过] 就绪
feature-export [0/4 通过] 未开始
/eval clean -- 清理旧评估日志
保留最近 10 次运行记录。
七、评估存储
.claude/
evals/
feature-xyz.md # 评估定义
feature-xyz.log # 评估运行历史
baseline.json # 回归基线
八、完整示例:添加身份认证
## 评估: add-authentication
### 第 1 阶段:定义(10 分钟)
能力评估:
- [ ] 用户可以使用邮箱/密码注册
- [ ] 用户可以使用有效凭据登录
- [ ] 无效凭据被拒绝并返回正确错误信息
- [ ] 会话在页面刷新后保持
- [ ] 登出清除会话
回归评估:
- [ ] 公共路由仍然可访问
- [ ] API 响应未变
- [ ] 数据库模式兼容
### 第 2 阶段:实现(时间不定)
[编写代码]
### 第 3 阶段:评估
运行: /eval check add-authentication
### 第 4 阶段:报告
评估报告: add-authentication
==============================
能力: 5/5 通过 (pass@3: 100%)
回归: 3/3 通过 (pass^3: 100%)
状态: 可以发布