跳到主要内容

动手实验 · 把机制做成可验证产物

用三个可复现的标准库 Python 实验,把 Loop 恢复、工具门禁和 Context 压测从阅读结论变成工程验收。

本章任务

要回答的问题

我应该先用哪一个实验,把当前最危险的 Agent 机制变成可检查产物?

读完你能

  • 按失败成本选择 Loop、Tool 或 Context 实验
  • 用统一格式记录故障注入、预期结果和证据
  • 把实验结果映射回对应专题与源码入口
适合现在读
读过一两个专题、准备开始实现或评审 Agent 运行时的工程师
先修知识
能运行 Python 3.11 或更高版本;理解 Tool Call 与 JSON 事件的基本形态
实践产物
一条实验路线、一份验收报告模板,以及三个可直接运行的脚本
证据边界
这些实验验证机制和不变量,不代表任何模型、Provider 或生产环境的性能结论

先选最可能让你的 Agent 出事故的机制

Section titled “先选最可能让你的 Agent 出事故的机制”

不要从最有趣的实验开始。先回答:当前系统失败一次,损失最大的是哪一条边界?

当前风险先做哪个实验你要证明什么
工具已经执行,进程却在结果落盘前退出Lab 01 · Loop 恢复同一 operation_id 不重复副作用,Verifier 从正确检查点继续
用户批准了一个动作,执行时参数却发生变化Lab 02 · Tool GateSchema、Policy 与批准令牌共同约束那一次具体动作
Context 快满,压缩后忘了约束或信任了恶意文件Lab 03 · Context Pressure受保护片段不丢失,不可信来源被扫描,压缩保留来源

三项实验都故意不调用真实模型,也不依赖第三方包。先把 Harness 的确定性边界跑通,再接入模型变量。

三项实验怎样组成一条学习路线

Section titled “三项实验怎样组成一条学习路线”

运行时路线:先读 Agent LoopSession Lifecycle,再完成 Lab 01。你会得到一条能回答“工具到底执行过没有”的事件时间线。

安全路线:先读 Tool SystemPermissionsSandbox,再完成 Lab 02。你会得到一个参数漂移和令牌重放都绕不过的执行门。

上下文路线:先读 Context SystemMemory,再完成 Lab 03。你会得到一张随窗口占用率变化的保留、压缩、淘汰与阻断记录。

每项 Lab 最后都提交同一类报告,避免只写“跑通了”:

{
"lab": "01-loop-recovery",
"failure_injected": "after_effect_before_result",
"expected_invariant": "duplicate_effects == 0",
"observed": {
"exit_reason": "injected_crash",
"duplicate_effects": 0,
"resumed_checkpoint": "effect_committed"
},
"evidence": ["events.jsonl", "effect-ledger.json"],
"remaining_risk": "external service must expose idempotency or commit lookup"
}

报告里至少有:故障点、不变量、观测值、证据文件和仍未解决的边界。没有证据文件的“成功”不算通过。

从项目根目录运行全部自检:

Terminal window
pnpm labs:check

也可以单独下载并运行:

脚本默认把临时结果写到 .agent-mechanics-lab/。这些目录不应提交;应提交的是你整理后的实验报告、关键事件和对真实系统的迁移说明。

实验代码把网络、模型和数据库都替换成确定性模拟,这不是为了简化结论,而是为了隔离变量。迁移时按顺序替换:

  1. 保留事件 Schema、操作 ID 和验收断言。
  2. 把模拟副作用替换成一个有测试环境的真实工具。
  3. 把固定输入替换成模型产生的 Tool Call。
  4. 重跑同一故障矩阵,比较新增失败属于模型、协议还是外部系统。

如果接入模型后无法继续复现原实验,先恢复确定性版本,不要同时调 Prompt、Policy 和持久化协议。

完成标准:留下能被别人复核的机制证据

Section titled “完成标准:留下能被别人复核的机制证据”

一项 Lab 只有同时满足以下条件才算完成:

  • 自检命令退出码为 0;
  • 至少触发一次预定失败,而不是只跑 Happy Path;
  • 能指出哪一个文件或事件证明不变量成立;
  • 能写出从实验到自己产品的一个迁移差异;
  • 能说明实验没有覆盖什么。

下一步不是做更多 Lab,而是把其中一个断言接进你自己的 CI 或故障注入套件。

展开六个自查问题
  1. 这项实验模拟的最坏副作用是什么?
  2. 哪个状态是事实来源,哪个只是索引或界面?
  3. 故障应该落在哪两个持久化动作之间?
  4. 通过条件是否能由代码判断,而不是由模型自评?
  5. 哪个结果文件能让另一位工程师独立复核?
  6. 接入真实模型以后,新增了哪些不可控变量?