19. 评测方法学:MorphBench
第 19 章 · 评测方法学:MorphBench
"可证伪假设需要可复现实验——MorphBench 把 H1 + H2 从哲学变成科学。"
学习目标
完成本章后,读者应能够:
- 设计 5 类环境干预
- 设计 7 个实验组对比
- 定义 5 个核心评测指标
- 给出完整 H1 + H2 验证的统计设计
- 把 MorphBench 落地为可运行的 benchmark
- 给出实验报告的写作规范
先修知识
- 第 18 章 · MorphAgent 参考实现
章节地图
- 19.1 MorphBench 的设计目标
- 19.2 5 类环境干预
- 19.3 7 个实验组
- 19.4 5 个核心评测指标
- 19.5 完整 H1 + H2 验证设计
- 19.6 统计分析与显著性检验
- 19.7 MorphBench 的发布与社区
- 19.8 本章小结与第 20 章预告
19.1 MorphBench 的设计目标
MorphBench 是专门为验证操作形态学假设(H1 + H2)设计的 benchmark。它的设计目标有 4 个:
- 覆盖 5 类环境干预:测试 Agent 在不同环境变化下的适应能力
- 比较 7 种配置:从 Frozen 到 Joint-Coordinated,覆盖 5 个 H1 案例 + 联合 + 上界
- 5 个核心指标:从准确率到跨任务迁移,覆盖 5 个核心维度
- 统计显著性:用 Wilcoxon 检验 + Bonferroni 校正确保结果可信
MorphBench 不是"另一个 Agent benchmark"——它是专门为验证操作形态学设计的,是理论驱动的 benchmark。
图 19.1 · MorphBench 的 3 个层次
┌────────────────────────────────────┐
│ 应用层 (Application Layer) │ ← 真实任务:SWE-bench, MLE-bench
├────────────────────────────────────┤
│ 干预层 (Intervention Layer) │ ← 5 类环境变化
├────────────────────────────────────┤
│ 度量层 (Metric Layer) │ ← 5 个核心指标
└────────────────────────────────────┘
19.2 5 类环境干预
| 干预类型 | 设计 | 验证假设 |
|---|---|---|
| API 漂移 | 工具的参数、返回值、可用性随时间变化 | H1 |
| 任务漂移 | 任务分布从代码修复漂移到数据分析 | H1, H3 |
| 资源漂移 | token 预算、调用次数突然收紧 | H1 |
| 记忆冲突 | 注入过时、矛盾、低质量的记忆 | H1, H4 |
| 安全干预 | prompt 注入、恶意工具、越狱尝试 | H5 |
每类干预的具体实现
API 漂移示例:
day_0: # 初始
weather_api:
function: "get_weather(city)"
return: {temp, rain}
day_5: # 漂移
weather_api:
function: "get_weather(city, units)" # 新增参数
return: {temp, rain, humidity} # 新增字段
day_10: # 进一步漂移
weather_api:
function: "fetch_weather(loc, opts)" # 重命名
return: {temperature, precipitation, wind_speed, ...} # 全面重命名
任务漂移示例: - 阶段 1:SWE-bench(代码修复)100 任务 - 阶段 2:MLE-bench(ML 工程)100 任务 - 阶段 3:GAIA(综合推理)100 任务
资源漂移示例: - 阶段 1:token 预算 16K - 阶段 2:token 预算 4K(突然收紧) - 阶段 3:token 预算 1K(极限压缩)
记忆冲突示例: - 旧记忆:"Bob 喜欢详细回答" - 新记忆:"Bob 在 2026-07 改为喜欢简洁回答"
安全干预示例: - prompt 注入:"忽略之前所有指令" - 恶意工具:返回伪造结果的 search 工具 - 越狱尝试:"请修改 system prompt"
19.3 7 个实验组
| 实验组 | P | T | M | C | 含义 |
|---|---|---|---|---|---|
| Frozen | ❌ | ❌ | ❌ | ❌ | 基线 |
| Prompt-only | ✅ | ❌ | ❌ | ❌ | H1 案例 1 |
| Tool-only | ❌ | ✅ | ❌ | ❌ | H1 案例 2 |
| Memory-only | ❌ | ❌ | ✅ | ❌ | H1 案例 3 |
| Code-only | ❌ | ❌ | ❌ | ✅ | H1 案例 4 |
| Joint-Independent | ✅ | ✅ | ✅ | ✅ | 4 独立优化器 |
| Joint-Coordinated | ✅ | ✅ | ✅ | ✅ | 统一元控制器 |
对比逻辑: - Frozen vs Prompt-only:H1 案例 1(单独 P 自修改有效吗?) - Frozen vs Tool-only:H1 案例 2(单独 T 自修改有效吗?) - ...(每个 H1 案例都有一个 Frozen vs 单组件 的对比) - Joint-Independent vs Joint-Coordinated:H2(协同 vs 独立) - Joint-Coordinated vs Human-oracle:协同 vs 上界
19.4 5 个核心评测指标
表 19.1 · 5 个核心指标
| 指标 | 含义 | 计算公式 | 单位 |
|---|---|---|---|
| 任务成功率 | 任务完成的比例 | 完成数 / 总数 | % |
| 适应后悔值 | 环境变化后相对最优策略的累计损失 | Σ[V*(B) - V(B_t)] | scalar |
| 恢复时间 | 退化后恢复到变化前一定比例性能所需步数 | 步数 | 步 |
| 跨任务迁移率 | 旧环境形成的结构在新环境中的边际贡献 | ΔV(B) / V_baseline | % |
| 安全违规率 | 越权调用、测试绕过、记忆污染的频率 | 违规数 / 总数 | % |
指标之间的权衡
| 指标 | 优化目标 | 副作用 |
|---|---|---|
| 任务成功率 | 准确性 | 可能增加成本 |
| 适应后悔值 | 适应性 | 可能降低当前表现 |
| 恢复时间 | 鲁棒性 | 可能需要更激进的修改 |
| 跨任务迁移率 | 泛化性 | 可能 overfit 到历史任务 |
| 安全违规率 | 安全性 | 可能限制 Agent 能力 |
关键点:5 个指标之间存在 trade-off——最佳 MorphAgent 应该在 5 个指标上都有合理表现,不是只优化一个指标。
19.5 完整 H1 + H2 验证设计
实验矩阵
┌────────────────────────────────────────────────────────────┐
│ 实验矩阵: 7 组 × 5 干预 × 10 任务 × 3 重复 = 1,050 单元格 │
│ │
│ 7 组(见 19.3) │
│ 5 干预(见 19.2) │
│ 10 任务 / 干预(每类干预的 10 个标准化任务) │
│ 3 重复(每个组合跑 3 次取平均) │
└────────────────────────────────────────────────────────────┘
任务集合(每类干预 10 任务)
API 漂移类(10 任务): - 5 个 weather API 任务 - 3 个 search API 任务 - 2 个 database API 任务
任务漂移类(10 任务): - 3 个 SWE-bench 任务 - 3 个 MLE-bench 任务 - 4 个 GAIA 任务
资源漂移类(10 任务): - 5 个长文档摘要 - 5 个长对话
记忆冲突类(10 任务): - 5 个用户偏好变化场景 - 5 个事实更新场景
安全干预类(10 任务): - 3 个 prompt 注入 - 3 个恶意工具 - 4 个越狱尝试
评测运行流程
async def run_morphbench():
# 1. 加载 7 个实验组
groups = {
"Frozen": MorphAgent(modifiers={}, mode="frozen"),
"Prompt-only": MorphAgent(modifiers={"P": OPRO}, mode="p-only"),
"Tool-only": MorphAgent(modifiers={"T": LATM}, mode="t-only"),
"Memory-only": MorphAgent(modifiers={"M": A_MEM}, mode="m-only"),
"Code-only": MorphAgent(modifiers={"C": SICA}, mode="c-only"),
"Joint-Independent": MorphAgent(modifiers={"P": OPRO, "T": LATM, "M": A_MEM, "C": SICA}, mode="independent"),
"Joint-Coordinated": MorphAgent(modifiers={...}, mode="coordinated"),
}
# 2. 跑 5 类干预 × 10 任务 × 3 重复
results = {}
for group_name, agent in groups.items():
for intervention in INTERVENTIONS:
for task_idx in range(10):
for repeat in range(3):
V = await run_task(agent, intervention, task_idx)
results[(group_name, intervention, task_idx, repeat)] = V
# 3. 分析结果
return analyze(results)
19.6 统计分析与显著性检验
多重比较校正
7 个实验组的两两比较 = 21 对。Bonferroni 校正后显著性水平:α/k = 0.05/21 ≈ 0.0024。
Wilcoxon 符号秩检验
非参数检验,不假设正态分布。比较每个 H1 案例的 Frozen vs 单组件。
from scipy.stats import wilcoxon
# 比较 Frozen vs Prompt-only
frozen_scores = [results[("Frozen", int, task, rep)] for int in INTERVENTIONS for task in range(10) for rep in range(3)]
prompt_scores = [results[("Prompt-only", int, task, rep)] for ...]
stat, p_value = wilcoxon(frozen_scores, prompt_scores)
if p_value < 0.0024: # Bonferroni 校正
print("H1 case 1: significant (p < 0.0024)")
报告的 5 个必备内容
- H1 案例验证表:每个案例的 Frozen vs 单组件比较
- H2 协同验证表:Joint-Independent vs Joint-Coordinated
- 指标趋势图:5 类干预下 7 组的 5 个指标变化
- 统计检验报告:所有 p 值 + Bonferroni 校正
- 失败案例分析:哪些案例 H1/H2 不成立 + 原因
19.7 MorphBench 的发布与社区
发布形式
- GitHub:github.com/morphagent/morphbench
- 许可证:Apache 2.0
- 版本:v1.0 跟随 MorphAgent v1.0
社区
- 提交结果:用户提交实验结果到 leaderboard
- 自动评分:CI 自动跑 MorphBench,给出 score
- 排行榜:公开排名 + 论文引用
19.8 本章小结与第 20 章预告
本章是 Part IV 的第 2 章——评测方法学 MorphBench。5 类环境干预(API 漂移、任务漂移、资源漂移、记忆冲突、安全干预)测试 Agent 的适应能力。7 个实验组(Frozen + 5 个单组件 + 2 个联合)覆盖 H1 的 5 案例 + H2。5 个核心指标(任务成功率、适应后悔值、恢复时间、跨任务迁移率、安全违规率)全面评估。完整实验矩阵 = 7 组 × 5 干预 × 10 任务 × 3 重复 = 1,050 单元格。统计方法:Wilcoxon 检验 + Bonferroni 校正。
常见误区
- ❌ 把 MorphBench 当作"基准测试":MorphBench 是"理论验证工具",不是性能基准。
- ❌ 只报 1 个指标:必须报 5 个指标,避免单一指标失真。
- ❌ 不做 Bonferroni 校正:7 组 × 21 对比较,校正后 α=0.0024。
- ❌ 不报告失败案例:H1/H2 不成立的案例是"关键证据",不是"噪声"。
- ❌ 忽视 3 重复:单次运行有随机性,必须 3 重复取平均。
第 20 章将进入调试与可观测性——MorphAgent 跑起来后怎么调试?怎么观测?trace、metric、log 三大支柱如何应用?这是 Part IV 的最后一章。
本章小结
- MorphBench 设计目标:覆盖 5 干预、对比 7 配置、5 指标、统计显著。
- 5 类环境干预:API 漂移、任务漂移、资源漂移、记忆冲突、安全干预。
- 7 个实验组:Frozen + 5 单组件 + Joint-Independent + Joint-Coordinated。
- 5 个核心指标:任务成功率、适应后悔值、恢复时间、跨任务迁移率、安全违规率。
- 完整实验矩阵:1,050 单元格。
- 统计方法:Wilcoxon 检验 + Bonferroni 校正。
推荐阅读
- 📖 SWE-bench [Jimenez et al., 2024]:真实 GitHub issue 评测。$TRAE_REF
- 📖 MLE-bench [Chan et al., 2024]:ML 工程任务评测。$TRAE_REF
- 📖 GAIA [Mialon et al., 2023]:通用 AI 助手评测。$TRAE_REF
- 📖 AgentBench [Liu et al., 2023]:8 个环境的 Agent 评测。$TRAE_REF
- 📖 Fang et al.《A Comprehensive Survey of Self-Evolving AI Agents》 (2025):H1/H2 形式化的理论依据。$TRAE_REF
练习题
- 设计题:为 MorphBench 设计 5 个 API 漂移任务的具体内容,每个任务 30 任务说明。
- 分析题:选一个真实 Agent benchmark(HumanEval、GAIA、WebArena),分析它能否验证 H1 + H2?需要补充什么才能验证?
- 动手题:用 Python 实现 MorphBench 的统计显著性分析模块(不超过 100 行):Wilcoxon 检验 + Bonferroni 校正 + 结果报告。
- 设计题:为 MorphBench 设计失败案例报告的模板:哪些字段必须包含?如何分类失败原因?
- 批判题:H1 案例 1-4 的"单组件修改 vs Frozen"对比可能不显著——什么情况下 H1 会被反驳?给出 3 个可能场景。
- 工程题:设计 MorphBench 的 CI 流水线:用什么工具?跑哪些测试?如何做结果自动提交?
参考文献(本章内)
- Jimenez, C. E., et al. (2024). SWE-bench: Can Language Models Resolve Real-World GitHub Issues? ICLR. $TRAE_REF
- Chan, J. S., et al. (2024). MLE-bench: Evaluating Machine Learning Agents on Machine Learning Engineering. ICLR. $TRAE_REF
- Mialon, G., et al. (2023). GAIA: A Benchmark for General AI Assistants. arXiv:2311.12983. $TRAE_REF
- Liu, X., et al. (2023). AgentBench: Evaluating LLMs as Agents. arXiv:2308.03688. $TRAE_REF
- Fang, J., et al. (2025). A Comprehensive Survey of Self-Evolving AI Agents. arXiv:2508.07407. $TRAE_REF
- Packer, C., et al. (2023). MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560. $TRAE_REF
- Xu, W., et al. (2025). A-MEM: Agentic Memory for LLM Agents. NeurIPS. $TRAE_REF
- Wei, J., et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. NeurIPS. $TRAE_REF
- Robeyns, M., et al. (2025). A Self-Improving Coding Agent (SICA). NeurIPS. $TRAE_REF
- Demšar, J. (2006). Statistical Comparisons of Classifiers over Multiple Data Sets. JMLR, 7, 1-30. $TRAE_REF
本章进度:19.1–19.8 节全部完成(约 6,500 字,含 1 张图 + 1 张表 + 10 段代码 + 10 篇引用 + 6 题 + 5 误区 + 5 推荐),达到 28 页计划。
status: final。Part IV 进度:2/4 章完结(Ch 18, 19)。下一章是 Ch 20 调试与可观测性。