AI Agent直接写CRM/工单系统时,95%准确率在规模化下会制造大量脏数据且用户会彻底放弃信任;提出将决策与副作用分离、加人工审批门的架构模式。
大多数 AI Agent demo 在 Agent 做出决定的那一刻就结束了。真正有意思的工程工作才刚刚开始——那之后,Agent 会向别人依赖的系统写入数据。
我构建的自动化系统会向 CRM、工单系统和收入团队的收件箱写入数据。这些都是记录系统(systems of record)。一次错误的写入不是一个可以重新生成的糟糕答案。它会变成一张支持工单、一份被污染的预测数据,或者一封客户已经读过的邮件。
下面这个模式,是我在生产环境中摸爬滚打后幸存下来的。
朴素的设计是给 Agent 凭证,让它直接调用 API。
大多数时候这能正常工作。大多数时候不出问题——这就是问题所在。当动作准确率达到 95% 时,每二十次写入就有一次是错的,而这些错误的写入会累积成人类用来做决策的数据库。每次错误写入的清理成本远远高于每次正确写入节省的时间,所以自动化在指标上看起来是成功的,但实际上已经变成净负收益。
二级失效(second order failure)更糟糕。一旦用户发现了两三条错误的记录,他们就会不再信任整个数据集,然后退回使用电子表格。现在你多了一个没人信任的系统。
把决策和副作用分开。Agent 永远不会触碰目标 API。它发出一个提议动作(proposed action),然后由一个单独的执行器在审批后才应用它。
{
"action_id": "act_01H8Z...",
"type": "crm.opportunity.update",
"target": { "system": "salesforce", "object": "Opportunity", "id": "0061..." },
"diff": {
"StageName": { "from": "Discovery", "to": "Proposal" },
"CloseDate": { "from": "2026-10-31", "to": "2026-11-30" }
},
"evidence": { "source": "call_2291", "quote": "let us aim to get paperwork out next month" },
"status": "pending_approval",
"idempotency_key": "call_2291:opp_0061:stage"
}
向审查者展示 from 和 to。人类大约两秒就能审批或拒绝一个 diff。没有人会真正审查原始 JSON payload,所以如果你展示的是 payload,你实际上构建了一个所有人都会机械通过的审批步骤——这和没有门槛是一样的。
每个提议的变更都携带生成它的引用或来源。这才是让审查快速的原因,也是六周后当有人问为什么某个字段变了时,让审计日志有用的东西。
审批是异步的,人类会双击。从源事件加上目标字段派生键,这样重放就是一次空操作,而不是重复的工单。
存储 from 值,而不只是 to。每个已应用的动作都有一个反向操作。Undo 把一个可怕的自动化变成了人们真正愿意保持开启的系统,而且一旦你捕获了 diff,实现它几乎是不花成本的。
不要在注定会失败的动作上浪费人类的注意力。在一个动作进入审批队列之前,先对它进行目标系统验证。字段是否存在?下拉列表值是否合法?记录是否仍然存在?该用户是否有对这个记录的写权限?
大多数糟糕的提议不是判断错误。它们是 schema 错误,而 schema 错误是很容易用代码捕获的。
提议、证据、审查者、决定、时间戳、应用结果和反向操作。如果你能从一张表里回答"谁批准的,基于什么,我怎么撤销",你就能通过安全审查,也能调试生产环境。
不要记录产生该动作的原始客户内容,除了特定的证据引用。你需要的是交互模式和决策,而不是客户数据的影子副本。
这比完全自主运行每个动作要慢,但这是正常的。审查一个 diff 是廉价的。在一次糟糕的自动写入后恢复信任是昂贵的,而且通常你根本没有机会。
自主运行是 demo 看起来很酷的部分。门槛才是决定这个系统六个月后是否还在开启状态的部分。
我在 Mindlyft 为收入团队构建这个模式,Agent 起草通话后的 CRM 更新、工单和跟进邮件,然后由人类在一切发送出去之前审批。