预测智能体开销:平均值是错误的那个数,而且它总是偏低。
财务问下个季度智能体要花多少,有人把每任务平均成本乘上预计用量,然后账单来了,高出四成——每个月都如此,方向还一致。原因不是马虎:智能体的每任务成本是重尾的,于是平均值被少数几次失控运行往上拽,却仍然预测不了总额,因为用量越大,撞上极端值的机会就越多。要从长尾和一个任务组合模型来预测,给长尾封顶好让它有一个数,再把误差分解成用量、组合与漂移——否则你就继续按时被惊到。
为什么平均值预测不了智能体的账单。
一个聊天机器人的每请求成本紧紧聚在一起——一次调用、一段有界的响应,一个用均值就能概括的分布。智能体的每任务成本不是这样。成本随步数的平方增长(每一步都重新发送整段对话记录,这笔算术在 agent-cost-control 里算过),而步数本身有一条长长的右尾:多数任务几步就结束,少数会循环、重试或游荡上几十步。把一个平方乘上一个长尾输入,你得到的分布里,最贵的那 5% 运行可能就占了三分之一的花费。
由此推出两件事,两件都能击穿那个天真的预测:
- 平均值不是一次典型运行。它坐在中位数之上,被长尾拽高,所以"每任务平均成本"描述的是没有人真正跑过的任何一次运行。报出它,等于请所有人围着一次并不存在的运行来推理。
- 平均值 × 用量是系统性偏低的,而且规模越大越糟。更大的总体会从长尾里抽出更多样本,于是随着用量增长,实际的每任务平均值会往上爬。在一万个任务上低估的预测,到一百万个任务时低估得更多。
诊断只需一条查询:为真实的一周画出每任务成本的直方图。如果它大致对称,那么基于均值的预测没问题,这一页不是给你的。如果它有一条长长的右尾——它会有——那么均值就是对错误对象的一次概括,你需要预测的是形状,而不是中心。
预测一个任务组合,而不是一个搅拌过的平均值。
全队的分布是若干条更窄分布之和,而这个和把一切可据以行动的东西都藏了起来。一个客服分诊任务、一个代码迁移任务和一个研究任务有不同的成本形状;把它们搅进一个平均值,一个都预测不准,而当组合发生变化时还会误导。把预测建成一个跨任务类的求和:
- 按任务类分段,而不是按模型或端点。预测的单位是"哪一种活儿",因为那才是拥有稳定成本分布的东西,也是产品上线一个功能时会改变的东西。
- 带上每一类的分布,而不是它的均值。为每一类保留 p50、p95 与 p99——或者更好,直接对这一类自己的历史成本重采样——再跨类求和,得到一个保留了离散度的全队数字。
- 把组合当作那个易变的输入。一个钉死在今天组合上的预测,在一个新智能体上线的那一刻就过时了。当产品计划一次发布,会变的那个预测输入是各类的权重,而诚实的预测在发布之前就更新,而不是等账单来了之后。
这和 per-customer-economics 对租户施加的分段纪律是同一套,只是转向了任务类型:一个看起来稳定的汇总,可能是两个类朝相反方向在动。
是封顶让长尾变得可预测。
一个没有天花板的重尾分布,没有一个可靠的期望值供你据以做预算——你观察的运行越多,样本均值爬得越高,因为下一个极端值总在你前头。cost-control-in-the-loop 里那个每任务上限不只是一项安全控制;它正是把一项无界风险变成一个预算科目的东西。有了每任务 C 个令牌(或美元,或步数)的硬上限,最糟的运行也只花 C,长尾被截断,全队成本就有了一个有限、可计算的上界。
所以要显式地预测长尾,而不是指望它一直很小:
- 按类跟踪撞顶率。触到天花板的运行占比,就是那条被截断长尾的质量,而它是一个领先指标:一个撞顶率在上升的类,是一个成本即将上升的类。
- 为最坏情形做预算,而不只是期望情形。期望花费用每一类的均值;你对财务做出的承诺则用一个高分位数,好让糟糕的一个月落在你承诺过的那个数字之内。两者之间的差距就是长尾的价格,而把它点名,正是重点所在。
- 缺一个封顶,就是缺一份预测。只要有任何任务类在不封顶的情况下运行,它对总额的贡献就是真正无界的,任何对它的预测都不诚实。先封顶,再预测。
撬动长尾的四个驱动因素。
一份开销预测是少数几个输入的函数,而长尾对它们的敏感程度远高于中位数。给这些装上仪表,好让预测由实时数字喂养,而不是一次季度性的猜测:
- 重试与循环率。单一最大的长尾驱动。一个失败后重试的任务,既为失败付了钱又为重试付了钱;而一场发生在提供方抖动期间的重试风暴(见 rate-limits-and-provider-capacity)能在什么也没产出的情况下把一天的花费翻倍。
- 上下文膨胀。那个平方就住在这里。一个开始把大块工具结果返回进对话记录的类,会在它的中位数移动之前很久就看到 p95 往上爬——盯着长尾、而不是平均值,才能抓住它。
- 路由组合。哪些步走前沿模型、哪些走小模型。一个悄悄把更多流量挪向昂贵模型的级联,会给整个类重新定价;这也是一次模型迁移可以在没有任何人编辑预测的情况下挪动基线的地方。
- 缓存命中率。提示词缓存命中率会成倍改变有效输入价格。一次把提示词前缀重排、把命中率打崩的部署,会一下子抬高每一次运行的成本——这是一个阶跃变化,预测必须吸收它,而不是当作渐进漂移。
从预测到一份会行动的预算,然后对账。
一份只活在幻灯片里的预测是一个预言;一份接上了控制的预测才是一份预算。用同一个分布里的三个数字,去干三件不同的活:
- p50 用于计划。财务据以搭起这个季度的期望情形数字。
- p95 用于承诺与告警。你承诺不超过的那个数,以及当某个月正朝着冲破它的方向走时会传呼的阈值——早到还来得及行动,正如 cost-attribution 那条规则所说:预算是熔断器,不是报表。
- 花费速率用于熔断。是每分钟令牌数越过一个斜率,而不是每月美元数越过一个总额——导数会在你还能停下这次运行的时候到达。
然后每个月把闭环合上:把预测摆到实际旁边,把误差分解成三项——用量(任务比计划的多)、组合(各类权重动了),与每任务漂移(在用量不变的情况下某一类变贵了)。一个你分解不了的误差什么也教不了你;一个你能分解的误差,会准确告诉你该重新估计哪个输入。多数顽固的低估,最后都发现是藏在长尾里的每任务漂移——那个悄悄开始循环的类。
预测仍然会崩的地方。
即便是一份感知长尾、基于组合的预测,也有一些盲点值得点名,好让它们少惊到你:
- 一个没有历史的新任务类。冷启动没有分布可采样。用一个合成的最坏情形给它定界——在真实运行说话之前,假设它撞顶的频率远高于一个成熟的类——而不是借另一个类的均值、还管它叫预测。
- 在你脚下悄悄重新定价。一次提供方调价或一次平台自动升级,会在你的仓库里没有任何提交的情况下给基线重新定价;一份期限承诺(见 provisioned-throughput-and-commitments)冻住了价格,但也冻住了你的模型选择。把预测所假设的那份价目表打上戳,好让一次基线变化成为一个看得见的输入,而不是一次无法解释的误差。
- 与价值相关的成本。你最投入的客户跑着最深的循环,于是需求与每任务成本一起动,长尾在租户之间并不均匀分布。一份忽视了这种相关的全队预测,恰恰会给最要紧的那些账号定错价——这正是 economics-failure-modes 里编目的那个失败面。
在搭一个更花哨的模型之前,先做这三件:画出每任务成本的直方图,好让长尾对所有人都可见;给每一个类都加上一个硬性的每任务上限,好让长尾有一个有限的数;用 p95 而不是均值来预测,好让你的承诺熬得过糟糕的一个月。建立在这三者之上的预测会大致正确、并被诚实地定界;而一个"均值乘用量"的预测会精确地错、偏低、且滞后——每个季度,方向一致。