智能体成本控制

A17
概念 · 智能体 AI 详解

智能体成本控制。

聊天机器人的账单随用户数增长;智能体的账单随「用户数 × 步数 × 上下文」增长,而真正让人意外的是第三个因子——因为每一轮都要把整段对话重新发一遍,所以一个二十步的任务花的不是二十条消息的钱,而是接近平方量级的钱。解法几乎从来都不是换个更便宜的模型,而是缓存重复的部分、给会失控的部分设上限、删掉本就不必要的步骤。

STEP 1

为什么这笔账是平方级的。

模型是无状态的。智能体循环的每一步都会重新发送系统提示词、工具定义,以及到目前为止的完整对话记录——包括此前每一次返回的工具结果。第 1 步发的是提示词;第 20 步发的是提示词加上十九轮累积的输出。

  • 输入令牌数随步数大致线性增长,因此整个任务的累计输入随步数的平方增长。步数翻倍,输入开销大致变成四倍。
  • 输出令牌线性增长,且单价通常是输入的 3–5 倍——但在长时间的智能体任务里,输入量远大于输出量,所以账单通常仍由输入主导。
  • 一个臃肿的工具结果会毒化其后的每一步。第 3 步把一个 5 万令牌的文件塞进对话记录,意味着第 4 步到第 20 步你要为这 5 万令牌反复付费。

这就是「换便宜模型不就行了」往往令人失望的原因。一个价格只有五分之一、却需要三倍步数才能完成任务的模型,还要一路重发不断变长的对话记录,很容易反而更贵——而且它一定更慢。能更早结束任务的能力,是一个成本抓手,而不是奢侈品。

STEP 2

四个抓手,按回报排序。

  • 提示词缓存。可用手段中收益最大、侵入性最小的一个。稳定的前缀——系统提示词、工具定义、检索到的文档——被缓存下来,以很大的折扣重新读取,而不是重新处理。它之所以划算,恰恰是因为智能体每一步都在重发同样的前缀。它也要求前缀是真的稳定,所以把任何会变化的内容放到末尾。参见提示词缓存
  • 上下文纪律。不要放进你之后要付费一路带着的东西。把旧轮次摘要或丢弃,工具结果按引用返回(「已写入 300 行到 report.md」)而不是按值返回,并在工具边界处就截断,而不是指望模型会忽略噪声。这正是上下文工程的全部主题,而成本是它两项回报之一——另一项是准确率。
  • 路由。把简单、高频的步骤交给更小的模型,把前沿模型留给推理循环。分类、抽取与重排序是常见候选;参见小模型与本地模型
  • 少做事。最便宜的令牌是压根没生成的那个。如果一次确定性查表就能回答 40% 的请求,就让这些请求完全绕开模型——顺带注意,并不是每个任务都需要智能体
STEP 3

要设上限,因为循环真的会失控。

优化降低的是平均值。上限才是阻止长尾演变成事故的东西,而一个能循环调用工具的智能体,终究会陷入循环。请在三个层级上设预算:

  • 单任务——对步数和总令牌数设硬上限。触发时就停下并交回已有成果;不要无声地继续。这和终止条件是同一套控制面。
  • 单用户或单租户——滚动配额,使任何一个调用方都无法吃掉共享预算。没有它,你的成本上限就由你最热情的那位用户来决定。
  • 全局——一个紧急停止开关,以及针对「消耗速率」而非仅仅「消耗总额」的告警。失控的循环在变成月度账单之前很久,就已经表现为一条陡峭的斜率。

请对导数告警。「本月支出上涨 12%」晚了好几周才到;「03:14 每分钟令牌数翻了三倍」则是在你还来得及处理时就到了。

STEP 4

按任务计量,而不是按令牌。

令牌单价是可用成本指标里最没用的一个,因为它完全说明不了活儿有没有干成。真正值得放上看板的数字是每个成功完成任务的成本——总支出除以通过了你评测的任务数,而不是除以「返回了响应」的任务数。

  • 它如实地为失败定价。一个便宜但三分之一情况下会失败的配置,为那些尝试付了全价,然后为重试再付一次——或者掏钱请人来收拾。
  • 它让模型比较变得真实。一个更贵、但八步而非二十五步就收工的模型,按「每完成任务成本」算通常更便宜,而只有这个指标能显示出来。
  • 它暴露长尾。任务平均成本会掩盖那 1% 贵出百倍的运行;请关注 p95 与 p99,那里藏着从未终止的循环。
  • 把支出归因到具体调用链路上。如果没有把逐次运行的令牌统计与该次运行的结果关联起来,你就是在猜——这也是可观测性换来的又一项回报。

先做这三件无需改架构的事:打开提示词缓存、别再把整份文件内容塞回对话记录、给单任务设一个步数上限。在大多数智能体系统里,这三件事加起来对账单的影响超过任何一次换模型,而且它们都不会削弱能力。做完这些之后,再来争论该把哪种模型路由到哪里才有意义。

延伸阅读:成本、质量与延迟讲这个三方权衡,上下文窗口讲这一切最终撞上的天花板,紧急停止开关讲如何中止一次正在进行的运行。