更少的 token vs 更便宜的 token

9 分钟读完

B20
运维 · 经济性与投资回报

更少的 token vs 更便宜的 token。

一个少写三倍 token 的模型,和一个每 token 收费便宜三倍的模型,在价目表上看起来是同一笔折扣;在一个二十步的智能体循环里,两者差得很远:降价兑现完整的 3 倍,简洁只兑现约 1.7 倍。原因是一个生成出来的 token 要被计费不止一次——先按输出价付一次,之后每一步再作为输入被重读一次——而固定前缀与工具返回结果对两者都不会缩小。有一个数字决定该花钱买哪根杠杆,你今天就能从自己的追踪里算出来;而提示缓存会把它推向没人预料的那个方向。

STEP 1

为什么这两笔折扣不可互换。

厂商在宣传两种节省,而采购把它们当成可替换的。它们作用于账单的不同部分。

  • 降价是对一切做乘法。账单上每一个 token 都变便宜:系统提示、工具 schema、检索到的文档、工具返回结果、被重发的记录,以及模型自己的输出。一项都不豁免。
  • 简洁只对一项做乘法。生成的 token 更少,缩小的是模型的输出以及那些输出所变成的那部分记录。它对固定前缀毫无作用——不管怎样每一步都要重发;对工具返回结果也毫无作用——那是环境的输出,不是模型的。

在一个智能体循环里,那些碰不到的项很大,因为循环每一步都把一切重发一遍——智能体成本控制 里那套二次增长的算术。一个带 4,000 token 前缀的二十步任务,要为这个前缀付二十次钱;而一个在第三步到来的 600 token 工具结果,会在第四步到第二十步被重读。简洁一项都伸不到。

这正是为什么「便宜的模型」与「惜字如金的模型」是两笔不同的采购,应该用不同的算术来评估。一个写得少一半的模型,不是账单少一半;一个每 token 便宜一半的模型,才是。前一种主张是厂商近来开始提出的那一种——见 轴选对了,单位选错了——而它也是那种在你能相信它之前必须先换算的主张。

STEP 2

一个生成 token 的边际成本,写成闭式。

在一个 N 步任务的第 i 步写下一个 token。你付一次输出价,然后在此后那 N − i 步里,每一步重发包含它的那份记录时都要付一次输入价。于是:

cost(one token written at step i) = p_out + (N - i) * p_in_effective

# N = 20, p_in = $0.60/M, p_out = $2.40/M, no caching
# average over the trajectory: p_out + p_in * (N-1)/2
#                            = 2.40 + 0.60 * 9.5
#                            = $8.10 per million  ->  3.4x the output rate

由此立刻得出三件事,而且三件都在运维上有用。

  • 在一条中等长度的轨迹上,啰嗦大约比输出价所暗示的贵三到四倍,这也是为什么重推理的模型让人吃惊是在账单上、而不是在价目表上——那个记账问题在 为推理 token 记账。
  • 早期 token 比晚期 token 贵。二十步里写在第 2 步的一个 token 会被重读十八次;写在第 19 步的只被重读一次。一个啰嗦的规划阶段是你能买到的最贵的啰嗦,而一个啰嗦的最终答案几乎是免费的。
  • 这个乘数与轨迹长度成线性。把步数砍半,就把每个 token 的重读惩罚砍半——这也是为什么「能更早收尾的能力」是一根成本杠杆,而不是一项奢侈。
STEP 3

传导率:3 倍的简洁实际值多少。

把一个任务完整地建模一遍。二十步,4,000 token 的固定前缀,600 token 的工具返回结果,输入每百万 0.60 美元、输出每百万 2.40 美元,不开缓存。一个模型每步写 1,200 个 token,另一个写 400——生成 token 上干净的 3 倍。

input tokens  = N*prefix + (write + tool_result) * N*(N-1)/2
output tokens = N*write

                           input     output      bill   vs base
verbose, 1200/step       422,000     24,000    $0.311     1.00x
brief,    400/step       270,000      8,000    $0.181     1.72x
verbose at 1/3 price     422,000     24,000    $0.104     3.00x

把模型写的东西砍掉 3 倍,买到的是账单上 1.72 倍。3 倍降价买到的是 3.00 倍——并且直接赢过了那个简洁的模型,0.104 美元对 0.181 美元。在这里,简洁的模型只有在同时也更便宜、或者能用更少步数收尾时才会赢。

有一个数字解释了整张表。把 α 定义为:账单中由模型自己的书写所支配的占比——它的输出 token,加上这些 token 被重读的部分——相对于它所不支配的固定前缀与工具返回结果:

alpha = (p_in * N*(N-1)/2 + p_out * N) * write
        / total_bill

saving from writing b times fewer tokens  =  1 / ((1 - alpha) + alpha/b)
saving from paying q times less per token =  q          (exactly)

# worked above: alpha = 0.63, b = 3  ->  1.72x

所以简洁被 α 封了顶,而降价完全不封顶。盈亏平衡一写下来就很直白:3 倍的简洁要赢过仅仅 2 倍的降价,需要 α 超过大约 0.75——也就是你账单的四分之三是模型自己的文字和它们的回声。在不开缓存、有真实前缀与真实工具结果的情况下,几乎没有哪个智能体到得了那里。

STEP 4

提示缓存会抬高 α,所以它让简洁更要紧——而不是更不要紧。

多数团队的直觉是:缓存让啰嗦变得无害,既然重读变便宜了。算术说的正相反,原因是缓存打折的,恰恰是简洁永远碰不到的那部分账单。

把同一个任务拿来,设 90% 的输入以输入价的十分之一从缓存读取,于是有效输入价为每百万 0.114 美元:

                           input     output      bill   vs base
verbose, 1200/step       422,000     24,000    $0.106     1.00x
brief,    400/step       270,000      8,000    $0.050     2.11x

alpha rises from 0.63 to 0.79   ->  brevity's payout rises from 1.72x to 2.11x
output goes from 19% of the bill to 54% of it

那个固定前缀原本是压在两个模型账单下面的一道地板;缓存拿走了这道地板的大部分,于是剩下的部分被「两个模型真正不同的那件东西」所主导。一旦越过 α ≈ 0.75 这条线,3 倍的简洁现在确实赢过 2 倍的降价。对于成本工作的排序,由此有三个结论:

  • 在去挑一个惜字如金的模型之前,先把缓存打开。缓存是手上最便宜的杠杆,而它会改变模型这道题的答案——见 提示缓存。反过来做,意味着你在对着错误的 α 选模型。
  • 缓存与简洁是互补,不是互替。它们作用于不同的项,而每一个都抬高另一个的回报。多数成本分析把它们当成二选一。
  • 缓存未命中率会移动 α,所以要盯着它。如果对前缀的一次改动让缓存失效,α 就会下降,而你为之付了溢价的那个简洁模型就不再把溢价挣回来。把命中率放到与花费同一张看板上,依 成本归因与预算。
STEP 5

简洁买到的、钱买不到的东西。

账单是一个惜字如金的模型最弱的理由;如果那是唯一的理由,结论就只会是「去买更便宜的 token」。另外三个效应完全不出现在账单上,而其中两个才是团队真正换模型的原因。

  • 延迟,它几乎与写出的 token 数成线性。输出是串行解码的,所以每步少三倍的 token,差不多就是每步少三倍的时间。降价一点都买不到这个。在一个二十步的任务上,这就是「一个人愿意等的工具」与「一个人会放弃的工具」之间的差别——在 给延迟定价 里被标了价。
  • 上下文余量,而它是一条正确性属性。每一个被写下的 token 都会在此后整段运行里占着窗口,所以啰嗦的模型更早撞上压缩,而压缩正是智能体丢掉线索的地方——上下文压缩。有效召回也在远未到达标称上限之前就开始退化,所以更短的记录不只是更便宜,它也更准确:有效上下文 vs 标称上下文。
  • 步数预算,因为 token 与步数是一起被配给的。一个固定的 token 上限会直接换算成智能体能拿到多少步,所以在同一个额度内,一个简洁的模型被允许尝试更多次——那是 预算对齐的评测 里的评测后果。

还有一根杠杆压过这两笔折扣,而且通常就在手边:一开始就少写上下文。工具结果按引用而非按值返回、在工具边界处截断、把旧的轮次做摘要,都在削减简洁伸不到、而缓存只是打了折的那些项——这是 上下文工程 与 上下文预算 的全部主题。

STEP 6

决策规则,以及它需要的五个数字。

不从自己的追踪里取到五个数字,你就无法把任何厂商的效率主张换算成自己的账单;而只要你记录了按运行的 token 计量,这五个数字就已经在你的遥测里了。

  • 每个已完成任务的步数中位数。它定下重读乘数,而它是多数团队从没看过的那个数字。
  • 前缀大小——系统提示加工具 schema,再加其他任何恒定的东西。
  • 工具返回结果大小的中位数,这是简洁碰不到的另一项。
  • 每步写出 token 数的中位数。
  • 输入的缓存命中率。

把它们代进 STEP 3 的 α 表达式,规则就自己出来了。α 低于约 0.6,买价格:把高流量的那些步路由到更便宜的模型,把前沿模型留给推理,依 模型路由 与 小模型与本地模型。α 高于约 0.8,买简洁——而且可以考虑为它付溢价,因为到了那一步它同时也在替你买延迟和上下文余量。介于两者之间时,两根杠杆在成本上处于彼此的噪声范围内,那就改用延迟来决定。

关于这次测量有两条提醒。第一,α 是按工作负载而非按公司的:一个轨迹很长的研究型智能体与一个一步就返回的分类智能体坐在两端,所以请按接口分别计算,并预期得到不同的答案——那套功课在 智能体单位经济学。第二,这一切都经不起成功率的变化。一个更常失败的简洁模型,是在为失败的尝试付全价、然后再为重试付一次,而这会淹没本文里的每一个系数;请测量每个成功任务的成本,否则你会把自己优化成一个更便宜、但交付更少的系统。

从上周的追踪里拉五个数字——步数中位数、前缀大小、工具结果大小中位数、每步写出 token 数中位数、输入缓存命中率——把 α 算一次。如果它低于 0.6,你买的东西挑错了:去开缓存、缩小工具结果、把便宜的步路由走,等 α 动了之后再回来谈模型。如果它高于 0.8,一个惜字如金的模型值真金白银也值真实的延迟收益,而你应该在一个对齐的 token 额度下比较候选,而不是在排行榜上比。

相关:价格通缩与每任务成本(为什么价目表一直在跌而你的账单没有)、预测智能体花费(把 α 变成一份预算),以及 自适应思考与投入预算(从你已经有的模型那里买到简洁)。