Token 成本治理:从账单异动到三刀归因

T6-4模块 6 · 部署与成本面试权重 更新于 2026-08-19
关联题目Q6-09

这篇学完你能回答什么

  1. token 成本突然涨了 3 倍,第一刀该往哪切?为什么"砍功能"往往是最没用的动作?
  2. 为什么"上了缓存还是没省下钱"是一个可以预测的结果,而不是玄学?
  3. 降本动作的正确顺序是什么?每一步的代价分别是什么?

从一个真实故障讲起

一个客服 Agent,三周内 token 成本涨了 3 倍。查了两件事:功能没上新,DAU 只涨了 15%。

团队的第一反应是砍功能——关掉了"自动总结历史工单"和"相关文档推荐"两个用得少的能力。砍完账单只降了 8%。 两周白干,还得罪了两个业务方。

真因是三条同时发生,而且互相掩盖:

  1. 新加了一个订单查询工具。 它的返回体是完整 JSON,平均 4000 token。而工具结果默认是上下文的永久居民——一次多轮会话里调三次,后面每一轮都要重付这三次的钱。成本按剩余轮次复利。
  2. 为了修一个 badcase,有人把 effort 从 medium 提到了 high。 这一改不只让思考 token 变多,还让平均工具调用次数从 2.1 涨到 3.4——于是第 1 条被放大了。
  3. 有人在 system prompt 末尾加了一行"当前时间:{now}"。 prompt 缓存命中率从 85% 掉到 12%,而且账单上完全看不出来——低于门槛或未命中时缓存是静默失效的,不报错。

三条里,只有第 3 条是纯粹的技术失误,另外两条都是"有人为了做对一件事而做的正常改动"。这就是成本排查的难点:它不是 bug,是一堆合理决策的叠加。

而团队第一步就错了——他们跳过了分桶,直接去猜。这和第 5 章那个"分数掉了就回滚模型"的故障是同一种病:猜 → 试 → 猜 → 试。


砍掉两个功能,账单只降了 8%
客服 Agent 三周涨 3 倍:功能没上新,DAU 只涨 15%,团队直接跳过分桶去猜

  1. 三周成本涨 3 倍

    功能没上新,DAU 只涨 15%

  2. 第一反应:砍功能断点

    关掉自动总结历史工单与相关文档推荐

  3. 账单只降 8%

    两周白干,还得罪了两个业务方

  4. 真因其实有三条

    同时发生,而且互相掩盖

  5. 三条都不是 bug

    是一堆合理决策叠出来的账单

新加的订单查询工具返回体是完整 JSON平均 4000 token,工具结果是上下文的永久居民
effort 档位(修 badcase)mediumhigh —— 平均工具调用次数 2.1 涨到 3.4
prompt 缓存命中率85%12% —— system prompt 末尾多了一行「当前时间」
砍功能换来的降幅关掉两个用得少的能力只降 8%,账单大头一动没动
三条里只有第三条是纯粹的技术失误,另外两条都是「有人为了做对一件事而做的正常改动」。成本排查难就难在这里 —— 它不是 bug,是一堆合理决策的叠加。

核心概念:先打比方,再给定义

成本三刀(本篇主线)。把账单异动切成三层,每层只回答一个问题:钱花在输入侧还是输出侧?各侧内部是哪个环节?单价能不能降? 它是 Q2-17 归因树在成本维度上的形态——靠固定住一个变量,把问题一分为二。

输出/输入倍数。所有主流厂商的输出 token 单价都远高于输入:截至 2026-08,Anthropic 全系一律 5 倍,OpenAI 全系一律 6 倍,其余家在 5 到 8 倍之间。一句人话:同样多的 token,写出来的比读进去的贵五六倍。

思考 token(thinking / reasoning tokens)。模型在给出答案前的内部推理,四家全部按输出 token 计费。更贵的是它还有第二次收费——上一轮留在上下文里的思考块,下一轮要按输入 token 再付一次。

缓存三层的成本位置(承接 T6-3):exact cache 省整次调用,prompt/prefix cache 只省输入侧的重算,语义缓存省整次调用但带正确性风险。


写出来的,比读进去的贵五六倍
记住这个倍数,你就有了「先看输出侧」的直觉;三刀只是把它拆成三个问题

一句人话 · 读和写不是一个价

同样多的 token,写出来的贵五六倍

所以「先看输出侧」不是经验之谈,是单价结构直接决定的

对应
输出 / 输入倍数 k

Anthropic 5 倍,OpenAI 6 倍

截至 2026-08,所有主流厂商的输出单价都远高于输入,其余家在 5 到 8 倍之间;思考 token 四家一律计在输出侧

输入 I输出 O思考 token 计 O
成本排查的第一动作 · 分桶,不猜

固定住一个变量,把问题一分为二

和第 5 章那个「分数掉了就回滚模型」是同一种病:猜 → 试 → 猜 → 试

对应
成本三刀 · Q2-17 归因树的成本形态

每一刀只回答一个问题

钱花在输入侧还是输出侧 → 各侧内部是哪个环节 → 单价能不能降。切完一刀才切下一刀,跳着切就成了猜

第一刀 · 切侧第二刀 · 切环节第三刀 · 切单价
思考 token 是最容易被漏掉的一项:四家全部按输出 token 计费,而且上一轮留在上下文里的思考块,下一轮要按输入 token 再付一次 —— 同一份内容,两侧各收一遍。

原理拆解

第一刀不是换模型,是把范围砍一半
输出单价是输入的五六倍、思考 token 计在输出侧 —— 所以第一刀先切侧

账单涨了 3 倍先分桶,不猜
第一刀 · 输入侧还是输出侧
输入侧涨I × 单价,拉总量对比
输出侧涨O × 单价 × k,k = 5~8
第二刀 · 各侧内部再切
输入侧四个成因工具结果 / 上下文 / 命中率 / 前缀
输出侧三个成因effort 档位 / 输出长度 / 调用次数
第三刀 · 单价
换模型与路由只降一档基本是白忙
重跑轨迹评测降档会改变调用次数
缓存节省率 0.9·I/(I+k·O)(k=5,Anthropic 口径)
形态输入 I输出 O缓存节省率读法
长 prompt + 短答案(RAG 问答)50K2K67%缓存确实救得了
长 prompt + 推理密集(Agent 多轮)50K20K(含思考)27%大头已经挪到输出侧
短 prompt + 长输出(代码/报告生成)2K20K1.5%缓存白开,该去看 effort

这张表就是「上了缓存还是没省钱」的全部解释。缓存只作用于输入侧被缓存的那一段;成本大头落在输出或思考 token 上时,缓存救不了,正确动作是去看 effort 档位和输出长度。

输入侧唯一会静默发生的是缓存命中率塌陷 —— 前缀里插入任何每次都变的东西(时间戳、随机 ID、用户名)都会让它归零,账单上只表现为「输入侧变贵了」;排查方法是看响应里缓存读取与创建 token 的比值。

第二刀里最容易漏的是工具调用次数 —— 它是输出侧影响输入侧的那条通道:effort 提高,调用次数变多,每一次又把工具结果永久留在上下文里。

第一刀:输入侧还是输出侧

这一刀之所以排第一,是因为它决定了后面所有动作的方向,而且判据是一个可以直接算的公式

单次调用成本 = I × 单价 + O × 单价 × k        I=输入token  O=输出token  k=输出/输入倍数

缓存能省的比例(缓存把输入压到 0.1×):

    节省率 = 0.9 · I / (I + k·O)

代入三种典型形态(k=5,Anthropic 口径):

形态 输入 输出 缓存节省率
长 prompt + 短答案(RAG 问答) 50K 2K 67%
长 prompt + 推理密集(Agent 多轮) 50K 20K(含思考) 27%
短 prompt + 长输出(代码/报告生成) 2K 20K 1.5%

这张表就是"上了缓存还是没省钱"的全部解释。 它兑现了一条已经冻结的判断:缓存只作用于输入侧被缓存的那一段;如果成本大头在输出或思考 token 上,缓存救不了,这时候正确动作是去看 effort 和输出长度。

所以第一刀的操作很简单:从账单或 trace 里拉出输入 token 总量和输出 token 总量,各自乘上单价,看哪边涨得多。 不要猜,这是一个查询就能出的数。

第二刀:各侧内部再切

原文示意
                        账单涨了 3 倍
                             │
        ┌────────────────────┴────────────────────┐
        ▼                                          ▼
    输入侧涨                                   输出侧涨
        │                                          │
 ┌──────┼──────┬──────────┐              ┌────────┼────────┐
 ▼      ▼      ▼          ▼              ▼        ▼        ▼
工具结果 上下文  缓存命中率  前缀低于       effort   输出     工具
 累积    膨胀   塌陷        最小可缓存长度   档位     长度   调用次数
                (静默失效)  (静默不缓存)

输入侧的四个成因,按发现难度从易到难:

  1. 工具结果累积。最常见,也最容易被低估。工具结果默认是永久居民,成本按剩余轮次复利。一个 4000 token 的返回体在 10 轮会话里被重复计费近 10 次。
  2. 上下文膨胀。检索条数调大了、few-shot 例子加多了、历史没有压缩。
  3. 缓存命中率塌陷这是唯一会静默发生的一类——在缓存前缀里插入任何每次都变的东西(时间戳、随机 ID、用户名)都会让命中率归零,而账单上只表现为"输入侧变贵了"。排查方法是直接看响应里的缓存读取 token 数与创建 token 数的比值。
  4. 前缀长度低于最小可缓存门槛。截至 2026-08,Anthropic 按模型分四档:512 / 1024 / 2048 / 4096。低于门槛静默不缓存、不报错。 所以"我明明开了缓存"和"缓存真的生效了"是两件事。

输出侧的三个成因:

  1. effort 档位。这是 2026 年最大的一个隐形开关。官方对它的定位是"行为信号而非硬预算"——它缩放整个响应,包括思考。而 Anthropic 的默认值就是 high
  2. 输出长度max_tokens 设得过大不直接计费,但会让模型倾向于写更长;prompt 里"请详细说明"这类措辞的成本弹性极大。
  3. 工具调用次数。这条最容易被漏掉,而且它是输出侧影响输入侧的通道——effort 提高会让工具调用次数变多,每一次调用又把工具结果永久留在上下文里。开头那个故障的第 1 条和第 2 条就是这样耦合的。

因此有一条必须写进结论的约束:降 effort 会改变工具调用次数和轨迹,所以任何档位调整都必须重跑轨迹评测,不能只看最终答案。(承接 Q5-05 的轨迹评估与不变量断言)

第三刀:单价

前两刀都做完了,才轮到换模型。这一刀有两条硬判据:

判据一:只有降两档才有意义。 截至 2026-08 的价差结构是——旗舰到次旗舰只有 2.5 到 3 倍,旗舰到同厂最小模型是 10 到 80 倍只降一档基本是白忙,而降两档的质量风险要靠评测兜住。

判据二:路由的前提是流量的难度分布有方差。 如果你的流量清一色是同类任务,路由器只会在"该不该冒险"上反复摇摆,收益接近零,还多了一层延迟和一个故障点。这条与 T6-3 的四条"不该做路由"判据是同一件事。

降本动作的完整顺序与代价

① exact cache          零风险,吃掉典型流量 15–30%        代价:只对完全重复的请求有效
② prompt/prefix cache  零风险,输入侧降到 0.1×            代价:要重构 prompt 结构,断点位置有讲究
③ 批处理               四家一律五折,可与缓存叠加          代价:24 小时窗口,不支持流式
④ 削工具结果           改返回体 schema、只保留必要字段     代价:可能丢信息,要跑轨迹评测
⑤ 降 effort 档位       输出侧唯一的大杠杆                 代价:改变工具调用次数,必须重跑轨迹评测
⑥ 修缓存命中率         把易变内容移出缓存前缀             代价:无,但需要能观测到命中率
⑦ 跨模型路由           降两档才有意义                     代价:路由延迟 + 错路由风险 + 双轴评测成本
⑧ 语义缓存             省整次调用                        代价:正确性风险不可消除(见 T6-3)
⑨ 减功能               最后一步                          代价:产品能力损失,且往往收效最小

顺序不是随便排的:越靠前的动作,"改动 / 收益 / 风险"这个比值越好。 开头那个故障里,团队直接从第 ⑨ 步开始,所以只降了 8%。


工程实践(截至 2026-08)

缓存的盈亏平衡点(必须会算)

Anthropic 的缓存计费是:5 分钟写入 1.25 倍、1 小时写入 2 倍、命中读取 0.1 倍。由此:

  • 5 分钟档:写入多付 0.25,每次命中省 0.9 → 平均复用 0.28 次就回本,几乎必赚,可以默认开。
  • 1 小时档:写入多付 1.0,每次命中省 0.9 → 需要复用约 1.11 次才回本。用不满就是亏。
  • Gemini 的显式缓存还额外按小时收存储费(Pro 档每百万 token 每小时数美元),低频复用时是净亏——缓存 100 万 token 一整天的存储费,可能比直接重算这 100 万 token 还贵。

另一个必须知道的口径变化(截至 2026-08):OpenAI 从 GPT-5.6 起也开始对缓存写入收费(1.25 倍),"OpenAI 写缓存免费"这条 2026 上半年的常识已经过期。

四个反直觉的定价事实(截至 2026-08)

  1. Anthropic 取消了长上下文加价——Claude 4.6 及以后的完整 100 万 token 上下文按标准价计费,90 万 token 的请求和 9 千 token 的请求同单价。"Claude 超过 20 万 token 翻倍"这条已经作废。
  2. OpenAI 反过来新增了长上下文阶梯价——超过约 27 万 token 后输入约 2 倍、输出约 1.5 倍。两家方向恰好相反,别用一家的直觉套另一家。
  3. 两家都新增了数据驻留加价:指定区域推理约 1.1 倍,且含缓存读写。出海与合规场景要单独算。
  4. 服务分层已成标配:批处理五折 / 弹性档(同批处理价率但同步调用)/ 优先档(约 2 倍换稳定延迟)。"只有批处理一个档"的旧认知已过时。

成本可观测的最低要求

想做上面的三刀,trace 里必须记这些(承接 Q5-06):

  • 分环节的输入/输出 token 数,以及缓存创建与缓存读取 token 数分开记
  • 每次请求的模型 ID、effort 档位、max_tokens
  • 工具调用次数与每次工具结果的 token 数
  • 会话轮次数(用来算复利效应)

没有这几项,成本排查只能靠猜。 反过来,有了这几项,第一刀和第二刀都是一句 SQL 的事。

避坑清单

  • 不要用月度账单做归因,粒度太粗且滞后。要按天、按环节、按租户拉。
  • 缓存命中率要主动监控,不能等账单说话——它静默失效。
  • 降档必须灰度 + 重跑轨迹评测,不能只看抽样答案。
  • 不要为了省钱关掉 trace。存储成本可以靠"默认脱敏 + 按采样存原文 + 保留期分层"压下来(承接 Q5-06),但把可观测关掉之后,下一次成本异动你就彻底瞎了。
  • 警惕"省钱动作引入正确性风险":语义缓存、激进路由、过度压缩上下文,三者都是拿正确性换钱。这类动作必须有评测门禁,不能靠感觉上线。

缓存不是开了就赚,1 小时档会亏
5 分钟档几乎必赚;1 小时档要复用约 1.11 次才回本 —— 用不满就是亏

缓存与服务档位的账(截至 2026-08)
档位计费口径回本判据
5 分钟缓存可默认开写入 1.25 倍,命中读取 0.1 倍写入多付 0.25、每次命中省 0.9 → 平均复用 0.28 次就回本
1 小时缓存写入 2 倍,命中读取 0.1 倍写入多付 1.0 → 要复用约 1.11 次才回本,用不满就是亏
Gemini 显式缓存额外按小时收存储费(Pro 档每百万 token 每小时数美元)低频复用时净亏 —— 缓存一整天可能比直接重算还贵
OpenAI 缓存写入从 GPT-5.6 起对缓存写入也收费(1.25 倍)「OpenAI 写缓存免费」这条上半年的常识已过期
批处理 / 弹性 / 优先批处理五折;弹性同价率但同步调用;优先约 2 倍换稳定延迟「只有批处理一个档」的旧认知已过时,可与缓存叠加
定价口径与可观测最低要求(截至 2026-08)
最小可缓存长度
Anthropic 按模型分四档 512 / 1024 / 2048 / 4096,低于门槛静默不缓存、不报错
长上下文两家反向
Anthropic 取消加价,Claude 4.6 起百万窗口按标准价;OpenAI 超约 27 万 token 后输入约 2 倍
数据驻留
两家都新增:指定区域推理约 1.1 倍,且含缓存读写 —— 出海与合规场景要单独算
trace 必记
分环节的输入/输出 token,缓存创建与缓存读取分开记;模型 ID、effort、max_tokens
还有两项别落
工具调用次数与每次工具结果的 token 数;会话轮次数 —— 它是算复利效应的底数
归因粒度
不要用月度账单做归因,太粗且滞后;按天、按环节、按租户拉
有一类动作是拿正确性换钱:语义缓存、激进路由、过度压缩上下文,这三个必须有评测门禁。还有一条别做 —— 为省钱关掉 trace,下一次成本异动你就彻底瞎了。

面试视角

面试官在等的,是「我先分桶,不猜」
Q6-09 问法很具体:「成本突然涨了 3 倍,你怎么查」—— 它考的是排查次序

  1. 开口先定调「我先分桶,不猜」,接着说第一刀切什么
  2. 第一刀报数据两侧 token 总量各乘单价,范围立刻砍掉一半
  3. 第二刀报清单输入侧四因、输出侧三因,各说看哪个数
  4. 第三刀留最后前两刀做完才谈换模型,只降一档没意义
  5. 收尾给风险「降 effort 会改变调用次数,我会重跑轨迹评测」
只读过:这些回答会暴露你
  • 第一动作是「换个便宜的模型」,或者直接「砍功能」
  • 说「上缓存」,却答不出为什么某些场景缓存根本救不了
  • 不知道思考 token 按输出计费,也没有「先看输出侧」的直觉
  • 把「开了缓存」等同于「缓存生效了」,不知道它会静默失效
  • 谈路由时不提「只降一档没意义」
真做过:这些细节骗不了人
  • 第一句是「我先分桶,不猜」,并说得出第一刀切什么
  • 写得出缓存节省率公式,报得出推理密集场景从 67% 掉到 27%
  • 知道工具结果是上下文的永久居民,成本按剩余轮次复利
  • 知道命中率塌陷是静默的,排查看缓存读取与创建 token 的比值
  • 能算盈亏平衡点:1 小时档要复用约 1.11 次,用不满就是亏
有一个常见的诱导:面试官顺口问「是不是模型涨价了」。跟着走就掉坑 —— 那是第三刀,不是第一刀。再补一句「减功能排最后,而且往往收效最小」,这题就答满了。

面试官怎么问

Q6-09 是二三面的排障题,问法通常很具体:"成本突然涨了 3 倍,你怎么查?"它考的不是知识,是排查的次序。 面试官在等一句话——"我先分桶,不猜。"

有一个常见的诱导:面试官会顺口说"是不是模型涨价了"或者"要不要换个便宜的模型"。跟着这个思路走就掉进坑了——那是第三刀,不是第一刀。

答题结构建议

严格按三刀讲,每一刀都说清"我看什么数据、看到什么就往哪走":

  1. 第一刀:拉输入侧和输出侧的 token 总量,各乘单价。因为输出单价是输入的五六倍、思考 token 计在输出侧,这一刀能立刻把范围砍掉一半
  2. 第二刀:输入侧查工具结果累积、上下文膨胀、缓存命中率、前缀长度;输出侧查 effort 档位、输出长度、工具调用次数。
  3. 第三刀:确认前两刀都做完了,再谈换模型和路由,并说明"只降一档没意义"。

收尾一定要有一句风险陈述:"降 effort 会改变工具调用次数,所以我不会只看最终答案,会重跑轨迹评测。"

分水岭信号

暴露只读过:

  • 第一动作是"换个便宜的模型"或者"砍功能"
  • 说"上缓存"但答不出为什么某些场景缓存救不了
  • 不知道思考 token 按输出计费
  • 不知道输出单价是输入的五六倍,因此没有"先看输出侧"的直觉
  • 把"开了缓存"等同于"缓存生效了",不知道它会静默失效
  • 谈路由时不提"只降一档没意义"

证明真做过:

  • 第一句是"我先分桶,不猜",并说得出第一刀切什么
  • 能写出或口算缓存节省率的公式,并说得出推理密集场景会从 67% 掉到 27%
  • 知道工具结果是上下文的永久居民,成本按剩余轮次复利
  • 知道缓存命中率塌陷是静默的,并说得出排查方法(看缓存读取与创建 token 的比值)
  • 知道最小可缓存长度有门槛且低于门槛不报错
  • 主动说出 effort 会改变工具调用次数,因此必须重跑轨迹评测
  • 说得出降本动作的顺序,并解释为什么"减功能"排在最后
  • 能算缓存的盈亏平衡点,知道 1 小时档用不满就是亏

小结与延伸

  • 成本排查的第一动作是分桶,不是猜。 这与 Q2-17 的归因树、第 5 章的金丝雀集是同一把刀——固定住一个变量,把问题一分为二

  • 第一刀切输入侧与输出侧,因为输出单价是输入的五六倍,且思考 token 计在输出侧。

  • 缓存只作用于输入侧,节省率有公式可算;输出侧占大头时,正确动作是降 effort 和压输出长度。

  • 降本动作有严格顺序,越靠前"收益/风险"比越好;减功能永远排最后,而且往往收效最小

  • 省钱动作里有一类是拿正确性换钱(语义缓存、激进路由、过度压缩),这类必须有评测门禁。

  • 上游:T1-4(prompt 缓存设计)、T3-12(Agent 的成本与延迟优化)|平级:T6-3

  • 关联题目:Q6-09;设计侧见 Q3-23,trace 记什么见 Q5-06,轨迹评测见 Q5-05

继续深入

本篇归属第 6 章「部署与成本」,去做这一章的题