给 n8n 智能体加上防重、限额与急停
文章提出在每次模型调用和外部操作前设置守卫,通过动作哈希与 Postgres 台账检查重复请求、客户月度费用和每小时操作量。任一检查失败即停止流程并告警,以控制重试、循环和无人值守运行的风险。
AI 深度解读
凌晨 3 点,Agent 给 400 位客户发错邮件,问题可能不在模型,而在执行链路没有刹车。原文提出:在每次 LLM 调用和对外操作之前,加一道统一检查,拦住重复动作、预算超支和失控循环。
这套方案适合用 n8n 编排 AI 工作流的开发者。它把「让 Agent 自己小心」变成可检查的执行规则。不过,原文给的是设计骨架,并没有交付一套能直接上线的完整实现。
为什么检查要放在每次动作之前
原文引用了几条社区讨论:凌晨发错 400 封客户邮件的帖子有 48 条评论,睡觉期间自动创建 83 张工单的帖子有 13 条评论。另外,还有人在询问如何按客户和项目记录 LLM 成本,以及如何监控大量生产 n8n 工作流。
这些是问题线索,不是作者的实测结果。评论数量也不能证明事故有多普遍。
作者把共同原因归为三类:重试没有幂等保护,循环没有频率上限,支出没有按客户记账。
幂等性(Idempotency)解决的是:同一个动作重复提交,业务结果仍然只发生一次。对于发邮件、建工单这类操作,网络超时后重试,不能简单等同于「再执行一遍」。
限制必须覆盖每次实际执行,包括重试和循环中的动作。
作者建议在每次 LLM 调用和对外操作前统一检查:生成动作的幂等键、查重、检查客户当月累计 LLM 支出、检查每小时动作数。任一检查失败,就停止工作流并告警。
一张 Postgres 表能解决哪些问题
作者用 Postgres 保存动作账本,给出的建表语句如下:
CREATE TABLE IF NOT EXISTS guard_actions (
idempotency_key CHAR(64) PRIMARY KEY,
client_id TEXT NOT NULL,
project TEXT,
action_type TEXT,
month CHAR(7) NOT NULL,
cost_usd NUMERIC(12,6) DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW()
);
重点是 idempotency_key 的主键约束,它能阻止重复键写入。client_id、month、cost_usd 则为按客户统计月度支出提供基础。
但「表里不能重复」不等于「邮件不会重复发送」。原文没说明动作如何规范化后再哈希,也没说明插入账本与执行动作的先后顺序。先发邮件再记账,中途失败可能重复发送;先记账再发邮件,中途失败又可能漏发。上线时仍需补齐状态与失败恢复逻辑。
预算检查也有并发问题:多个工作流可能同时读到尚有余额,然后一起放行。原文没有提供事务或预算预占方案。
调用前的成本估算公式是:
(input_tokens × input_price + max_tokens × output_price) / 1,000,000
其中,输入 token 数用字符数除以 4 近似估算,输出按 max_tokens 估算。调用完成后,再用服务商返回的实际 usage 修正账目。字符数除以 4 只是粗估,对中文输入尤其不能当作精确计费依据。
接入容易,运行承诺还缺证据
部署方面,原文列出 Railway、小型 Hetzner 主机上的自托管 n8n 加 Postgres,以及 n8n Cloud。Make.com 也可以用 Data Store 保存账本;LangChain、CrewAI 则可以在有副作用的工具执行前,通过 tool 或 HTTP webhook 调用检查。
作者声称,每个动作增加一次带索引的 Postgres 读取和一次插入,同机部署通常只需几毫秒。但没有给测试环境、负载或延迟分布,应把它视为经验估计。
原文还用了 $0 到 $5 的部署费用表述,却没说明计费周期、资源规格及费用范围,不能直接当作生产预算。
标题中的 Kill Switch,正文实际只描述了检查失败后停止工作流并告警,没有给出人工总开关、停止在途任务或统一关闭多个工作流的实现。
我的判断
我认同把执行限制独立于模型判断。提示词可以要求 Agent 谨慎,但去重、预算和频率上限需要执行层强制落实。
这是一份有用的检查清单,还不是经过验证的生产方案。
相比只看日志和事后监控,执行前检查能提前拦截一部分风险;但相比完整的任务队列与状态管理方案,它还缺动作状态、并发控制和恢复机制。作者也没给对照数据,无法据此判断事故减少了多少,或者吞吐量受了多大影响。
能拿来做什么
- 给 n8n 的邮件发送、工单创建节点加统一检查,并确认自动重试与循环都经过它。
- 为 LLM 调用记录
client_id、项目、月份和成本,调用前估算,调用后用实际 usage 校正。 - 在 Node 或 Agent 工具封装层集中接入检查,让 LangChain、CrewAI 的对外操作经过同一入口。
- 上线前模拟重复提交、并发放行和动作成功后记账失败,验证实际结果,并补上可人工触发的停止入口。