有两年时间,每 token 成本是一个我们能切身感觉到的设计约束。它决定了重排器能看多少候选、一篇文档有多少能活到上下文里、一次校验通过是否负担得起、一个 agent 能走多少步才会有人来问这要花多少钱。
这个约束基本上已经溶解了。以架构关心的时间尺度看,前沿级推理的价格大约掉了一个数量级,更便宜的档位掉得更多。我们当年为了省 token 做的大部分决定,现在是在对没有约束的东西做决定。
有意思的不是省下来的钱,而是取而代之成为上限的那个东西。
我们最先做的事,以及它为什么是错的
本能反应是把富余花掉:更多检索候选、更多校验通过、更多 agent 步数、更长上下文。这里每一项单独拿出来都能改善跑分。合在一起,它们让两件事变糟了,而且都没有出现在成本看板上。
延迟不再是次要项。 单次调用的成本降了;单次调用的耗时并没有等比例降,而调用次数还上去了。一条加了第二次校验、又放宽了候选集的管线,不是”慢了一点”,而是慢到用户会描述为”坏了”。没有人批准过这个取舍,因为没有人被问到:这个改动是以质量为由通过的、以 token 计价的,而延迟预算根本不在这场论证里。
更多调用意味着更大的失败面。 每多一次工具调用和模型调用,就多一个超时的地方、多一次返回畸形结果的机会、多一次带着被污染的上下文继续往下走的可能。可靠性沿着链条是乘法的。因为便宜就加步骤,失败模式是以同样的速率加上去的。
约束实际转移到了哪里
有三个约束接替了那个溶解掉的,而它们更难被看见 —— 因为它们都不出现在账单上。
延迟预算。 它现在是大多数交互路径上的稀缺资源,应该像过去对待成本那样对待它:写下来、分配到各阶段、并且捍卫它。哪个阶段想加一次通过,就得从别处把时间拿出来。
上下文纪律。 便宜的 token 取消了”多放”的财务惩罚,没有取消它的质量惩罚。当”全放进去”很贵时,账单在替你执行取舍。现在执行它的只剩下一个决定:继续取舍。
注意力 —— 人的那种。 管线里多一步,就是事故当中运维要理解的多一分表面积。我们已经不再因为算力便宜,就把管线复杂度当成免费的。
我们重构了什么
- 延迟预算是一份写下来的东西,按阶段分配,某个阶段想多要的时候要过审。和过去 token 预算享受的是同一套纪律。
- 额外的通过必须对着轨迹挣到位置,而不是对着跑分。 一次能提分但让失败面翻倍的校验通过,在任何价格下都是坏交易。
- 路由问题换了形状。 它过去主要是”哪个最便宜的模型能过线”。现在它关于延迟、上下文处理、以及反复运行下的行为稳定性。价格是平局时的决胜项,不是判据。
- 批处理路径和交互路径分家了。 token 贵的时候,两者是按同一套节俭设计建的。现在离线路径负担得起交互路径负担不起的广度,而假装它们是同一个系统,会在一个方向上损失质量、在另一个方向上损失延迟。
一般性的教训
当一个约束消失时,围绕它设计的系统不会因此变得正确。它们只是变得没有约束了 —— 这不是一回事 —— 而它们新的上限,恰好是没有人埋过点的那些。
价格崩塌之后有用的动作不是把差额花掉,而是回到调用链里,搞清楚现在稀缺的是哪个量;然后对它保持同样的纪律 —— 就像当年那张账单逼着我们对 token 保持的那样。