19. 评测方法学:MorphBench

第 19 章 · 评测方法学:MorphBench

"可证伪假设需要可复现实验——MorphBench 把 H1 + H2 从哲学变成科学。"

学习目标

完成本章后,读者应能够:

  1. 设计 5 类环境干预
  2. 设计 7 个实验组对比
  3. 定义 5 个核心评测指标
  4. 给出完整 H1 + H2 验证的统计设计
  5. 把 MorphBench 落地为可运行的 benchmark
  6. 给出实验报告的写作规范

先修知识

章节地图


19.1 MorphBench 的设计目标

MorphBench 是专门为验证操作形态学假设(H1 + H2)设计的 benchmark。它的设计目标有 4 个:

  1. 覆盖 5 类环境干预:测试 Agent 在不同环境变化下的适应能力
  2. 比较 7 种配置:从 Frozen 到 Joint-Coordinated,覆盖 5 个 H1 案例 + 联合 + 上界
  3. 5 个核心指标:从准确率到跨任务迁移,覆盖 5 个核心维度
  4. 统计显著性:用 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 个必备内容

  1. H1 案例验证表:每个案例的 Frozen vs 单组件比较
  2. H2 协同验证表:Joint-Independent vs Joint-Coordinated
  3. 指标趋势图:5 类干预下 7 组的 5 个指标变化
  4. 统计检验报告:所有 p 值 + Bonferroni 校正
  5. 失败案例分析:哪些案例 H1/H2 不成立 + 原因

19.7 MorphBench 的发布与社区

发布形式

社区

19.8 本章小结与第 20 章预告

本章是 Part IV 的第 2 章——评测方法学 MorphBench5 类环境干预(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 的最后一章。


本章小结

推荐阅读

练习题

  1. 设计题:为 MorphBench 设计 5 个 API 漂移任务的具体内容,每个任务 30 任务说明。
  2. 分析题:选一个真实 Agent benchmark(HumanEval、GAIA、WebArena),分析它能否验证 H1 + H2?需要补充什么才能验证?
  3. 动手题:用 Python 实现 MorphBench 的统计显著性分析模块(不超过 100 行):Wilcoxon 检验 + Bonferroni 校正 + 结果报告。
  4. 设计题:为 MorphBench 设计失败案例报告的模板:哪些字段必须包含?如何分类失败原因?
  5. 批判题:H1 案例 1-4 的"单组件修改 vs Frozen"对比可能不显著——什么情况下 H1 会被反驳?给出 3 个可能场景。
  6. 工程题:设计 MorphBench 的 CI 流水线:用什么工具?跑哪些测试?如何做结果自动提交?

参考文献(本章内)

  1. Jimenez, C. E., et al. (2024). SWE-bench: Can Language Models Resolve Real-World GitHub Issues? ICLR. $TRAE_REF
  2. Chan, J. S., et al. (2024). MLE-bench: Evaluating Machine Learning Agents on Machine Learning Engineering. ICLR. $TRAE_REF
  3. Mialon, G., et al. (2023). GAIA: A Benchmark for General AI Assistants. arXiv:2311.12983. $TRAE_REF
  4. Liu, X., et al. (2023). AgentBench: Evaluating LLMs as Agents. arXiv:2308.03688. $TRAE_REF
  5. Fang, J., et al. (2025). A Comprehensive Survey of Self-Evolving AI Agents. arXiv:2508.07407. $TRAE_REF
  6. Packer, C., et al. (2023). MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560. $TRAE_REF
  7. Xu, W., et al. (2025). A-MEM: Agentic Memory for LLM Agents. NeurIPS. $TRAE_REF
  8. Wei, J., et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. NeurIPS. $TRAE_REF
  9. Robeyns, M., et al. (2025). A Self-Improving Coding Agent (SICA). NeurIPS. $TRAE_REF
  10. 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 调试与可观测性