有两年时间,每 token 成本是一个我们能切身感觉到的设计约束。它决定了重排器能看多少候选、一篇文档有多少能活到上下文里、一次校验通过是否负担得起、一个 agent 能走多少步才会有人来问这要花多少钱。

这个约束基本上已经溶解了。以架构关心的时间尺度看,前沿级推理的价格大约掉了一个数量级,更便宜的档位掉得更多。我们当年为了省 token 做的大部分决定,现在是在对没有约束的东西做决定。

有意思的不是省下来的钱,而是取而代之成为上限的那个东西。

我们最先做的事,以及它为什么是错的

本能反应是把富余花掉:更多检索候选、更多校验通过、更多 agent 步数、更长上下文。这里每一项单独拿出来都能改善跑分。合在一起,它们让两件事变糟了,而且都没有出现在成本看板上。

延迟不再是次要项。 单次调用的成本降了;单次调用的耗时并没有等比例降,而调用次数还上去了。一条加了第二次校验、又放宽了候选集的管线,不是”慢了一点”,而是慢到用户会描述为”坏了”。没有人批准过这个取舍,因为没有人被问到:这个改动是以质量为由通过的、以 token 计价的,而延迟预算根本不在这场论证里。

更多调用意味着更大的失败面。 每多一次工具调用和模型调用,就多一个超时的地方、多一次返回畸形结果的机会、多一次带着被污染的上下文继续往下走的可能。可靠性沿着链条是乘法的。因为便宜就加步骤,失败模式是以同样的速率加上去的。

约束实际转移到了哪里

有三个约束接替了那个溶解掉的,而它们更难被看见 —— 因为它们都不出现在账单上。

延迟预算。 它现在是大多数交互路径上的稀缺资源,应该像过去对待成本那样对待它:写下来、分配到各阶段、并且捍卫它。哪个阶段想加一次通过,就得从别处把时间拿出来。

上下文纪律。 便宜的 token 取消了”多放”的财务惩罚,没有取消它的质量惩罚。当”全放进去”很贵时,账单在替你执行取舍。现在执行它的只剩下一个决定:继续取舍。

注意力 —— 人的那种。 管线里多一步,就是事故当中运维要理解的多一分表面积。我们已经不再因为算力便宜,就把管线复杂度当成免费的。

我们重构了什么

一般性的教训

当一个约束消失时,围绕它设计的系统不会因此变得正确。它们只是变得没有约束了 —— 这不是一回事 —— 而它们新的上限,恰好是没有人埋过点的那些。

价格崩塌之后有用的动作不是把差额花掉,而是回到调用链里,搞清楚现在稀缺的是哪个量;然后对它保持同样的纪律 —— 就像当年那张账单逼着我们对 token 保持的那样。