调用 Claude API 被扣了很多钱但不知道为什么?这篇文章解释清楚 Token 是什么、怎么计算、API 费用如何产生,以及 5 个有效降低成本的方法。
Token 是什么?
Token 是大模型处理文本的基本单位,既不是字符也不是单词,而是介于两者之间的"词片段"。
英文规律:大约 1 个单词 = 1.3 个 Token
- "Hello" → 1 token
- "Hello world" → 2 tokens
- "anthropic" → 1 token
- "AI programming" → 3 tokens
中文规律:大约 1 个汉字 = 1-2 个 Token
- "你好" → 2-3 tokens
- "人工智能编程" → 7-10 tokens
- 中文比英文消耗更多 Token(同样含义的内容)
代码:代码通常比自然语言更"Token 密集"
- 变量名、括号、缩进都单独计 Token
- 一行 Python 代码大约 5-15 tokens
如何估算 Token 数量
工具:Anthropic Tokenizer
官方提供在线工具:console.anthropic.com/tokenizer
粘贴文本,立即显示 Token 数量。
API 方式预估
调用前先数 Token,避免超额:
import anthropic
client = anthropic.Anthropic()
# 不实际发请求,只统计 Token
response = client.messages.count_tokens(
model="claude-opus-4-5",
system="你是一个 Python 专家",
messages=[
{"role": "user", "content": "解释什么是装饰器,给一个实际例子"}
]
)
print(f"预计输入 Token: {response.input_tokens}")
# 输出:预计输入 Token: 34API 费用是怎么算的?
Claude API 按 Token 双向计费:输入 Token + 输出 Token
2026 年 Claude 模型定价(参考)
| 模型 | 输入(每百万 Token) | 输出(每百万 Token) |
|---|---|---|
| claude-opus-4-5 | $15 | $75 |
| claude-sonnet-4-5 | $3 | $15 |
| claude-haiku-3-5 | $0.8 | $4 |
最新价格以 Anthropic Console 为准
一次 API 调用的费用计算
场景:用 claude-sonnet-4-5 写一篇 500 字的技术总结
输入:系统提示(50 tokens) + 用户消息(200 tokens) = 250 tokens
输出:生成内容约 600 tokens
费用 = (250/1,000,000 × $3) + (600/1,000,000 × $15)
= $0.00000075 + $0.000009
≈ $0.00001(不到 1 分钱)
看起来很便宜?但输出比输入贵 5 倍,高频调用或长上下文时成本会快速累积。
上下文长度为什么会影响成本?
每次 API 调用,整个对话历史都作为输入 Token 计费。
第 1 轮:输入 100 tokens,输出 200 tokens → 计 300 tokens
第 2 轮:输入 (100+200+新问题100) tokens,输出 200 tokens → 计 600 tokens
第 3 轮:输入 (100+200+100+200+新问题100) tokens ... → 越来越贵
这就是为什么长对话成本会指数级增长。
5 个降低 API 成本的方法
方法 1:选对模型
不是所有任务都需要最强模型:
| 任务类型 | 推荐模型 | 理由 |
|---|---|---|
| 简单分类、格式转换 | claude-haiku-3-5 | 速度快、成本低 10-20 倍 |
| 日常问答、代码补全 | claude-sonnet-4-5 | 质量和成本均衡 |
| 复杂推理、架构设计 | claude-opus-4-5 | 最强推理,值得多花钱 |
实战技巧:先用 Haiku 跑,只有结果不满意才升级到 Sonnet/Opus。
方法 2:批量 API(省 50%)
非实时任务用批量 API,费用减半:
import anthropic
client = anthropic.Anthropic()
# 批量提交 1000 个任务,异步处理,费用 -50%
batch = client.messages.batches.create(
requests=[
{
"custom_id": f"task-{i}",
"params": {
"model": "claude-haiku-3-5",
"max_tokens": 200,
"messages": [{"role": "user", "content": texts[i]}]
}
}
for i in range(len(texts))
]
)
# 稍后轮询结果
print(f"批次 ID: {batch.id}")适合:批量分类、大量数据处理、离线生成任务。
方法 3:Prompt 缓存(Cache Control)
系统提示或大段文档不变时,用缓存避免重复计费:
response = client.messages.create(
model="claude-opus-4-5",
max_tokens=1024,
system=[
{
"type": "text",
"text": "你是一个代码审查专家..." + 长达 10000 token 的规范文档,
"cache_control": {"type": "ephemeral"} # 缓存这部分
}
],
messages=[{"role": "user", "content": "审查这段代码..."}]
)缓存命中时,这部分 Token 费率降低 90%。适合:
- 固定的长系统提示
- 每次调用都带入的大文档
- 多轮对话中不变的背景信息
方法 4:控制输出长度
# 设置合理的 max_tokens,避免无限生成
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=500, # 根据实际需要设置
messages=[{"role": "user", "content": "用 2 句话总结这篇文章"}]
)在 Prompt 里明确说明长度要求:
- "用不超过 200 字回答"
- "只给代码,不要解释"
- "一句话总结"
方法 5:管理对话上下文
长对话中定期清理不必要的历史:
# 不要无限积累历史,保留最近 N 轮
def keep_recent_messages(messages, max_turns=10):
# 保留 system 消息 + 最近的对话
recent = messages[-max_turns * 2:] if len(messages) > max_turns * 2 else messages
return recent或者用 Claude Code 时,任务完成后 /clear 清空上下文,开新任务从干净状态开始。
监控成本的工具
Anthropic Console:console.anthropic.com/settings/limits
- 查看当月用量和费用
- 设置支出上限(超额自动停止)
- 按 Workspace 隔离不同项目的费用
代码里统计:
response = client.messages.create(...)
print(f"本次调用:")
print(f" 输入: {response.usage.input_tokens} tokens")
print(f" 输出: {response.usage.output_tokens} tokens")
print(f" 缓存命中: {response.usage.cache_read_input_tokens} tokens")快速估算工具
简单记忆公式:
英文文本:字符数 ÷ 4 ≈ Token 数
中文文本:字符数 × 1.5 ≈ Token 数
来源:Anthropic API 文档 + 定价页面