给 n8n AI 工作流建立逐项成本账本
文章区分搭建工作流时的助手开销与运行时模型调用费用,并给出按输入、输出令牌计算单次成本的方法。结合按工作流归账的账本模式和浏览器计算器,可追查定时任务的费用来源。
完整中文译文
定时运行的 workflow 往往悄无声息。没人点击,也就没人盯着,但它们每天都会调用几次模型,而每次调用都明码标价。一个月后账单来了,剩下的唯一问题就是:“到底是哪个 workflow 花了这些钱?”这篇文章会用你能亲手核对的计算公式、一个按 workflow 归集费用的简单账本方案,以及一款在浏览器里完成计算的免费计算器,回答这个问题。
我一直在维护一套面向沙龙和诊所的 n8n workflow 包。在自动化相关的讨论里,我反复看到同一种困惑:大家发现 AI 开销上涨,就开始猜原因。先测量。下面是完整的方法。
两个计费表同时在跑
动手计算之前,先把开销分成两类,因为它们的解决办法不同:
构建阶段开销。 也就是你在连接节点时使用的应用内助手。它在你调试时运行,而不是在 workflow 执行时运行。订阅可以给这部分开销设定上限。
运行阶段开销。 也就是定时运行或由 webhook 触发的 workflow 内部那些 AI 节点。这部分开销随执行次数增长,订阅并不能改变它。
如果账单的大头来自第一个计费表,就购买能封顶的订阅。如果大头来自第二个计费表,接下来的内容就是为你准备的。
每次运行中,一次 AI 调用的费用为:
(prompt tokens x price in + completion tokens x price out) / 1,000,000
因此,整个 workflow 的费用为:
cost per run = AI calls per run x the line above + other metered cost per run
cost per month = runs per day x 30 x cost per run
最终结果由三个乘数决定:workflow 的触发频率、每次调用处理的 token 数量,以及你选择的模型。下面采用每 100 万 token 的大致公开标价,也是我的计算器内置的默认价格;请把它们改成你实际支付的价格:
示例 A:每日摘要
每次运行调用三次 AI,分别负责总结、分类和格式化;每天运行一次,每次调用包含 2,000 个 prompt token 和 500 个 completion token。
同样的工作量,价格却相差 16.7 倍,因为模型带来的价格倍数会叠加到每一次调用上。每月一美元不是什么问题。这个示例只是用来建立一个比较基准。
示例 B:每 15 分钟对回复进行分流
每次运行调用一次 AI,包含 800 个 prompt token、120 个 completion token,每天运行 96 次。这种运行方式很容易让人低估费用。
单次运行的数字看起来微不足道:0.0042 美元,还不到半美分。但定时执行会让它变成每年 145 美元,而用小模型完成同样的分流,每年只需 6.64 美元。这 21.9 倍的差距,与 Flash 相比则是 32.8 倍,就是按 workflow 归集成本的全部商业价值:没有测量过,就无从判断该选多大的模型。
这些数字从哪里来
你不必估算 token 数量,响应里就有。在兼容 OpenAI 的 API 中,chat completion 包含一个 usage 对象,里面有 prompt_tokens、completion_tokens 和 total_tokens。这些字段写在 OpenAI 公开的 API 规范里,其他供应商也沿用了相同的结构。在 n8n 中使用原始输出或 JSON 输出模式时,大多数模型节点都会在数据项的输出中提供这些 usage 信息。连接下面的节点之前,先检查一下你自己的节点某次执行的结果。
在每个 AI 步骤后面放置这个 Code 节点。它会把每条响应转换为一条计算好费用的账本记录:
// Cost ledger: one row per AI item. Prices are USD per 1M tokens.
const PRICES = {
'gpt-4o': [2.50, 10.00],
'gpt-4o-mini': [0.15, 0.60],
};
const out = [];
for (const item of $input.all()) {
const u = item.json.usage ?? {};
const model = String(item.json.model ?? 'unknown');
const [pin, pout] = PRICES[model] ?? [0, 0];
out.push({ json: {
workflow: $workflow.name,
model,
prompt_tokens: u.prompt_tokens ?? 0,
completion_tokens: u.completion_tokens ?? 0,
cost_usd: Number((((u.prompt_tokens ?? 0) * pin
+ (u.completion_tokens ?? 0) * pout) / 1e6).toFixed(6)),
day: new Date().toISOString().slice(0, 10),
}});
}
return out;
把这些记录写入 Google Sheets 节点或 Postgres,一天后你就能知道哪个 workflow 在消耗预算,并且能细查到具体步骤。如果不想使用外部存储,也可以在 workflow 的 staticData 中维护累计值;getWorkflowStaticData('global') 可以在生产环境的多次执行之间持久保存数据。我自己的 workflow 也用同样的机制保存发送日志,并防止重复发送。
这份账本会揭示几种常见、却不易察觉的成本放大因素:
- 重试循环在每次失败后,都重新执行一个庞大的 prompt。
- 每轮都重新发送整段对话,导致上下文膨胀。
- 用前沿模型做分类,而小模型已经足以胜任。
最后一种情况的解决办法很朴素:把一个反复执行的步骤切换到更小的模型,运行一天,再比较账本记录。
如果你想在搭建账本之前先算出总费用,我专门做了一款免费工具:n8n AI workflow 成本计算器。你可以列出各个 workflow,填写每次运行的调用次数、token 数量、模型、每天运行次数,以及其他按量计费的费用,再把模型价格改成实际支付的价格。它会显示每个 workflow 的单次、每月和每年费用,以及总费用、AI 与其他费用的占比,还有开销最大的 workflow。它完全在浏览器中运行,支持英语和荷兰语,不会向任何地方发送数据。
针对同一业务中的预约安排,我还做了一个爽约成本计算器和一个候补名单补位率计算器。
拿到数字后该怎么做
按步骤选择合适的模型,而不是整套技术栈统一选择。 分类和路由几乎从来不需要大模型。把前沿模型留给那些输出质量本身就是产品价值的地方,把小模型用在高频执行的步骤上。
限制重试次数。 没有上限的重试循环会不断增加失败步骤的成本,直到它成功,或者你终于注意到。给重试设定上限,并记录失败情况。
精简重复发送的内容。 如果每一轮都重新发送完整历史记录,prompt 就会随着对话长度线性增长。发送摘要即可,除非这个步骤确实需要完整对话记录。
坦诚说一下我自己的产品:我销售的 workflow 包(29 欧元,Afspraakpack for n8n)刻意没有内置 AI 节点,因此不会增加任何运行阶段的模型开销。上面的成本计算方法,适用于你自己构建的 AI workflow。介绍这套产品核心功能的提醒功能文章在这里;另有一篇每周 KPI 摘要方案的文章,可以帮助你养成每周一按 workflow 查看指标的习惯,也在这里。
先测量,再切换。反过来做,只会把意外留到下个月的账单上。
如需进一步采取措施,你可以考虑屏蔽此人和/或举报滥用行为。