实验 03 · 重试与停止状态机
对应第 08 章。本实验模拟瞬时恢复、持续失败和重复无效动作,观察不同停止机制何时介入。
1. 实验问题
max_turns 是最后保险,却不是唯一停止条件。瞬时错误适合有预算重试;同一失败反复出现说明策略没有获得新信息;持续失败最终应报告预算耗尽。三个情况都显示“失败”,但正确动作不同。
先选择最大轮数 8 和“重复同一错误”。预测系统会跑满八轮,还是被重复检测器提前停止。
2. 运行状态机
开启退避后,时间成本会逐轮增长,但本模拟不会真的等待。退避保护服务,不解决逻辑错误。对参数非法或权限拒绝使用指数退避,只会更慢地重复错误。
3. 分类结果
观察最终文案:
- complete 表示出现成功证据;
- repeat_guard 表示工具与结果没有信息增益;
- max_turns 表示预算耗尽;
- permission denied 在真实系统中应进入 blocked;
- interrupted 表示人类停止。
它们都属于 Thread 状态,不能只靠最终自然语言推断。
4. 幂等挑战
把模拟工具换成“创建 GitHub issue”。第一次请求已送达,但客户端超时。此时重试可能创建两个 issue。安全设计需要 operation_id 或先查询是否已创建,而不是仅增加等待。
列出你自己的 Agent 未来可能拥有的副作用工具,逐个标记:可安全重放、需要幂等键、绝不能自动重放。
5. 代码挑战
在 AgentState 中保存 recent_call_fingerprints。指纹由工具名和规范化参数生成,结果哈希另存。连续两次相同调用且结果相同,向模型注入重复警告;第三次进入 blocked。为文件读取加入版本信息,避免文件已经变化却被误判为无效重复。
完成后用 self-test 模拟三个场景,断言 stop_reason 准确。可靠循环必须能解释为什么停,而不只是终于不再运行。