本节摘要:Anthropic 的指引一针见血:「从简单提示开始,用全面评估来优化它们,只在需要时才加多步智能体系统。」评估不是最后一步——它是驱动第 15 章(Agent 工程)其他所有选择的外层循环。Agent 能过 demo,却以 demo 预测不到的方式在生产失败;基准回答的是「这个模型整体有多强」,而非「我的产品里这个 Agent 在交付对的补丁吗」。答案是三层评估,持续运行,且每条护栏、每条学到的规则都映射到一个评估用例。静态基准层:SWE-bench Verified(代码,第 19 节)、WebArena/OSWorld(浏览/桌面,第 20 节)、GAIA(通才)、BFCL V4(工具,第 06 节)——用于跨模型比较与回归门控,污染真实(SWE-bench+ 查出 32.67% 泄露,必须报 Verified/+ 审计分)。自定义离线层:你产品的形状——LLM-as-judge(第 24 节)、基于执行(跑补丁查测试)、基于轨迹(对比金轨迹,OSWorld-Human 显示顶尖 Agent 1.4~2.7 倍)。在线层:会话回放、护栏告警(第 16/21 节)、每步成本/延迟追踪(第 23 节)。评估器-优化器是 Self-Refine(第 05 节)的泛化——提案、判断、精炼直到通过。2026 最佳实践:评估与代码同仓、每次 PR 在 CI 跑、门控合并(如「相对 main 回归>5% 即拒」)、每条护栏映射到用例、每条学到的规则(Reflexion、pro-workflow learn-rule)映射到失败用例。本节用一张表把全章每节连到它生成的评估用例,并用标准库实现一个带评估器-优化器循环与 CI 门的评估装置。读完本节,你应能避免「无基线、LLM-judge 无锚定、过拟合评估、评估抖动」四种失败。
对应原课程:Phase 14 · Lesson 30 ·
eval-driven-agent-development(原英文phases/14-agent-engineering/30-eval-driven-agent-development/docs/en.md)。前置:第 15 章全部。
阅读完本节,你应当能够:
Agent 能过 demo,却以 demo 预测不到的方式在生产失败。基准回答「这个模型整体强吗」,不回答「我的产品里这个 Agent 在交付对的补丁吗」。这两者的鸿沟,只有评估能填——而且不是最后一次跑一下的评估,而是持续运行、驱动每个决策的外层循环。
紧循环:
这是 Self-Refine(第 05 节)的泛化。任何你在乎的 Agent 流,都可以包一层评估器-优化器来提可靠性。
第 15 章每一节都生成评估用例:
| 节 | 生成的评估用例 |
|---|---|
| 01 Agent 循环 | 预算耗尽、无限循环守卫 |
| 02 ReWOO | 工具失败时规划器正确重规划 |
| 03 Reflexion | 重试时学到的反思被应用 |
| 05 Self-Refine/CRITIC | 精炼后输出通过 judge |
| 06 工具使用 | 参数强制生效;未知工具被拒 |
| 07-10 记忆 | 检索引用匹配来源;过期事实失效 |
| 12 工作流模式 | 每种模式产出正确输出 |
| 13 LangGraph | 续跑精确复现状态 |
| 14 AutoGen Actor | DLQ 抓住崩溃的处理器 |
| 16 OpenAI Agents SDK | 护栏在对的输入上绊倒 |
| 17 Claude Agent SDK | 子智能体结果回到编排者 |
| 19-20 基准 | SWE-bench Verified 分、WebArena 成功率、OSWorld 效率 |
| 21 Computer Use | 每步安全抓住注入的 DOM |
| 23 OTel | span 发射必需属性 |
| 26 失败模式 | 检测器给已知失败打标 |
| 27 提示注入 | PVE 拒绝投毒检索 |
| 28 编排 | 监督者路由到对的专家 |
| 29 运行时形态 | DLQ 处理 N% 失败 |
如果你的评估套件为每一节都有用例,你就覆盖了第 15 章。
⚠️ 四种失败:① 无基线——没有「上次已知良好」的评估读不懂;存基线。② LLM-judge 无锚定——judge 也会幻觉;用 CRITIC 模式(第 05 节),judge 锚外部工具。③ 过拟合评估——为评估优化会偏离生产有用性(goodhart);轮换用例。④ 抖动评估——非确定性用例引起误报;钉种子、快照状态。
原课程 code/main.py 是一个标准库评估装置:
@dataclass class Case: name: str; category: str; inputs: dict; expected: Any BASELINE = load_json("eval_baseline.json") # 上次已知良好 def regression(case, current_score): return current_score < BASELINE[case.name] * 0.95 # 回归>5% 即标
def evaluator_optimizer(agent, case, max_rounds=3): output = agent.run(case.inputs) for r in range(max_rounds): verdict = judge(output, case.expected) if verdict.passed: return output, r output = agent.refine(output, verdict.feedback) # Self-Refine 泛化 return output, max_rounds # 未通过
def ci_gate(cases, agent): results = {c.name: evaluator_optimizer(agent, c) for c in cases} pass_rate = sum(r.passed for r in results.values()) / len(results) regressions = [n for n, r in results.items() if regression(n, r.score)] if pass_rate < THRESHOLD or regressions: return f"FAIL: pass_rate={pass_rate}, regressions={regressions}" return "PASS"
运行 python3 code/main.py 会输出每用例通过/失败、回归标志、CI 门裁决。
💡 设计要点:评估驱动开发的本质是把「好」从主观变成可量化、可回归检测。没有评估,你改提示是在黑暗里摸索——不知道改好了还是改坏了;有评估,每次改动都被客观度量。Anthropic 的「先简单、用评估优化、再上复杂」正是此理:评估让你敢于简化,因为你能立刻知道简化有没有伤到质量。
| 评估层 | 工具/基准 | 回答的问题 |
|---|---|---|
| 静态基准 | SWE-bench/GAIA/AgentBench/WebArena/OSWorld/BFCL | 这个模型整体强吗?跨模型比较 |
| 自定义离线 | Langfuse/Phoenix/Opik 的 LLM-judge + 执行 + 轨迹 | 我产品的 Agent 在交付对的输出吗? |
| 在线 | 会话回放、护栏告警、OTel 成本/延迟 | 生产里真实流量下表现如何? |
| 评估器-优化器 | Self-Refine 泛化 | 能否迭代到通过? |
原课程 outputs/skill-eval-suite.md:为一个 Agent 产品建三层评估套件,带 CI 门、回归追踪、基线管理、用例轮换策略。
接下来的第 31~42 节,我们进入本章的压轴主题——Agent 工作台(workbench)工程:为什么通用编码 Agent 在真实代码仓库上会失败,以及如何用最小工作台、指令约束、仓库记忆、初始化脚本、范围契约、运行时反馈循环、验证门、审查者 Agent、多会话交接,把一个能改真实仓库的工程级 Agent 从理想变成现实。下一节先诊断:模型在工作台上为何失败。