动作预算、迭代上限与成本治理 本节摘要:一个中型电商 Agent 的月度 LLM 成本在团队启用「订单追踪」技能后从 1,200 美元跳到 4,800 美元。这不是定价 bug,而是一个找到了新循环、并在里面持续花钱的 Agent。业界把这个失败模式叫「钱包拒服务(Denial of Wallet)」——Agent 一直推理、一直调工具、一直计费,没什么停它,因为没人设计停它的东西。Microsoft 的 Agent Governance Toolkit(2026 年 4 月 2 日)把防御编成典:每请求 、每任务 token 与美元预算、每日/月上限、迭代上限、分级模型路由、提示缓存、上下文窗口化、贵动作的 HITL 检查点、预算违反即 kill switch。
本节摘要:一个中型电商 Agent 的月度 LLM 成本在团队启用「订单追踪」技能后从 1,200 美元跳到 4,800 美元。这不是定价 bug,而是一个找到了新循环、并在里面持续花钱的 Agent。业界把这个失败模式叫「钱包拒服务(Denial of Wallet)」——Agent 一直推理、一直调工具、一直计费,没什么停它,因为没人设计停它的东西。Microsoft 的 Agent Governance Toolkit(2026 年 4 月 2 日)把防御编成典:每请求
max_tokens、每任务 token 与美元预算、每日/月上限、迭代上限、分级模型路由、提示缓存、上下文窗口化、贵动作的 HITL 检查点、预算违反即 kill switch。Anthropic Claude Code Agent SDK 用不同名字出货同一组原语。金融速度限制(如 10 分钟内超 50 美元即断)比月度上限更快抓住循环。本节是工程课:数学平凡,纪律才是团队失败的地方。
对应原课程:Phase 15 · Lesson 13 ·
cost-governors(原英文phases/15-autonomous-systems/13-cost-governors/docs/en.md)。
阅读完本节,你应当能够:
max_tokens、每任务 token/美元预算、每工具上限、max_turns、滚动窗口、速度限制、分级路由、提示缓存、上下文窗口化、贵动作 HITL、kill switch),并说出每层抓哪类失败。max_budget_usd 的 auto 会话是「无治理自主」。自主 Agent 每轮都花真钱。聊天机器人的坏输出是一条坏回复;Agent 的坏循环是一张账单。业界把这个失败模式叫「钱包拒服务」——Agent 一直推理、一直调工具、一直计费,没什么停它,因为没人设计停它的东西。
修复不是一个数,而是不同时间尺度与粒度上的一栈上限:每请求、每任务、每小时、每天、每月。设计良好的栈在几分钟内抓住失控循环、几小时内抓住慢漏、一天内抓住坏发布。同一栈在 Agent 长程自主时还能保住任何预算。
这是一节工程课:数学平凡,纪律才是团队失败的地方。下面的限制清单在 Microsoft Agent Governance Toolkit 与 Anthropic Claude Code Agent SDK 文档里都有命名。
⚠️ 核心认知:单一个月度上限只在钱包空了之后才抓住失控 Agent;单一每请求上限在会话级什么也抓不住。不同失败模式需要不同时间尺度。
原课程 code/main.py 模拟一个有/无分层成本治理栈的 Agent 运行。模拟 Agent 在若干轮后漂移进轮询循环;分层栈在速度窗口内抓住它,而单一个月度上限要到几天后才触发。
def governance_check(state, budget): if state.turns >= budget.max_turns: return ABORT("turns") if state.cost_usd >= budget.max_budget_usd: return ABORT("budget") if state.tool_calls("WebFetch") > budget.per_tool["WebFetch"]: return ABORT("tool_cap") # 速度限制: 短窗口花费 if state.spend_in_window(minutes=10) > 50: return ABORT("velocity") return CONTINUE def route_model(task): return SMALL_MODEL if classifier.simple(task) else LARGE_MODEL # 分级路由
max_tokens:简单。防止任何单次调用发无界补全。max_budget_usd。WebFetch、N 次 shell_exec 等。max_turns):Agent 循环总迭代数;防无限推理循环。单一个月度上限只在钱包空了后才抓住失控 Agent。单一每请求上限在会话级什么也抓不住。不同失败模式需要不同时间尺度:
Claude Code Agent SDK 暴露(公开文档):
max_turns——迭代上限。max_budget_usd——美元上限;违反则会话中止。allowed_tools / disallowed_tools——工具白/黑名单。与权限阶梯(第 10 节)叠加。一个没有 max_budget_usd 的 autoMode 会话是无治理自主。Anthropic 明确把 Auto Mode 框定为需要预算控制;分类器与成本正交。
Microsoft 的 Agent Governance Toolkit 覆盖 OWASP Agentic Top 10 与 EU AI Act 第 14 条(人类监督)要求。对欧盟生产环境,日志与上限强制不是可选的。
Microsoft 文档里的真实案例:一个电商 Agent 月成本在加了新工具后翻三倍。该工具让 Agent 在每个会话期间轮询订单状态。无循环检测、无每工具上限、无周环比增长告警。修复是加每工具上限 + 日增长告警。这是个模板:每个新工具面都是一个潜在新循环;每个新工具都需要自己的上限和自己的告警。
| 失败模式 | 特征 | 由哪一层抓 |
|---|---|---|
| 失控循环 | 5 秒重试,几 分钟烧光 | 速度限制 |
| 慢漏 | 每任务 ~2x 工作 | 每日上限 |
| 坏发布 | 新版本 5x token | 每周/月上限 |
| 合理浪涌 | 真实需求,非 bug | 小时/天上限 + 清晰日志 |
| 无限推理 | 循环不退出 | max_turns |
| 单次爆长 | 一次补全无界 | max_tokens |
💡 设计守则:每加一个新工具,就加一个每工具上限和一条告警。没有这条纪律的团队,迟早会复刻 1,200→4,800 案例。
outputs/skill-agent-budget-audit.md 审查一个拟部署 Agent 的成本治理栈,标出缺失的层:有没有速度限制、每工具上限、贵动作 HITL、kill switch。它专门抓「有月度上限就以为安全、实则几分钟就被循环烧穿」的部署。
code/main.py 把分层栈每一层做成可开关,适合演示「关掉速度限制,Agent 在迭代上限抓住它之前多花了多少」。
跑 code/main.py:确认在轮询循环轨迹上速度限制先于迭代上限触发。关掉速度限制,量 Agent 在迭代上限抓住前「花」了多少。
为浏览器 Agent(第 11 节)设计一组每工具上限:哪个工具需要最紧的上限?哪个可以无界跑而无风险?
读 Microsoft Agent Governance Toolkit 文档,列出工具包命名的每种上限,把每种映射到一种失败模式(失控循环/慢漏/坏发布/浪涌)。
为一个真实任务(如「分诊仓库里 50 个 issue」)的隔夜无人值守运行定价:max_budget_usd 设在你的点估 2x。为 2x 说理。
Claude Code 的 max_budget_usd 在会话聚合成本上触发:设计一条你会在外部强制的互补速度限制。什么触发断开?重启用长什么样?
max_tokens、每任务 token/美元预算、每工具上限、max_turns、滚动窗口、速度限制、分级路由、提示缓存、上下文窗口化、贵动作 HITL、kill switch。max_budget_usd 的 auto 会话是无治理自主;分类器与成本正交。下一节,我们处理治理的硬停机制——kill switch、熔断器与金丝雀 token,看长程 Agent 如何在被检测到失行为时被快速止血,以及如何抓「每动作都批准、组合却失配」的语义级攻击。