上下文窗口、输出上限与缓存计费:长对话为什么越用越贵
用 Claude Code、Codex 写代码时,你可能发现:同一个会话越聊越慢、越聊越贵,甚至突然报「上下文过长」。原因就在上下文和缓存。
三个基本概念#
- 上下文窗口:模型一次最多能「看到」多少 token,包括你发的内容、之前的对话、工具返回的结果,以及它要生成的回答。
- 最大输出:单次回答最多能生成多少 token,通常远小于上下文窗口。
- token:模型处理文本的基本单位。同样长度的文字,中文通常比英文占用更多 token,具体以各模型的分词为准。
为什么长对话越来越贵#
大模型的 API 是无状态的:每发一轮消息,客户端都要把之前的全部对话历史一起再发一遍。
所以第 1 轮发 1 千 token,第 20 轮可能要发 10 万 token。费用按「输入 token + 输出 token」计算,历史越长,每一轮的输入就越多。
Codex 并发多个子任务、Claude Code 读了很多文件时,上下文会涨得更快。
提示缓存(Prompt Caching)怎么帮你省钱#
很多模型支持提示缓存:如果这一轮请求的开头一大段内容和上一轮完全相同,这部分就可以命中缓存,按更低的价格计费,处理也更快。
想让缓存命中率高,要做到:
- 保持前缀稳定:系统提示、工具定义、项目说明放在最前面,并且不要频繁修改。
- 只在末尾追加:不要去改历史消息的中间内容,否则后面的缓存全部失效。
- 动态内容放最后:时间戳、随机 ID 之类每次都会变的内容,不要放在开头。
- 缓存有有效期:隔太久再继续对话,缓存会过期,这一轮会按完整输入计费。
缓存命中的具体折扣,各模型和渠道不同,以控制台的价格说明为准。
实用建议#
| 现象 | 建议 |
|---|---|
| 回答变慢、费用上涨 | 开启新会话(Claude Code 输入 /new),把必要信息写进一个简短的说明里再继续 |
| 提示上下文过长 | 先用 /compact 之类的压缩功能,或直接新开会话 |
| 一次读入很大的日志或文件 | 先筛选出关键部分再贴,不要整份粘贴 |
| 多个子任务并发 | 每个子任务都会带着上下文,注意总量 |
| 想稳定命中缓存 | 保持提示词和工具列表不变,不要中途切换模型 |
小结#
记住三句话
- 每一轮都会重发历史,所以对话越长越贵。
- 前缀稳定、只在末尾追加,缓存才会命中。
- 任务告一段落就新开会话,是最简单有效的省钱办法。
遇到「上下文超限」之类的报错,见 大模型 API 常见报错怎么排查。