Skip to content

12 · 人机协作

审批、中断与恢复

📚 系列导航:这是《Agent 开发进阶》的第 12 篇(共 24 篇)。上一篇给 agent 的代码执行戴上了沙箱手套,这一篇解决另一半安全问题——哪些操作必须停下来问人,以及怎么问得不烦人。下一篇:13 · 多模态输入

做 agent 的人都在两头摇摆:全放权,怕它半夜发错一封邮件;全都问,用户等于多雇了个只会请示的下属。我两头都踩过——放权版闯过祸,请示版被用户三天就关掉了。这不是技术难题,是产品设计题:审批是一套按风险分级的门禁,不是一个开关。这一篇只干一件事:给你的 agent 装一道审批门,把"暂停-等待-恢复"做成重启也不丢的状态机。

看完这一篇,你会拿到:

  • 一张"必须过人"的三类操作清单,对着自己的工具列表就能打勾
  • 一个审批门状态机的最小实现(状态持久化是底线)
  • 一套打扰预算分配方案:高危同步问、中危批量问、低危事后报
  • 跑通"通过/拒绝/超时"三条审批路径的动手验收

01 哪些操作必须过人

判据不看操作大小,看错误成本能不能收回。三类必过人:不可逆操作(删除、覆盖、格式化)、花钱(下单、转账、买资源)、对外发送(邮件、消息、发布内容——发出去就收不回)。就像银行:小额取款 ATM 自助,大额转账要柜员当面核身——不是不信任,是错误成本差几个量级。落地:把工具清单拉出来逐个标注,三类之内挂审批门,之外默认放行。

💡 一句话总结:审批名单按"错误能不能撤销"划,不按"操作重不重要"划。

02 审批门状态机:暂停、等待、恢复

审批门本质是个状态机:任务跑到高危动作前暂停,落库一条待审请求并通知人,等待——通过则恢复执行,拒绝则取消并把原因回给模型,超时走默认路径。铁律只有一条:状态必须持久化。存内存里,进程一重启,等待中的任务就人间蒸发。

人机协作:审批分级与状态机

python
# 伪代码:审批门,先落库再等人
def approval_gate(action):
    req = db.save(action, state="PENDING")  # 持久化,重启不丢
    notify(user, req.id)
    state = wait_decision(req.id, timeout_s=3600)
    if state == "APPROVED": return execute(action)
    if state == "REJECTED": return feedback(req.reason)
    return escalate(req)                    # 超时→升级而非静默丢弃

预期输出:三条路径各有去向,重启后 PENDING 请求仍在库里等人。

💡 一句话总结:暂停-等待-恢复三步都要落库,审批门是数据库工程不是 if 语句。

03 打扰预算:全都问=没有自动化

场景:你给每个操作都加了确认弹窗,用户第一天认真看、第二天无脑点、第三天关掉 agent。打个比方,请示频率决定下属好不好用:什么都请示和什么都不请示的,你都不敢用。落地分三级:高危(01 节三类)同步确认,不批不动;中危(批量修改、长任务)攒批一次确认;低危只留事后报告。再给条信任升级路径:某类操作连续两周零否决,自动降一级。

💡 一句话总结:打扰是预算,花在错误成本最高的地方,其余用报告代替提问。

04 升级路径:卡住时体面求助

agent 卡住时最糟的两种表现:静默失败和死循环重试。体面的求助要一次说清三件事:卡在哪(哪一步、什么报错)、试过什么(免得人重复给已试过的建议)、需要什么决策(给两三个选项,别出开放题)。

💡 一句话总结:求助信息 = 卡点 + 已试方案 + 待选决策,一条消息问完。

05 动手:发邮件前的审批门

任务:① 给"发送邮件"工具套上 02 节的审批门;② 演练三条路径:通过(邮件发出)、拒绝(原因回给模型改稿重申)、超时(1 小时无人响应,标记待处理并升级);③ 中途 kill 掉进程再重启,确认待审请求还在。

验收标准:三条路径的日志各一份,外加一次重启测试——重启后 PENDING 请求可继续审批,这条是硬门槛。

两种结果都正常:三条全通说明状态机成立,抽成通用封装套到其他高危工具;如果超时路径没触发或重启后请求丢了,九成是状态没真正落库、还躺在内存里——这个 bug 现在暴露比上线后便宜一百倍。

06 小结

你现在应该能:给工具清单按错误成本分级、实现可持久化的审批状态机、用打扰预算换用户长期留存、让 agent 卡住时体面求助。

人机协作管住了"做不做",下一篇解决"看不看得见"——13 · 多模态输入:让 agent 读懂截图、单据和图表。


📎 实战案例

某团队的 agent 起初所有操作都弹审批,用户第三天关掉了它。改成按风险分级后,日均审批请求从 40 多条降到 3 条以内;又把审批状态从内存挪进数据库,重启后待审任务零丢失——全都问=没有自动化。

踩坑

  • 我所有操作都弹审批,用户第三天关掉了 agent——打扰预算是真实约束,分级后日均打扰从 40 次降到个位数。
  • 审批状态存内存,一次例行重启后十几个等待中的任务人间蒸发——持久化不是优化项,是底线。
  • 我设了审批门却忘了给超时配默认路径,一条请求挂了 48 小时没人管——超时必须有去向:升级或取消。