接 Claude 的开发者常遇到两件事:一是按「字数」估出来的费用和账单差一大截,二是同一段对话重发几次成本不一样。问题多半不在模型,而在没分清哪几类 token 各自计价、缓存和重试落在哪一栏。这篇按「口径—估算—核对」三步走,给一份能照着做的清单,单价数字一律到站内页面看当时的值。
接 Claude 的开发者常遇到两件事:一是按「字数」估出来的费用和账单差一大截,二是同一段对话重发几次,成本看着不一样。问题多半不在模型,而在没分清哪几类 token 各自计价、缓存和重试落在哪一栏。这篇按「口径—估算—核对」三步走,给一份能照着做的清单。
先说清楚一个前提:下面出现的所有单价、倍率、折扣,一概不写具体数字,因为各家渠道、各时间点都不一样。你要数字的时候,去站内价格页看当时的报价,再拿本文的口径去套。
先分清 Claude 账单里到底有哪几栏 token
很多人估费失败,第一步就错了:把一次请求的所有 token 加起来乘一个单价。Claude 的用量记录一般是分栏的,输入和输出分开,缓存相关的读写又各占一栏。你至少要能把「普通输入」「输出」「缓存写入」「缓存读取」这四类分清楚,才能开始算钱。
- 输入 token
- 你发给模型的内容,包括系统提示、历史对话、工具定义、用户这句话本身
- 输出 token
- 模型生成的内容,通常比输入贵,估费时不能和输入共用单价
- 缓存读取
- 命中缓存的那部分输入,计价方式通常和普通输入不是一回事
- 缓存写入
- 第一次把内容写进缓存时的额外开销,属于一次性投入
- 输入与输出分开计价,输出通常更贵,别用一个单价乘总 token 数
- 缓存读写往往单列成不同栏目,命中与未命中走的价格不是一回事
- 工具调用、系统提示、历史上下文都会计入输入侧,长会话越往后越贵
- 同一段对话里,上一轮的回答会变成下一轮的输入,成本是滚雪球式的
- 不适用的情况:只做一次性短问答、不开缓存、不带工具的脚本,基本只有输入输出两栏,按两栏算就行
估算一次调用的花费:从用量记录倒推,而不是靠字数猜
「我这句中文大概几十个字,应该不贵」——这种估法在短问答里凑合能用,一上多轮对话和缓存就崩。靠谱的做法是从接口返回的用量字段或者你自己的日志里拿真实 token 数,而不是数汉字。
- 先把日志分列每次请求记四个数:普通输入 token、缓存读取 token、缓存写入 token、输出 token。口径一致是后面所有计算的前提,混在一列里就没法比。
- 再确认单价对应哪一栏拿总数乘单价之前,先看一眼这个单价是给输入还是给输出的。去站内价格页核对当时的各栏报价,别把输入的价套到输出上。
- 用站内换算工具对一遍自己算完再到站内换算工具跑一遍,两个结果差得多,说明你对口径的理解有问题,回去看是哪一栏串了。
- 小样本推算整体挑一天的真实流量,算出单次平均成本,再乘以预估调用量。比拿一段测试文本拍脑袋乘一个大数靠谱得多,也更容易发现异常。
| 容易错的假设 | 实际情况 | 怎么修正 |
|---|---|---|
| 按汉字数估 token | 中英文、代码、符号的 token 密度不一样 | 用接口返回的用量字段,不数字符 |
| 输入输出一个价 | 输出那栏通常更贵 | 分两栏算,各自套对应单价 |
| 缓存总能命中 | 改一个字可能就整段失效 | 按保守命中率估,留出余量 |
| 重发不计费 | 超时重试往往照样算钱 | 把重试次数计入调用量 |
账单和预估对不上时,按这个顺序排查
对不上不要先怀疑模型涨价,绝大多数情况是口径问题。下面这个顺序是从最常见到最少见排的,照着走一遍基本能找到差在哪。
- 先看缓存栏:缓存没命中会按普通输入重新计一遍,等于白写一次
- 再看重试:超时或限速后的重发,通常照样计费,等于同一份输入付了两遍
- 然后看单次请求里塞了多少历史上下文,多轮对话的输入是累积的
- 接着看是不是有后台任务或定时脚本在偷偷跑,账单一栏突然涨多半是它
- 最后看计价口径本身,中转渠道的折算方式可能和官方不一样,去站内页面对一遍
还有一个容易被忽略的点:不同中转渠道对同一模型的折算规则未必一致。你在 A 站算得刚刚好,换到 B 站可能就有出入。这种情况去站内的可信度检测和价格追踪页面看当前的折算说明,别拿旧截图当依据。
把可控变量收住的几个动作
计费口径是别人定的,你改不了;但命中率、会话长度、调用时机这几件事在你手里。把这几件收住,账单的波动会明显变小。
| 可控变量 | 动作 | 判断标准 |
|---|---|---|
| 缓存命中率 | 系统提示和固定背景放进缓存,别每次重发全文 | 改动频繁的内容不要硬塞进缓存,省不了还添乱 |
| 会话长度 | 超过一定轮数做摘要压缩,不原样续聊 | 看单次请求输入 token 是否随轮数持续走高 |
| 任务分流 | 能接受延迟的批量任务另走一条路 | 实时交互和批量任务混用一套计价,成本不好归因 |
| 预算告警 | 设调用量和花费上限,超了就通知 | 跑飞的当晚能发现,而不是月底看账单 |
- 把系统提示和固定背景知识放进缓存,别每次重发全文
- 控制会话长度,超过一定轮数就做摘要压缩,而不是原样续着聊
- 对能接受延迟的批量任务另走一条路,别和实时请求挤同一套计价
- 设预算告警上限,跑飞的当晚就能发现,而不是月底看账单
- 定期回头对一次日志和账单,偏差变大说明有新变量进来了
如果上面这些都做了还是对不上,那可能不是你的问题,而是渠道侧的折算规则变了。这种情况值得去站内的价格追踪和可信度检测页面看一眼当前状态,再决定要不要换渠道。
下一步:把当前单价和折算规则核一遍口径搞清楚了,数字还是得以当时的报价为准。去站内价格页看 Claude 各栏的最新单价,再到价格追踪页对一下你正在用的渠道最近有没有变动,两边一比就知道该不该调整估算模型。→常见问题
Claude 计费是按字数还是按 token?
按 token,不按汉字或字符个数。同样一段中文,不同分词方式得到的 token 数不一样,所以拿字数乘一个系数只能当粗略上限。真要看数字,把文本丢进站内 Token 换算工具跑一遍,再去官方价格页对单价。
输入和输出的价格一样吗?
不一样,通常输出更贵,而且缓存读写又是另外的价位。所以估算时不能用「总 token × 一个单价」,得先把输入、输出、缓存几栏拆开分别乘,再相加。具体倍数到站内官方 API 价格页看当时的数字。
对话被限速后重发一次,会不会算两次钱?
多数情况下会。请求已经到达并产生计算就会被计费,重试等于再发一次新请求,输入侧照样算。想少踩这个坑,重试要做退避和去重,别在超时后无脑连发。