
本文手把手讲清楚:为什么"加个审批按钮"不等于安全治理,以及如何用最小权限 + 动作矩阵 + 审计回滚,给 Agent 真正装上护栏。适合正在落地 AI Agent 的工程师和负责人。
前言:一个被高估的"安全按钮"
很多团队做完 Agent,最后一步是:“高风险动作加个人工审批,完事。”
听起来稳妥,实际上埋雷。我们见过最典型的事故:一个退款 Agent,审批流看着很完善,结果上线后审批人疲劳盲签,一笔 ¥3,800 的错退就出去了。复盘时审批人说:“我以为系统已经筛过风险了。”
这句话值得贴在每一个做 Agent 权限的人工位上:审批不会思考,它只是把责任从系统推给了一个正在赶工的人。
真正的企业 Agent 权限管理,要让审核人看到证据、意图、工具调用、影响范围和可逆性,同时把 Agent 能看的数据和能动的动作都框死。下面按步骤来。
步骤一:把权限拆成读 / 写 / 资金三把锁
这是最基础也最常被忽略的一条。
- 读(read):查订单、看政策。错了顶多答错,代价≈0。
- 写(write):改状态、建工单。错了人工可改回。
- 资金(fund):退款、改预算。错了钱出去了。
错误做法:一个 token 同时有 orders:read 和 refund:issue,理由是"都要用"。正确做法:三个独立 token,Agent 按动作挑对应的用。
read_token: [orders:read, policy:read]
write_token: [ticket:create, status:update]
fund_token: [refund:issue] # 必须带 approver_id + idempotency_key
步骤二:把权限写进工具签名,不写进提示词
提示词是给人看的,工具签名才是系统执行的边界。这是最小权限能不能落地的分水岭。
@tool(scope="read-only", market="US")
def lookup_refund_policy(order_id: str): ...
@tool(scope="fund", required=["approver_id", "idempotency_key"])
def issue_refund(order_id, amount, approver_id, idempotency_key): ...
即使模型被越狱,issue_refund 缺参直接拒绝。工具层不依赖模型乖不乖。
步骤三:分阶段发 token,先只读两周
最稳的节奏:
- Phase 1 只读:只发 read_token,Agent 跑两周,把"想做的动作"记成
proposed日志,不落库。 - Phase 2 受限写:逐个开 write_token,每个动作配审批档。
- Phase 3 资金:最后开 fund_token,强制双签 + 幂等。
跳过 Phase 1 直接全开,然后用审批兜底,是事故的起点。
步骤四:动作分三档

按"是否可逆 + 金额上限"分:
- 自动档:查询、草稿、建工单。错了重来。
- 单人审批档:改状态、非资金通知、低风险设置。可逆。
- 双人审批档:退款、改预算、删数据、跨市场写。资金或不可逆,四眼原则。
判断标准一句话:做错了 5 分钟内能否无损撤回?不能就别自动跑。
提醒:改广告预算比一次退款更隐蔽。退款立刻报警,预算被悄悄改可能三天后才露馅。资金边界不能只看"是否直接转账"。
步骤五:审批页渲染五类证据
有效的企业 Agent 权限管理,审批页要一次性给审核人:
- 意图:哪条消息/政策触发?
- 证据:看了哪些数据,可点溯源?
- 工具调用:调哪个工具、传什么参数?
- 影响范围:动多少钱、几个订单、哪个市场?
- 可逆性:点批准之后还能撤吗、怎么撤?
缺一样就是盲签。审批质量取决于喂了多少证据,不是加了多少按钮。
步骤六:四道防线 deny / retry / rollback / audit
def execute(action):
if not has_evidence(action): # deny
raise Denied()
if action.idempotency_key in seen: # retry 安全
return seen[action.idempotency_key]
result = call_tool(action)
seen[action.idempotency_key] = result
audit.log(trace_id=action.trace_id, approver=action.approver_id) # audit
return result
def rollback(trace_id):
compensations[trace_id]() # reverse / snapshot / soft-delete
- deny:证据不足/超权限,系统直接拦。
- retry:幂等键防重复副作用。
- rollback:退款冲正、预算快照、删除软删+回收站。
- audit:每次调用带 trace_id,串起决策/参数/审批人/时间。
没有幂等键的 retry 是灾难,没有快照的 rollback 是空话,没有 trace_id 的 audit 是甩锅。
步骤七:用动作矩阵沉淀权限
| 动作 | 分级 | 角色 | 上限 | 证据 | 审批 | 幂等键 | 回滚 |
|---|---|---|---|---|---|---|---|
| 查询订单 | 读 | Agent | 无 | 无 | 系统 | query_id | 无 |
| 生成建议 | 读(出) | Agent | 无 | 政策版本 | 系统 | draft_id | 无 |
| 创建工单 | 写 | Agent | 低 | 订单+原因 | 系统 | ticket_id | 关工单 |
| 修改状态 | 写 | Agent+1 | 中 | 原/新+依据 | 单人 | op_id | 还原 |
| 发起退款 | 资金 | Agent+2 | ≤¥500单/>¥500双 | 订单+政策+时效+确认 | 双人 | refund_id | 冲正 |
| 改广告预算 | 资金 | Agent+2 | 日预算封顶 | 旧/新+理由 | 双人 | budget_id | 快照还原 |
每周复盘:审批人离职?上限半年没调?动作从"单人"偷升"自动"?
步骤八:避开五个失效模式
- 审批疲劳:高低风险混排,真人变橡皮图章。
- 共享账号:一群 Agent 共用 admin token,出事分不清谁。
- 不可回滚:删库、发外邮、改全局,点了不可逆。
- 日志不全:只记"调了什么",不记"凭什么、谁批的"。
- 权限漂移:业务变了权限没变,临时写权限忘了收。
独家观点:治理最小单位是动作,不是模型
行业谈治理总盯"模型安不安全"。但企业真正要审计的是动作——它看了什么、调了什么、改了什么、能否恢复。沙盒里对答如流 vs 能改你广告预算,风险不在一个量级。决定量级的是动作不是模型。把治理下沉到动作层,每个动作配齐角色/上限/证据/审批/幂等键/回滚,模型再抽风也被框在小格子里。
亚马逊场景提示
运营 Agent 能碰查 BSR、改竞价、调预算、读评论、代发邮件。建议:
- 实时数据(价格/排名/广告位/评论)交给 Amazon Data API 提供"看"的事实;
- 任何改后台的动作走最小权限 token + 双人审批 + 幂等键 + 回滚。
亚马逊政策随市场/季节/类目剧烈变化,外部事实统一从可信数据层拉,至少"基于哪版政策决策"可追溯,避开权限漂移。
第二现场:被悄悄改掉的广告预算
退款事故一眼就能看见,因为它立刻报警。更隐蔽的是预算被悄悄改。
有个团队把"改广告预算"分级在"写"而不是"资金",理由是"只是调个数字,不直接转账"。结果一次策略误判,把某 ASIN 日预算从 ¥200 顶到 ¥2000,连烧三天才在周报发现。三天 × ¥1800 ≈ ¥5400 无声损耗,还不算转化浪费。
两个教训:第一,资金边界不能只看"是否直接转账",任何"会烧钱"的动作都要双签 + 回滚;第二,不可回滚动作靠审批追不回来,必须靠快照分钟级止损。把预算当"写"是第二常见的权限事故源。
90 天落地排期(照抄可用)
- 第 1–2 周(只读):只发 read_token,Agent 跑
proposed日志,不落库。看清它想碰什么。 - 第 3–6 周(受限写):逐个开 write_token,配审批档与五证据审批页。先开可逆动作。
- 第 7–10 周(资金 + 回滚):开 fund_token,强制双签 + 幂等键 + 回滚,trace id 串全链路。
- 第 11–12 周(周审):动作矩阵进周会,清离职审批人、收临时写权限。
把前 6 周压成"上线即全开",等于把事故也压进了前 2 周。
自检清单(上线前 10 问)
- 读/写/资金是三个 token 吗?
- 权限在工具签名还是只在提示词?
- 第一阶段只读吗?
- 每动作审批档写清了吗?
- 审批页展示意图/证据/调用/影响/可逆性了吗?
- 每动作有幂等键吗?
- 每可逆动作有回滚吗?
- 每次调用有 trace id 吗?
- 有不可回滚动作混进自动档吗?
- 动作矩阵本周复盘了吗?
答不上 3 个,先别让 Agent 碰资金。
成本账
5 万咨询量/月的运营,盲签导致 10% 误动作,5% 变 ¥50 投诉 = ¥12,500/月、¥150,000/年;加 10 复核人力 ¥500 万。治理代价 = 一个兼职 owner + 周脚本。放任才是最贵的方案。
五个误区
- “有审批就安全”——审批是责任转移,不是边界。
- “模型乖就不会乱动”——边界在工具层,不靠模型。
- “预算不是资金”——会烧钱必须进资金档。
- “记了调用就够了”——还要证据、审批人、trace id。
- “配一次永久有效”——权限会漂移,必须周审。
强监管行业额外要求
金融/医疗/政务还要两层:职责分离(SoD)有书面留痕,审计师逐项核;外部实时事实来自可信数据层,不让 Agent 自己抓网页猜政策。像 Amazon Data API 这种实时数据层,价值是把"基于哪版政策决策"变成可举证事实。
治理健康度看什么
别只看"有没有审批"。盯五个数:审批拒绝率(长期 0 说明形同虚设)、平均审批耗时(过长=证据不够)、不可回滚动作占比(趋近 0)、trace id 覆盖率(必须 100%)、权限漂移次数(周审问题数)。这五个比"我们加了审批"诚实得多。
审批页前后对比:同一笔退款,两种页面
坏的页面:“Agent 请求退款 ¥3,800,是否批准?” 好的页面:意图(买家说货损)、证据(订单 A 已签收;政策 v2025 30 天窗口可退)、工具调用(issue_refund 3800 市场 US)、影响范围(1 单 ¥3,800)、可逆性(24h 内可冲正)。同一个动作,两种决策。坏页面产出盲签,好页面产出真实判断,也常常产出证据不足时的果断"拒绝"。
反模式清单
- 审批人写进提示词:软请求,模型可忽略。
- 共享 admin token:出事分不清谁。
- 日志只记动作名:不记证据、审批人、trace id。
- “模型拒绝了"当"安全”:拒绝 ≠ 已验证边界。
- 小额定额自动批:仍在训练盲签习惯。
人的一面:让审批人买账
最快毁掉治理的是淹没审批人。两招:把"影响范围"高亮,让高危动作从安全动作里跳出来;把"拒绝"做成一键。审批人相信页面给了该看的东西,审批质量才上得去、疲劳才下得来。治理是人际系统,为人而设计。
把治理写进 PRD:给工程团队的最小检查单
上面这些机制如果只存在文档里,上线一周就走样。落地最稳的办法是把它写进 PRD,变成工程团队改不掉的硬约束。我们给客户的 PRD 模板里永远有一节"权限与回滚",强制填四项:① 这个 Agent 第一次上线只允许 read_token,写与资金权限默认关闭;② 每个会改业务状态的动作,必须写出它的证据字段、审批档、幂等键与回滚函数,缺一项 PRD 打回;③ 外部事实(政策版本、价格、排名)统一来自可信数据层,禁止 Agent 自己抓网页;④ 周审动作矩阵进迭代评审,每次发版前确认没有权限漂移。
这节最大的好处是"甩锅"变"对账"。出了问题,翻开 PRD 就知道是设计漏了回滚,还是上线偷偷开了自动档,而不是互相猜。它也让新人或外包接入时,按同一套语言讨论权限,不至于每人一套"我的 Agent 我信任"标准。治理真正落地,靠的是把边界写进 PRD 这种无聊的地方,而不是靠谁在会上拍胸脯说"我信它"。
落地小结:治理不是按钮,是系统
把上面这些串起来,企业 Agent 权限管理就是一套可重复的机制:分级的动作、每次审批都亮证据、每个动作带幂等键、每个可逆动作有回滚、每次调用有 trace id,并且每周复盘一次。它不是一个"批准"按钮,而是一套让"批准"这两个字终于有意义的系统。做到这些,Agent 才从玩具变成能托付业务的同事。
总结
企业 Agent 权限管理治的是"责任",不是"开关"。当"批准"不再是盲签、出错一定能撤、出事查得到谁,Agent 才从玩具变同事。
系列前作:客服 Agent 拒答能力、端到端集成、Agent 不是交付单位、项目管理 Agent 系统集成、AI 转型 SOP 还是进入流程、企业 AI 知识库为什么会失效。有疑问欢迎评论区交流。

335

被折叠的 条评论
为什么被折叠?



