AI 里最贵的 token,往往是那个没必要出现的 token

4 阅读8分钟

AI 里最贵的 token,往往是那个没必要出现的 token

很多团队一谈 AI 成本优化,第一反应都是:

  • 换更便宜的模型
  • 降低输出长度
  • 调小 max_tokens
  • 减少请求次数

这些都没错,但很多时候,它们并不是最该优先动的那一层。

真正把账单推高的,常常不是模型本身,而是那些根本没必要被送进上下文的 token

也就是说,AI 系统里最贵的 token,往往不是模型生成出来的那个,而是系统自己塞进去、但几乎没有创造价值的那个。

这听起来有点反直觉,但只要你拆过几次 production workload 的 token composition,就会发现这几乎是常态。


真正的问题:成本黑洞往往不在 user prompt

有个很典型的例子:

  • User prompt:~20 tokens
  • System prompt:~900 tokens
  • RAG context:~6000 tokens
  • Model reply:~400 tokens

总共大约 7320 tokens

其中用户真正输入的部分,只占:

0.27%

这意味着什么?

意味着在很多真实系统里,用户根本不是成本主体。真正贵的部分,是系统为了“让模型更聪明”而不断往上下文里加的东西:

  • 越来越长的 system prompt
  • 一股脑塞进去的 RAG 文档片段
  • 多轮 pipeline 的中间调用
  • 失败后的 retries
  • 工具输出的长尾噪音

所以很多 AI 成本问题,本质上不是 model pricing 问题,而是 context engineering 问题


为什么“无效 token”会越来越多?

这不是某个团队的偶然事故,而是 AI 系统很自然的演化结果。

1. system prompt 会不断膨胀

一个系统上线后,团队总会不停往 system prompt 里补规则:

  • 新增安全要求
  • 补充输出格式要求
  • 加 edge cases
  • 修某次事故的 prompt patch
  • 加几句“永远不要……”

短期看,每一条都很合理。

长期看,prompt 往往会变成一个没有人真正维护的“规则沉积层”。

问题在于:

  • 不是所有规则都还有效
  • 不是所有规则都值得每次请求都携带
  • 不是所有规则都真的能被模型稳定吸收

于是你每次调用模型,都在为一堆低收益说明书付费。

2. RAG 很容易从 retrieval 退化成 document dumping

RAG 的目标本来是“找最相关的上下文”。

但在很多实现里,最后变成了:

  • 查到了 10 段就全塞
  • 每段 1000+ tokens
  • 不 rerank
  • 不做 relevance cutoff
  • 不先摘要压缩

这其实不是 retrieval,而是 context dumping

模型收到的不是“高信号证据”,而是一堆未经筛选的文本块。

结果就是:

  • 成本变高
  • 延迟变长
  • 注意力被稀释
  • 回答质量未必更好

最糟糕的是,团队往往还误以为“喂更多信息更安全”。

很多时候,事实正好相反:

喂太多低相关文本,不是在增强模型,而是在稀释模型。

3. pipeline 设计会隐形放大 token 消耗

还有一类浪费,不在单次 prompt 里,而在整个链路结构里。

比如一个请求可能会经历:

  1. query rewrite
  2. retrieval
  3. rerank
  4. planner
  5. executor
  6. final answer

如果每一步都要调模型,那 token 不只是线性增长,而是“多段累加 + 失败重试 + 中间结果回填”。

这时很多团队看的只是单次回复成本,却忽略了真正烧钱的是:

  • 一个请求背后到底调用了几次模型
  • 哪些调用其实可合并
  • 哪些中间步骤根本没必要是 LLM

4. 工具输出和失败重试经常被低估

在 agent 系统里,tool result 往往是另一个大洞。

比如:

  • 把整段 HTML 回填给模型
  • 把完整日志文件塞回上下文
  • 把几十 KB 的 JSON 原样注入
  • 失败后自动重试三次

这些 token 看起来不是“prompt 设计”的锅,但最后都会变成账单上的成本。

而且比成本更糟的是,它们会拖累:

  • latency
  • cache hit
  • context window 可用空间
  • 后续推理质量

为什么“没必要的 token”不只是成本问题?

这是我觉得最应该被强调的一点。

很多人把 token 优化理解成 FinOps 或 API bill 管理。

但实际上,无效 token 会同时伤害三件事

1. 钱

这个最直观。

输入 token、输出 token、多轮调用、长上下文,都直接计费。

2. 速度

token 越多:

  • prefill 越重
  • 传输越慢
  • 生成开始得越晚
  • 整体响应时间越长

很多用户感知到的“AI 好慢”,并不是模型本身慢,而是你喂了太多不该喂的东西。

3. 质量

这反而最容易被忽略。

上下文不是越大越好。因为 attention 资源不是免费的。

当上下文里充满:

  • 冗余规则
  • 低相关检索结果
  • 长而无结构的工具输出
  • 重复中间状态

模型会更难抓住真正重要的 signal。

所以无效 token 的危害,不是只有“贵”,还有:

它会稀释推理注意力,降低有效信息密度。

这就是为什么有些系统把上下文砍掉一半,回答反而更稳。

不是模型突然变聪明了,而是噪音终于少了。


成本优化第一步,不该是换模型,而是拆 token composition

如果你真想看清 AI 系统的成本问题,第一步不该是上来就比模型单价。

第一步应该是拆账:

  • user prompt 占多少
  • system prompt 占多少
  • retrieved context 占多少
  • tool outputs 占多少
  • intermediate calls 占多少
  • retries 占多少
  • final response 占多少

如果不先做这件事,后面的优化大概率都是盲修。

因为你根本不知道钱花在哪。

很多团队最后会发现:

  • 模型切换节省了 20%
  • 但 retrieval + prompt compression 一做,直接省了 50%-80%

这两类优化的 ROI 完全不是一个量级。


高 ROI 的优化,往往是这 4 类

1. 压缩 system prompt

不是所有规则都该在每次调用里携带。

你应该持续问:

  • 这条规则还在起作用吗?
  • 能不能合并表达?
  • 能不能只在特定 workflow 下注入?
  • 能不能通过 code / middleware / validation 实现,而不是靠 prompt 记住?

很多 prompt 之所以越来越长,不是因为系统更复杂了,而是因为本该落在程序层的约束,被偷懒塞进了 prompt。

2. 改善 retrieval,只发 top 3–5 chunks

RAG 最常见的浪费不是 recall 不够,而是 recall 太宽

真正高价值的动作是:

  • 更好的 chunking
  • 更好的 retrieval 召回
  • rerank
  • relevance threshold
  • top-k 收紧

让模型看到的是“最相关的少量证据”,而不是“可能相关的大量文本”。

3. 长文档先摘要,再送主模型

很多文档并不需要原文直塞。

尤其是:

  • 长报告
  • 网页正文
  • 日志片段
  • 历史对话

先做一层压缩、摘要、结构化提炼,往往能显著提升信噪比。

这也是为什么 compaction、context pruning、memory extraction 这些机制越来越重要。

4. 对高频 query 和稳定中间结果做 caching

如果同类问题会被反复问到,就不该每次都从头跑一遍:

  • retrieval 结果可缓存
  • 摘要可缓存
  • 工具结果可缓存
  • 结构化转换结果可缓存

缓存不仅省钱,还会提升速度和稳定性。


对 agent 系统尤其重要的一点:最好的 compaction,是根本别把垃圾送进去

这点和最近很多 agent 系统的实践非常吻合。

大家现在越来越重视:

  • context pruning
  • transcript hygiene
  • auto-compaction
  • memory extraction
  • tool result trimming

但如果再往前走一步,你会发现最理想的状态不是“压缩得很好”,而是:

很多没必要的 token,从一开始就不该进上下文。

换句话说:

  • compaction 是补救
  • pruning 是减重
  • 但最优设计是 源头控流

这和基础设施世界里的原则很像:

  • 最便宜的流量,是没发出去的流量
  • 最稳的重试,是不需要重试
  • 最省的计算,是根本没算那次

放到 AI 这里就是:

最便宜的 token,是从来没被发送的 token。


一个实用 checklist:排查“token 都烧到哪去了”

如果你在看一个 AI workload,可以先用下面这张清单排查:

Prompt 层

  • system prompt 是否异常膨胀?
  • 是否存在历史补丁不断叠加?
  • 是否把本应由程序保证的约束塞进 prompt?

Retrieval 层

  • top-k 是否太大?
  • chunk 是否过长?
  • 是否缺少 rerank?
  • 是否整篇文档直接塞入?

Workflow 层

  • 一个请求要调几次模型?
  • 哪些步骤其实可以不用 LLM?
  • 中间结果是否重复注入下游?

Tool / Agent 层

  • 是否把超长工具输出原样回填?
  • 是否缺少 trimming / summarization?
  • retries 比率高不高?

Infra 层

  • cache 是否有效?
  • GPU / batch 是否有空转?
  • latency 变高是模型慢,还是上下文太胖?

这类排查一旦做下来,通常都会发现:

真正昂贵的,不是“模型太贵”,而是“系统太胖”。


结语

AI 成本优化最容易犯的错,就是把注意力全放在模型价格上。

但在真实系统里,很多最贵的东西根本不是模型选择,而是那些:

  • 用户没要求
  • 模型未必需要
  • 团队也没认真治理

却每次都被送进上下文的 token。

所以如果只记一句话,我会记这句:

AI 里最贵的 token,往往不是生成出来的那个,而是那个本来就不该出现的 token。

当你开始用这个视角看系统,很多优化优先级会立刻重排:

  • 先做 token composition 分析
  • 再做 prompt compression
  • 再做 retrieval 收紧
  • 再做 caching 和 workflow 精简
  • 最后才是模型单价优化

因为很多时候,真正高 ROI 的成本优化,不是换模型,而是减少无意义上下文