☰
Agent 不能全托管:哪些环节必须加人工确认闸门
2026/10/14 3:44:06 网站建设 项目流程

授权与合规声明
本文为原创技术分享,所有示例代码均运行于作者自建的隔离环境,仅供学习交流。文中涉及的第三方模型与服务以各自官方文档为准,请在服务条款范围内使用。转载请保留出处。

一、为什么全自动容易翻车

1. 全自动的"顺畅"是一种假象

把 Agent 接上工具、给一句目标,它就能自己查资料、调接口、改数据、发消息。演示里它一路绿灯,看起来比人还稳。但"顺畅"往往只是因为在低风险的节点上跑了无数次,而真正危险的节点——写库、删资源、转账、对外发消息——一次都没被触碰到,或者只触达了测试环境。

一旦把 Agent 放进真实业务流,它要面对的是不完整的上下文:上游数据错了、用户需求表达模糊、工具返回了意料之外的结构。这时候"自动续跑"反而成了放大器——错误被一步步固化,等到有人注意到,数据库里就多了一堆脏数据,或者外部系统收到了不该发的请求。

2. 翻车的共同特征:敏感节点零确认

我复盘过几类典型的线上事故(公开案例与团队内部复盘),它们有一个高度一致的特征:在不可逆、出域、或花钱的动作之前,没有任何人工确认闸门。Agent 拿到了写权限,就一路写;拿到了发送权限,就一路发;拿到了删除权限,就把东西清掉了。

问题的根源不是 Agent “不够聪明”,而是我们把"是否智能"当成了唯一的设计判据。一个很聪明的 Agent 同样会在错误前提上自信地犯错。智能决定的是"能不能做",而"该不该在没确认的情况下做"是另一回事。

3. 本文的判据:三轴而非"是否智能"

本文给出的判据很简单:不要问"这个节点需不需要智能",而要问三个独立的问题——

  • 这个动作是否可逆?
  • 这个动作是否出域(数据或动作离开受控环境)?
  • 这个动作是否花钱?

任一轴命中"高风险",就该在它前面挂一道人工确认闸门。这就是全文的主线,后面几章都是围绕这三轴展开。

二、三轴风险分级法

1. 轴一:是否可逆

可逆动作指"做错了能原样撤回"。比如读一次数据库、调用一个纯查询接口、在草稿区生成一份文档。这类动作即使出错,代价也低,通常不需要人工确认。

不可逆动作指"做错了没法干净地撤销"。比如删除一条生产记录、提交一笔转账、向外部群发消息。这类动作一旦执行,影响就扩散了,必须在前一步加闸门。

判断可逆性时有个坑:很多人以为"我们有备份所以可逆"。但恢复备份本身有成本,而且恢复点之后的所有新数据都会受影响。所以"有备份"不等于"可逆",只能降低不可逆的代价。

2. 轴二:是否出域

出域指数据或动作离开了你完全可控的环境。读自己内网的数据库不算出域;把内部客户名单发到外部群聊算出域;调用第三方付费 API,把我们的请求内容送到了对方服务器,也算某种程度出域。

出域之所以危险,是因为控制权交出去了。你没法撤回已经发出去的一条消息,也没法要求第三方"忘了"你传过去的数据。所以出域动作天然偏向"需要确认"。

3. 轴三:是否花钱

花钱是最容易被忽略的一轴。很多 Agent 接了按调用次数计费的模型 API、按条数计费的短信通道、按算力计费的云服务。单次看着不贵,但 Agent 一旦在循环里反复调用,或者因为逻辑错误疯狂重试,账单会迅速失控。

花钱动作的风险在于:它往往是"高频 + 低单价 + 累积可见",所以很容易被设计者漏掉闸门。建议把"任何会产生费用的调用"单独列为一类高危节点。

三、哪些节点必须人工

1. 写库与状态变更

凡是修改持久化状态的动作——插入订单、更新库存、改用户资料——都属于写操作。其中删除、覆盖、批量更新风险尤其高。这类节点前的确认闸门,本质上是在问人:“这条数据真的要这样改吗?”

实践中建议给写库动作分级:单条普通更新可视情况走自动;批量更新、删除、涉及金额或权限字段的写入,必须卡人工。

2. 发消息与调用外部 API

发消息(邮件、IM、短信)和调用外部 API 同时命中"出域"和"可能花钱"两轴。一条群发错群的消息,撤回了也会被看见;一个写错参数的外部调用,会在对方系统里留下副作用。

这里的人工确认不只是"要不要发",更应该让人看清"发给谁、发什么内容、调哪个接口、传了什么参数"。把这些信息在确认界面上摆清楚,比单纯一个"确认"按钮有用得多。

3. 删资源与高花费动作

删除云资源、释放存储、终止服务实例、发起支付,这些动作的不可逆性和花费都很高。它们是闸门的最高优先级位置。

一个常被低估的点:高花费动作不限于"付款"。长时间占用昂贵算力、启动大量并行任务,同样在烧钱。只要动作的边际成本不为零,就该纳入第三轴的审视。

四、approve 闸门怎么设计

1. 轮询式

最简单的形态:Agent 跑到关键节点先停下来,把"待确认"状态写进存储,然后等待。一个外部看板或定时任务周期性地检查有没有待处理的确认项,人在界面上点"通过/拒绝",Agent 再继续或中止。

# 伪代码:轮询式 approve 闸门defrun_step(node):ifnode.requires_approval:save_pending(node)# 写入待确认队列whileTrue:decision=poll_decision(node.id)# 轮询人工决定ifdecision=="approve":breakifdecision=="reject":raiseHalt("人工拒绝,流程中止")sleep(interval)execute(node)

轮询式实现成本低,适合内部工具,缺点是实时性一般,确认延迟取决于轮询间隔。

2. 回调式

更及时的做法是回调:Agent 在关键节点触发一个待办事件,人在审批系统里操作后,审批系统通过回调 URL 通知 Agent 继续。这避免了空转轮询。

# 回调式闸门配置示例approval:node:send_external_messagenotify:channel:webhookurl:https://your-internal-system/approve-callbacktimeout:3600# 超时未确认则自动拒绝on_timeout:reject

回调式对基础设施要求略高,需要 Agent 侧能接收外部通知,并且处理好"通知丢失/重复"的情况。

3. 消息驱动式

在团队协作场景里,把待确认事项直接推到 IM(如企业微信、飞书、Slack)最常见。人在聊天里回复"通过"或"拒绝",Agent 解析消息后继续。它的好处是确认入口就在人日常工作的地方,门槛最低。

⚠️ 代码待验证

# 示意:向 IM 推送待确认卡片(参数请替换为你的实际配置)curl-XPOST"https://your-im-gateway/notify"\-H"Authorization: Bearer$api_key"\-d'{"node":"delete_resource","text":"确认删除以下资源?"}'

无论哪种形式,闸门的核心契约不变:在危险动作执行前,把决定权交回人;人的决定是流程继续或中止的唯一开关。

五、可恢复工作流

1. 状态机建模

人工确认带来一个问题:Agent 不能"一直占着线程等人点"。正确做法是把流程建模成状态机——每个节点是一个状态,approve 是一个需要外部事件才能离开的状态。

状态机要保证两点:一是状态收敛,不会卡死;二是从任意已持久化的状态都能继续,不会出现"内存里的进度丢了就再也回不来"。

2. 状态持久化

把工作流的执行状态(当前节点、上下文、待确认项)写到持久化存储,而不是只放在进程内存。这样即使 Agent 进程重启、机器宕机,也能从存储里读回进度。

{"run_id":"demo_run","current_node":"send_external_message","status":"awaiting_approval","context":{"to":"group-x","body":"..."},"pending_since":"2026-10-13T10:20:00Z"}

3. resume 续跑

人批准后,系统用同一个 run_id 从断点 resume,而不是重新从头跑一遍。这既能省 token,也能避免"前面做过的动作被重复执行"——重复执行本身就可能制造新的出域或花费。

# 伪代码:从断点续跑defresume(run_id):state=load_state(run_id)# 读回持久化状态assertstate.status=="approved"node=state.current_nodewhilenode:node=execute(node)# 从断点继续执行save_state(state)# 每步落地

这份资料是什么:把第五章的状态机与持久化思路,整理成一份可直接改造你现有流程的可恢复工作流骨架。放在资料包里,扫码即可获取:

六、误用与过度确认

1. 每个步骤都让人点是反模式

HITL 不是"每一步都问人"。如果每读一次数据库、每生成一个中间结果都要人点一下,人会迅速疲劳,确认变成机械的"一路通过"——这反而比全自动更危险,因为给人一种"有人看着"的错觉。

确认的稀缺性就是它的价值。只在三轴命中的节点确认,确认才有意义。

2. 确认疲劳与误点

当确认项过多、信息又展示不清时,人会为了赶进度直接点通过。缓解办法有二:一是减少确认数量,只卡真高危;二是让确认界面展示"这个动作到底会改变什么",而不是只给一个抽象的"是否继续"。

3. 把确认放在对的地方

确认应该放在"动作即将产生不可逆/出域/花费影响"的前一刻,而不是动作之后补救。事后确认基本没用——东西已经发出去了。也要注意不要把确认塞进一个没人会去看的后台页面,那等于没有闸门。

七、落地清单

1. 接入前清单

  • 列出 Agent 能调用的全部工具,逐一看它是否写数据、是否出域、是否花钱。
  • 给每个工具按三轴打分,标出高危节点。
  • 确认这些高危节点当前是否已有任何确认机制;没有就补。

2. 设计期清单

  • 高危节点前是否挂了 approve 闸门?
  • 闸门是轮询/回调/消息哪种?超时如何处理?
  • 工作流状态是否持久化?进程重启能否 resume?
  • 确认界面是否清楚展示"会改变什么"?

3. 上线后清单

  • 是否记录每一次人工确认的决定与上下文,便于回溯?
  • 是否监控"确认被拒绝"的频率,反过来优化节点分级?
  • 花费类节点是否有预算上限与熔断?

这份资料是什么:把第七章的落地清单和前面几章的闸门实现,汇总成一份可照着做的检查表与代码骨架。放在资料包里,扫码即可获取:

附表 A:本文引用事实与出处对照表

本文结论依据 / 出处本文位置
自主式 Agent 在不可逆动作前应保留人工 oversight人机协同(Human-in-the-loop)为通用工程实践,公开资料广泛收录;具体表述以各团队规范为准第一章、第三章
按"可逆 / 出域 / 花费"三轴给节点分级,比按"是否智能"更稳本文提出的方法框架,属作者工程经验归纳,未引用到具体公开基准第二章
写库、发消息、调外部 API、删资源、高花费节点应加人工确认与主流 Agent 安全设计建议一致;具体分级阈值因业务而异第三章、第四章
可恢复工作流应把状态持久化并支持 resume 续跑工作流引擎与状态机持久化是成熟工程模式;本文为应用层适配第五章
过度确认会导致确认疲劳、降低闸门有效性人因工程常识;本文结合落地经验给出第六章
截至 2026-10-13,公开资料中尚未有统一的"HITL 节点分级标准"待验证附表 A

附表 B:术语速查表

术语含义
Human-in-the-loop(HITL)在自动化流程的关键节点引入人工决策,人作为流程的开关
三轴分级用"是否可逆 / 是否出域 / 是否花钱"三轴评估节点风险
出域数据或动作离开受控环境,控制权外移
approve 闸门在危险动作前暂停、等待人工通过或拒绝的机制
可恢复工作流把执行状态持久化,支持从断点续跑的流程设计
resume 续跑人批准后从原断点继续执行,而非从头重跑
确认疲劳确认项过多导致人机械通过、闸门失效

写在最后:这篇用到的资料

写这篇文章时,我把 Agent 人机协同的风险分级表、approve 闸门伪代码和可恢复工作流骨架都整理了一遍,顺手也整理了几份配套的东西:

  • Agent 风险分级表:按可逆/出域/花费三轴给节点定级。
  • approve 闸门参考实现:在关键节点挂人工确认的代码骨架。
  • AI 大模型学习路线:从应用落地到工程化的系统路径。

资料是我自己整理的,放在下面这个码上,扫码即可获取:



资料较多,建议先看「全套 AGI 大模型学习路线」,再挑一个实战项目跟练。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询