动作预算、迭代上限与成本治理


文档摘要

动作预算、迭代上限与成本治理 本节摘要:一个中型电商 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)。

学习目标

阅读完本节,你应当能够:

  1. 说出「钱包拒服务(Denial of Wallet)」的含义,并解释为什么自主 Agent 的坏循环是一张账单、而聊天机器人的坏回复只是一条坏回复。
  2. 列出成本治理栈的 12 层(max_tokens、每任务 token/美元预算、每工具上限、max_turns、滚动窗口、速度限制、分级路由、提示缓存、上下文窗口化、贵动作 HITL、kill switch),并说出每层抓哪类失败。
  3. 解释为什么一个上限不够:不同失败模式(失控循环/慢漏/坏发布/合理浪涌)需要不同时间尺度。
  4. 设计一条金融速度限制(如 10 分钟内超 50 美元即断),说明它如何比月度上限更快抓住循环。
  5. 把成本治理与权限阶梯(第 10 节)叠加:一个没有 max_budget_usdauto 会话是「无治理自主」。

一、问题与直觉

自主 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 # 分级路由

成本治理栈(12 层)

  1. 每请求 max_tokens:简单。防止任何单次调用发无界补全。
  2. 每任务 token 预算:整个运行不超过 N token,cap 处硬停。
  3. 每任务美元预算:同 token 但以货币计。Claude Code 的 max_budget_usd
  4. 每工具调用上限:不超过 N 次 WebFetch、N 次 shell_exec 等。
  5. 迭代上限(max_turns):Agent 循环总迭代数;防无限推理循环。
  6. 每分钟/小时/天/月上限:滚动窗口,在不同时间尺度抓漏。
  7. 金融速度限制:如「10 分钟内花费超 50 美元即断访问」。在月度上限触发前抓住循环式燃烧。
  8. 分级模型路由:默认小模型;仅当分类器判任务值得时升级到大模型。
  9. 提示缓存:系统提示与稳定上下文存在供应商缓存;重发 token 成本近零。
  10. 上下文窗口化:压缩/摘要,让活跃上下文低于阈值;直接降 token 成本。
  11. 贵动作的 HITL 检查点:在一个已知昂贵的动作(长工具调用、大下载、贵的模型升级)前,要求人点一下。
  12. 预算违反即 kill switch:任一 cap 触发则会话中止;cap 被记录;需单独重启用路径。

为什么是栈,不是一个 cap

单一个月度上限只在钱包空了后才抓住失控 Agent。单一每请求上限在会话级什么也抓不住。不同失败模式需要不同时间尺度:

  • 失控循环(Agent 卡在 5 秒重试):被速度限制抓。
  • 慢漏(Agent 每任务做约 2x 预期工作):被每日上限抓。
  • 坏发布(新版本用 5x token):被每周/月上限抓。
  • 合理浪涌(真实需求,非 bug):被小时/天上限抓,日志清晰。

harness 的预算面

Claude Code Agent SDK 暴露(公开文档):

  • max_turns——迭代上限。
  • max_budget_usd——美元上限;违反则会话中止。
  • allowed_tools / disallowed_tools——工具白/黑名单。
  • 工具使用前的钩子点,用于自定义成本核算。

与权限阶梯(第 10 节)叠加。一个没有 max_budget_usdautoMode 会话是无治理自主。Anthropic 明确把 Auto Mode 框定为需要预算控制;分类器与成本正交。

EU AI Act、OWASP Agentic Top 10

Microsoft 的 Agent Governance Toolkit 覆盖 OWASP Agentic Top 10 与 EU AI Act 第 14 条(人类监督)要求。对欧盟生产环境,日志与上限强制不是可选的

观察到的 1,200→4,800 案例

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 在迭代上限抓住它之前多花了多少」。

五、练习

  1. code/main.py:确认在轮询循环轨迹上速度限制先于迭代上限触发。关掉速度限制,量 Agent 在迭代上限抓住前「花」了多少。

  2. 为浏览器 Agent(第 11 节)设计一组每工具上限:哪个工具需要最紧的上限?哪个可以无界跑而无风险?

  3. 读 Microsoft Agent Governance Toolkit 文档,列出工具包命名的每种上限,把每种映射到一种失败模式(失控循环/慢漏/坏发布/浪涌)。

  4. 为一个真实任务(如「分诊仓库里 50 个 issue」)的隔夜无人值守运行定价:max_budget_usd 设在你的点估 2x。为 2x 说理。

  5. Claude Code 的 max_budget_usd 在会话聚合成本上触发:设计一条你会在外部强制的互补速度限制。什么触发断开?重启用长什么样?

本节要点回顾

  1. 钱包拒服务(Denial of Wallet):自主 Agent 的坏循环是一张账单,不是一条坏回复。
  2. 12 层治理栈:max_tokens、每任务 token/美元预算、每工具上限、max_turns、滚动窗口、速度限制、分级路由、提示缓存、上下文窗口化、贵动作 HITL、kill switch。
  3. 栈不是一个 cap:不同失败模式(失控循环/慢漏/坏发布/合理浪涌)需要不同时间尺度。
  4. 金融速度限制(如 10 分钟超 50 美元即断)比月度上限更快抓循环。
  5. 分级模型路由 + 提示缓存 + 上下文窗口化是降本单位成本的三件套。
  6. 与权限阶梯叠加:没有 max_budget_usdauto 会话是无治理自主;分类器与成本正交。
  7. EU AI Act 第 14 条 + OWASP Agentic Top 10:欧盟生产环境的日志与上限强制不是可选。
  8. 每加一个新工具 = 一个潜在新循环:每个新工具都要自己的上限和告警。
  9. 数学平凡,纪律才是失败点:这一节是工程课,不是数学课。

下一节,我们处理治理的硬停机制——kill switch、熔断器与金丝雀 token,看长程 Agent 如何在被检测到失行为时被快速止血,以及如何抓「每动作都批准、组合却失配」的语义级攻击。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U