介绍了在生产环境中运行AI Agent时,通过风险分级赋予模型不同权限的设计模式,避免human_in_the_loop二元论的局限性。
当人们谈论"AI Agent"时,通常指的是两者之一:要么是一个建议你该做什么的聊天机器人,要么是一个拿着 API Key、闷头执行的脚本。前者安全但无用。后者有用——直到某天早上它悄无声息地做了一件代价高昂的事。
我所在的团队做了一个在真实广告账户上运行的 Agent——每小时都有真实的预算、真实的资金在流动。这种约束迫使我们很早就面对一个问题:如何在不完全交出控制权的前提下,把执行权交给模型?
我们最终采用的模式叫"渐进式自主权"(graduated autonomy),我认为它完全可以泛化到广告以外的领域。
大多数 Agent 框架给你的是一个二元开关:human_in_the_loop=True 或者 False。要么审批每一个工具调用,要么一个都不批。
大多数时候,两种设置都是错的:
"审批所有操作"在一周内就会变成走过场。没人会去看第 40 个确认对话框。你建立的不是监督的幻觉,压根就不是监督。
"不审批任何操作"在模型做出一个看起来合理但实际上是灾难性的操作之前都运转良好——然后你只能在提供商日志里重建究竟发生了什么。
真正的问题在于:二元开关把每一个操作都视为同等风险。暂停一个花费了 12 美元、零转化的关键词,和重构一个广告系列,是截然不同的决策。信任不是布尔值,控制开关也不应该是。
Level 0 OBSERVE Agent 观察并报告发现,不执行任何操作。
Level 1 RECOMMEND Agent 提出一个具体变更建议,由人工手动应用。
Level 2 APPROVE Agent 做好变更准备,人工点击批准,Agent 执行。
Level 3 AUTOPILOT Agent 在声明的动作边界内直接执行。
重要的不是这四个级别,而是级别是按范围(scope)而非按系统来划分的。新账户从 0 级开始。运营商在连续两周阅读 Agent 的发现并认同其判断后,升到 1 级。一旦准备好的变更多次在无需编辑的情况下被批准,就升到 2 级。而某一类特定操作——比如暂停花费低于某一阈值且零转化的关键词——可以在其他操作仍保留 2 级的同时升到 3 级。
最后这一点比什么都重要。你不是在提拔"Agent",你是在为这个账户下的这个操作类型、在这些边界内授予权限。这更像是授予一项许可,而不是信任一个同事。
@dataclass(frozen=True)
class ActionEnvelope:
action_type: str # "pause_keyword"
scope: str # "account:1234"
max_level: int # 3
bounds: dict # {"max_daily_spend_delta": 50.0}
def resolve_level(action, envelopes) -> int:
match = next(
(e for e in envelopes
if e.action_type == action.type and e.scope == action.scope),
None,
)
if match is None:
return 0 # unknown action -> observe only
if not within(action, match.bounds):
return min(match.max_level, 2) # out of bounds -> demote to approval
return match.max_level
注意这个失败模式:一个无法识别的操作不会报错阻塞,也不会被执行。它会被降级。Agent 仍然做自己的工作,只是人类会先看到它。未知意味着"先问",而不是"崩溃"。
这是团队最容易跳过的部分,也是让其他部分真正可用的部分。
每一个执行的操作都必须携带产生它的推理过程——不是事后通过问模型"你为什么这么做"生成的事后解释(那是虚构),而是从中做出决策的真实输入。
{
"action": "pause_keyword",
"target": "kw:88213",
"level_used": 3,
"envelope": "pause_keyword@account:1234",
"observed": {
"spend_7d": 43.10,
"conversions_7d": 0,
"impressions_7d": 2210,
"account_cpa_target": 35.0
},
"rule_fired": "zero_conv_over_cpa_target",
"reverted_by": null,
"ts": "2026-08-20T09:14:22Z"
}
两个属性是硬性要求:
可回放。 给定 observed 数据,你可以重新运行决策并得到相同输出。如果做不到,你有的就不是日志——只是日记。
可逆。 每一个自主操作都要指明其逆操作。reverted_by 初始为 null,在人工提出异议时填充。
回滚率是我们追踪的最有价值的指标。它同时是晋升信号和降级信号。如果人类对某一操作类型的回滚率低于百分之几,该操作类型就准备好升一级。如果在平台变更后回滚率飙升,操作类型会自动降级。信任变成可衡量的,而非声称的。
在 1 级,Agent 被迫生成一个足够具体、可以让人类手动应用的变化。这一约束消灭了模糊输出。"考虑优化您表现不佳的广告系列"不具可操作性。"暂停关键词 X,它在 7 天内花费了 43 美元,而 CPA 目标是 35 美元,转化数为零"才具可操作性。3 级所需的纪律性反过来提升了 1 级的输出质量。
而当确实出了问题时,问题是可以回答的。不是"AI 做了点什么",而是:这个操作,在这个级别,来自这个 envelope,基于这个数据,在这个时间戳——这是批准它的人,或者这是为什么没有人工在执行路径中。
这就是能在生产系统上运行的 Agent 和 Demo 之间的区别。
我们将这一设计构建进了 Soku,一个在 Google、Meta、TikTok 和 ChatGPT Ads 上运行广告系列的 Agent。领域是广告,但以上所有内容都不是广告特有的——如果你的 Agent 涉及基础设施、计费、客户数据,或任何"一个糟糕的下午代价高昂"的场景,同样的四个级别都适用。
很好奇其他人在做什么。如果你已经交付了一个有执行权的 Agent,你是如何划分其权限范围的?