我在做 1trAIner——一个 AI 教练,它制定计划、分析训练课并在聊天中回复。看起来计算这种服务的成本很简单:查看模型扣费,除以用户数,就得到每人每月的费用。
但账单里不只有与教练的对话。还有检查用的回复、翻译、编辑校对、修正后的重新评估。这些都是模型费用,但原因各不相同。如果不加区分地把它们加在一起,得到的数字不便于做决策。
先划清界限:本文不会给出 DeepSeek 的月度账单和单个用户的维护成本。服务还很年轻,用户量小,我们目前还没有诚实的月度样本。我不想用单个任务的费用来替代它。
但有具体的扣费、我们计算方式的构造,以及一个关于为什么在预算未用完时工作就停止的故事。通过这些例子可以清楚地看到,在写下“我们的 AI 每月花费这么多”之前,究竟需要计算什么。
并非所有对模型的调用都是用户服务
在服务内部,DeepSeek 作为教练来回复。但同一个模型也可能翻译内部消息,或参与新规则的检查。模型名称相同,费用用途却不同。
对我自己来说,我把教练的日常工作和产品变更分开。在前一种情况下,人提出问题,得到分析或计划。在后一种情况下,我们翻译界面、检查回复、修正措辞。我单独看编辑模型的费用:它不与用户对话,而是评估或校对我们要展示给用户的内容。
这不是试图把不方便的费用从计算中剔除。它们不会消失。只是问题不同:
- 维护当前负荷要花多少钱?
- 我们在产品变更上花了多少钱?
- 这次变更的检查花了多少钱?
例如,在检查教练回复中的医疗边界时,我们得到了 36 条 DeepSeek 检查回复。它们通过正在运行的服务,进入了运营成本,而不是任务预算。它们的成本大约几美分。
从这样的评估中无法得出单次回答的准确成本。更不可能把它摊到一个月上。只能说,验证性的调用同样会花钱,而且开发与运维之间的界限不会自动出现在账单上。
连单次请求的成本都可能算错
在我们的计算中,仅仅把发送的全部文本拿来乘以单价是不够的。
模型接收输入文本并返回回答。输入的一部分可能重复出现,并按单独的费率计费:供应商会把它视为已处理过的内容。一个重要细节是,这部分重复使用的量已经包含在总的输入计数中。
如果先把全部输入计费,再加上重复使用的部分,我们就会把它重复计算一次。因此计算时会先把普通输入与重复输入分开,再分别套用相应的费率。
模型的内部推理也有类似的微妙之处。在我们的计算中,它已经计入输出量,不再单独累加。否则自己的费用表会显示出比原始计数更多的数字。
对读者来说,这也许是枯燥的账目。对我来说,这是任何关于节省的讨论的基础。在削减请求或更换模型之前,必须先确认我们没有自己凭空多画出费用。
还有一点很重要:不要高估这种计算。拥有正确的函数并不能证明月度报告的完整性。它回答的是“如何计算某一次具体调用”,但并不能确认最终样本是否涵盖了所有调用。
今天的价目表不应改写过去的账单
我们的价格会根据供应商、型号名称和咨询时间来确定。计算时会查找当时已经生效的合适价格方案。
我为什么要在意这一点?因为按当前价目表重算全部历史的诱惑非常大。这样能得到一张整齐的表格,只是它回答的已经是另一个问题:过去的负载在今天的条件下会花多少钱。
要计算实际支出,需要的是请求发生时的价格。
计算中也考虑了普通费率和高峰费率。这并不是说我们的每次调用在特定时间一定会更贵。而是在设定了这种费率时可以应用它。如果没有单独的高峰费率,则使用普通费率。
我不会因此建议立即把所有工作都转移到便宜的时段。聊天中的回复和后台校对有不同的紧急程度。首先需要看到哪些负载确实适用不同的费率,以及哪些可以推迟而不影响使用场景。
这里的决策成本不只是金钱。可以在调用上省钱,但让人在等待会破坏产品意义的地方等待。没有负载数据,这种交换很容易盲目进行。
具体金额:校对,而非教练的月度工作
最近几天最明显的支出是英文和中文页面的校对。这是编辑模型通过 OpenRouter 完成的工作,不是 DeepSeek 日常回复的账单。
校对初期花费了 $3.89。余额充值后继续校对花费了 $4.98。晚间阶段花费了 $4.71。这些是各阶段的支出,不是服务的价格方案,也不是一个月的费用。
这些支出背后是相当具体的修正。在英文翻译中,马拉松名称“Дёмино”变成了虚构的“Demyansky”。编辑恢复了正确的名称。在帮助文档中,明确了关于 Garmin 数据的表述:指的是记录的数据,而不是说手表是任何事实的唯一来源。
同时,我们也不无条件信任编辑。修改会经过自动检查:数字是否保留、术语词典是否遵守、是否有意外的字母混用。如果检查拒绝修改,它就不会出现在已发布的翻译中。
这里省钱有不好的一面。模型工作的钱已经花了,但部分建议未被使用。可以将其视为损失并放松检查。我不这样看待这些支出:付费的回复不会仅仅因为被收费就变得正确。
保留原有的机器翻译也不意味着得到完美的文本。这只是意味着不应用未通过现行规则的修改。质量问题仍然存在,需要单独决定。
预算有,但工作停滞
在校对过程中多次出现了一种情况,很容易被错误地描述为“钱用完了”。
该任务已分配预算,且尚未用完。但 OpenRouter 在后续请求中拒绝了:可用余额不足以支持带有指定最大回复长度的请求。
任务支出限额与供应商可用余额是两回事。限额规定我们允许花多少。余额决定供应商能否接受带有其参数的下一请求。
在初始阶段,预算上限为 $10,已花费 $3.89,但后续仍然中断。充值后校对得以继续。之后余额限制再次出现。
还有一个不太明显的情况:编辑已返回修改,修改也已应用,但随后请求摘要时未能通过。因此末尾的错误消息并不意味着整个阶段都是空的。
由此我得出一个实用的核算规则:不仅要看“已完成”或“错误”状态,还要看实际获得的结果。否则可能要么漏算已完成的工作,要么为已完成的工作重复付费。
在这些任务中,因余额被拒后没有启动重试。后续操作与已保存的结果关联。这不是什么漂亮的模型成本优化,而是普通的谨慎:不让系统重复做它已经做过的事。
质量检查也有自己的账单
另一个情况是教练回复的边界。在检查语言版本时发现,问题不仅出在翻译上:俄语回复也需要修正。
在任务中修改了模型指令,增加了自动检查,并重新评估了回复。花费为 $1.42。其中通过 DeepSeek 翻译警告花费 $0.01,表格中其余部分是编辑评估的运行费用。教练本身的验证回复,如我所述,是单独计算的。
重要的是,花掉的预算并不意味着达到了质量:目标标准我们始终未能满足。回复末尾的警告并不总能修正开头的不当表述。
在下一阶段增加了更详细的自动检查。评估花费 $0.41。目标中文回复获得了更高评分,但同一组回复的平均分从 4.33 降至 4.00。编辑对部分此前评价较宽松的措辞提出了异议。
对我来说,这比“花了一点钱就全修好了”的故事更有用。可以同时看到几个限制:补写的一行不一定能消除矛盾,而基于模型的评估器并不总是稳定。
因此,编辑评分对我来说并不能证明质量。现在,我们通过固定清单来检查回答的必要特征,而编辑模型则用于修订措辞。
月度真实价格需要什么
经过这样的分析,仅仅展示供应商的余额对我来说是不够的。要计算月度成本,需要特定时期的支出、明确的请求计入规则以及同一时期用户活动的数据。
需要提前决定什么算作运营,如何在工作中的服务上计入验证性请求,以及将新页面的翻译归入何处。并且不要为了更漂亮的总结而每次报告都改变这些规则。
我也不会毫无保留地将支出除以注册账户数。一个没有打开过教练的人和一个经常与教练交流的人产生的负载是不同的。平均值可能有用,但前提是必须清楚其分母究竟是什么。
因此,我的结论目前比“AI 教练只花几分钱”要保守。在分析过的任务中,调用模型的费用很小。有单独付费的质量检查。有因为余额而停止的情况,尽管任务预算尚未用完。还有仅凭花费金额无法认定为足够的结果。
月度成本从考虑这些差异开始。而整个服务的价格并不止于 DeepSeek 的账单。
