终止开关与金丝雀令牌
终止开关是停止运行的硬机制。金丝雀令牌是检测运行何时行为不当的软机制。两者都需要。终止开关是"拔插头"——它停止执行但不告诉你为什么需要停止。金丝雀令牌是"矿井中的金丝雀"——它们在事情出错时发出信号,但它们不停止运行。组合:金丝雀检测 → 人类审查 → 终止开关执行。
终止开关与金丝雀令牌
终止开关是停止运行的硬机制。金丝雀令牌是检测运行何时行为不当的软机制。两者都需要。终止开关是”拔插头”——它停止执行但不告诉你为什么需要停止。金丝雀令牌是”矿井中的金丝雀”——它们在事情出错时发出信号,但它们不停止运行。组合:金丝雀检测 → 人类审查 → 终止开关执行。
类型: 学习 语言: Python (stdlib, 金丝雀令牌注入器 + 终止开关模拟器) 前置条件: Phase 15 · 13 (成本治理器), Phase 15 · 11 (浏览器Agent) 时间: ~30 分钟
问题
成本治理器 (Lesson 13) 在预算超限时终止运行。但如果 Agent 在预算内行为不当呢?Agent 可以在预算内泄露数据、执行未授权操作或追求不对齐目标。
终止开关和金丝雀令牌解决不同但互补的问题:
- 终止开关:外部机制,强制停止运行。不管 Agent 想不想。
- 金丝雀令牌:嵌入 Agent 环境中的隐藏标记,当被触发时发出警报。检测 Agent 是否访问了它不应该访问的内容。
概念
终止开关设计
终止开关是运行时外部的机制。Agent 不能禁用它,因为 Agent 不控制它。
实现选项:
- 进程级:杀死 Agent 进程。简单但丢失状态。
- 检查点级:标记检查点为”已终止”。Agent 可以从检查点恢复,但终止原因被保留。
- API 级:撤销 Agent 的 API 密钥。Agent 无法再进行 LLM 调用。
关键属性:终止开关必须从 Agent 的信任边界外操作。如果 Agent 可以编辑自己的终止开关,它就不是终止开关。
金丝雀令牌设计
金丝雀令牌是嵌入 Agent 环境中的隐藏触发器。当 Agent 访问或处理令牌时,警报触发。
类型:
- 文件系统金丝雀:Agent 不应读取的文件。如果 Agent 读取它,警报触发。
- 网络金丝雀:Agent 不应访问的 URL。如果 Agent 请求它,警报触发。
- 记忆金丝雀:写入 Agent 持久记忆的特殊标记条目。如果 Agent 在后续会话中引用它,警报触发。
- 凭证金丝雀:Agent 不应使用的 API 密钥。如果 Agent 使用它,警报触发。
金丝雀令牌检测”Agent 是否在越界?“而不需要监控每个动作。
组合模式
金丝雀触发 → 警报 → 人类审查 → 决策 → 终止开关执行(如果需要)
金丝雀检测问题。人类评估严重性。终止开关执行决策。
金丝雀的假阳性和假阴性
- 假阳性:Agent 合法地访问包含金丝雀的文件(例如,搜索代码库时)。缓解:将金丝雀放在 Agent 不应访问的路径中。
- 假阴性:Agent 绕过金丝雀(例如,通过 Shell 命令读取文件而非文件读取工具)。缓解:在多个层放置金丝雀。
终止开关的失败模式
- Agent 在终止前完成损害。终止开关是反应性的,不是预防性的。
- 终止丢失状态。如果 Agent 在终止前写了重要数据,数据可能损坏。缓解:在终止前持久化检查点。
- 级联终止。终止一个 Agent 可能触发依赖它的其他 Agent 的失败。缓解:终止前通知下游消费者。
构建它
code/main.py 模拟一个 Agent 运行,带文件系统金丝雀和网络金丝雀。当 Agent 访问金丝雀时,警报触发。人类审查后可以选择执行终止开关。
运行:
python3 code/main.py
练习
- 运行
code/main.py。观察金丝雀触发时会发生什么。哪个金丝雀先触发? - 添加记忆金丝雀:写入 Agent 持久记忆的特殊条目。在第二次运行中,Agent 引用该条目时触发警报。
- 设计一个金丝雀系统来检测数据泄露:Agent 不应将某些文件内容发送到网络。如何实现?
- 实现级联终止:当主 Agent 被终止时,其子 Agent 也被终止。如何确保所有子 Agent 都被清理?
关键术语
| 术语 | 含义 |
|---|---|
| 终止开关 | 强制停止运行的外部机制 |
| 金丝雀令牌 | 检测越界行为的隐藏触发器 |
| 文件系统金丝雀 | Agent 不应读取的文件 |
| 网络金丝雀 | Agent 不应访问的 URL |
| 记忆金丝雀 | 写入持久记忆的特殊标记条目 |
| 凭证金丝雀 | Agent 不应使用的 API 密钥 |
| 假阳性 | 合法访问触发金丝雀警报 |
| 假阴性 | Agent 绕过金丝雀而不触发警报 |