为什么输出 Token 比输入贵这么多?
Claude Sonnet 输出价是输入价的 5 倍,缓存输入更是输入价的十分之一。这种 30 倍的价格差不是定价艺术——背后是 GPU 算力的真实物理结构。这篇讲清原理,并给出几个直接省钱的实用结论。
打开任意一家大模型 API 的定价页,你会看到三个价格:
- Input:基准价
- Output:5 倍基准价(左右)
- Cached Input:0.1 倍基准价
Claude Sonnet 当前定价:input 3 美元/百万、output 15 美元/百万、cached input 0.3 美元/百万。最高和最低差 30 倍——这不是 Anthropic 想多收钱,是这三种 Token 的"算力成本"本身就差 30 倍。
明白这件事的开发者能省一大半钱。多数人不明白,所以会问"为什么我账单这么高"。
算力结构决定价格
LLM 推理两个阶段:
Prefill(预填充):把整个输入序列扔给模型,并行计算每个位置的 attention 和 hidden state。这阶段是「批量并行」,吃 GPU 计算单元(FLOPs),但单 Token 摊下来便宜。
Decode(解码):模型一个 Token 一个 Token 往外吐。每生成一个新 Token 都要把前面所有 Token 的 KV cache 读一遍。这阶段是「串行」,吃 GPU 内存带宽(HBM),单 Token 成本远高于 prefill。
Output Token 比 Input Token 贵的本质就是:output 必须串行解码,input 可以并行预填。
差 5 倍是物理现实,不是商业策略。
为什么缓存可以便宜 10 倍
Prompt Cache 是这样运作的:第一次调用时模型把 prefill 阶段的 KV cache 算出来,存在 GPU 内存里几分钟。第二次调用如果前缀相同,直接用上一次的 KV cache,省掉 prefill 阶段的所有计算。
省下来的就是 input 价格的 90%。
这就是为什么 Claude Code 能维持低成本——它每次会话都有大量重复的系统提示、文件树、AGENTS.md 内容,第二次之后这些 Token 全部走缓存价。
我看 Vibe Usage 上 Claude Code 用户的数据:缓存命中率中位数 91%。也就是 90% 以上的 input Token 实际只付 10% 的钱。
实用结论 1:让模型少说
Output 是真贵。让模型少说话直接省钱。
具体动作:
- Prompt 里明确要求简洁输出:"只给我代码,不要解释"。我在系统提示里加了这一句之后,平均输出 Token 下降 40%。
- 拒绝长 commit message / docstring 自动生成。这些都是高 output 任务,每次几百到几千 token。如果不是必需,关掉。
- Code review 模式:让模型只指出问题不写完整修复版——指问题 50 token,写修复 5000 token。
实用结论 2:让缓存命中
Input 缓存是省钱的最大杠杆。让缓存命中要满足两个条件:
- 前缀完全一致——只要中间改一个字,后面的缓存全部失效
- 5 分钟内复用——超时缓存失效
具体动作:
- 不要在系统提示里随机插入时间戳 / UUID。我见过的最大愚蠢,就是有人模板里写「当前时间是 {now()}」,导致每次系统提示都不一样,缓存永远不命中。
- 稳定的内容放前面,多变的放后面。模型缓存是前缀缓存——只要从开头到某一点一致就能命中。把"项目背景 + 工具列表 + 风格约定"放在最前,把"当前任务"放在最后。
- 批量做事——别 5 分钟来一次,一来就是 30 分钟的会话。中间走神超过 5 分钟,缓存就失效。
实用结论 3:警惕 output 比例高的任务
不是所有任务都 output 比例低。我看 Vibe Usage 上不同工具的 output : input 比:
- Codex CLI:3.7%(Agent 模式,大量读、少量写)
- Claude Code:6.4%(chat 模式偏多)
- OpenCode:1.3%(极低,主要是上下文消耗)
- Gemini CLI:26.9%(高,因为 Gemini 经常被用来做长输出场景)
- 通用聊天:50%+(一问一答,输出量大)
如果你某个工具的 output 比例突然冒尖,说明你在做"让模型多说话"的事。看一下是不是真有必要。
实用结论 4:选对模型档位
同一家厂商往往有 mini / small / medium / large 四档。价格差好几倍。
- 简单代码补全 / 短问答:mini 模型够用。比如 GPT-4o-mini、Claude Haiku。
- 常规编码任务:medium 是最优解。Claude Sonnet、GPT-5(standard)。
- 复杂推理 / 系统设计 / 难 debug:large 模型才值。Claude Opus、GPT-5.5 thinking。
把所有任务都用 large 模型是最贵的浪费方式。我有一段时间一直用 Opus,后来切到 Sonnet 之后输出质量没明显变化,账单降了 80%。
怎么知道自己当前结构
抽象讲容易,关键是看自己的真实分布。打开 Vibe Usage 的 Token 分布视图,能看到你按工具、按模型、按 Token 类型(input / output / cached)的占比。
我建议每周看一次。如果 output 比例突然涨——你在做什么"让模型多说话"的事?如果缓存命中率掉——你的 prompt 里是不是混进了易变内容?这些问题不看数据永远发现不了。
把 Vibe Usage 装上看一遍自己的真实结构,比读这篇文章更值。