📌 内容摘要
- Claude API 按实际消耗的 token 计费,理解计费逻辑是控制成本的第一步。
- 三档模型价格差5倍,选对模型是最大的省钱机会——90%的任务不需要最贵的 Opus。
- 两个官方省钱机制:Batch API(5折)和 Prompt Caching(最高省90%),很多人不知道。
- 附成本估算代码,输入你的业务规模,算出三个模型的月费对比。
一、计费基础:Token 是什么,怎么数
Claude API 不按次收费,按 token 收费。Token 是模型处理文本的基本单位,大概理解为:
| 文本类型 | 大约换算 | 1000 token 约等于 |
|---|---|---|
| 英文 | 约 4 字符 = 1 token | 约 750 个单词 |
| 中文 | 约 1.5 字 = 1 token | 约 650 个汉字 |
| 代码 | 约 3-4 字符 = 1 token | 约 40-60 行 |
| JSON | 约 3 字符 = 1 token | 取决于结构复杂度 |
计费分两部分,输入和输出分开算,输出的价格通常是输入的 5 倍:
- 输入 token:你发给 Claude 的所有内容——System Prompt + 对话历史 + 当前消息 + 工具定义
- 输出 token:Claude 生成的回复内容
多轮对话时,每次请求都要带上完整的历史消息——10轮对话的第10次请求,输入 token 会包含前9轮的所有内容。对话越长,成本增加越快。这是做聊天机器人时最容易低估成本的地方。
二、三档模型价格对比(2026年3月)
| 模型 | 输入价格 | 输出价格 | 适合场景 |
|---|---|---|---|
| Haiku 4.5 | $1 / M tokens | $5 / M tokens | 分类、提取、简单问答、高频调用 |
| Sonnet 4.6 | $3 / M tokens | $15 / M tokens | 日常开发首选、对话、内容生成 |
| Opus 4.6 | $5 / M tokens | $25 / M tokens | 复杂推理、代码架构、深度分析 |
M = 百万。单位:美元。以上为官方标准价格,2026年3月。
价格差距直观感受:处理同样的任务,Opus 的输出费用是 Haiku 的 5 倍。如果你每天调用 10000 次、每次平均输出 500 token:
- 全用 Haiku:约 $25 / 月
- 全用 Sonnet:约 $75 / 月
- 全用 Opus:约 $125 / 月
选对模型,月费差距可以达到 5 倍。
三、省钱技巧一:选对模型(最大杠杆)
最有效的省钱方法不是压缩 Prompt,而是为不同任务选合适的模型。以下是决策框架:
| 任务类型 | 推荐模型 | 理由 |
|---|---|---|
| 情感分析 / 文本分类 | Haiku | 输出简短,任务简单,Haiku 完全够用 |
| 信息提取 / JSON 格式化 | Haiku | 结构化任务,高频调用优先省钱 |
| 客服对话 / FAQ 回答 | Haiku 或 Sonnet | 先用 Haiku,效果不满意再升 Sonnet |
| 内容生成 / 文章写作 | Sonnet | 质量和成本的最佳平衡点 |
| 代码生成 / 调试 | Sonnet | Sonnet 代码能力和 Opus 差距不大但便宜很多 |
| 复杂架构分析 / 深度推理 | Opus | 这类任务调用频率低,贵一点可以接受 |
| 意图识别(用于路由) | Haiku | 判断用户意图后再调贵模型,整体省钱 |
混合路由策略:用 Haiku 分流,节省 40-60% 成本
import anthropic
client = anthropic.Anthropic()
def smart_route(user_message: str) -> str:
"""
先用 Haiku 判断任务复杂度,再选对应模型
简单任务用 Haiku 直接回答,复杂任务转 Sonnet
"""
# 第一步:用 Haiku 判断复杂度(成本极低,约0.001分/次)
complexity_check = client.messages.create(
model = "claude-haiku-4-5-20251001",
max_tokens = 8,
messages = [{
"role": "user",
"content": f"判断以下问题的复杂度:simple 或 complex。只输出一个词。\n\n问题:{user_message}"
}]
)
complexity = complexity_check.content[0].text.strip().lower()
# 第二步:根据复杂度选模型
if "simple" in complexity:
model = "claude-haiku-4-5-20251001"
else:
model = "claude-sonnet-4-6"
# 第三步:用选定的模型回答
response = client.messages.create(
model = model,
max_tokens = 1024,
messages = [{"role": "user", "content": user_message}]
)
print(f"[使用模型:{model}]")
return response.content[0].text
# 测试
print(smart_route("2+2等于几")) # 用 Haiku
print(smart_route("帮我设计一个分布式缓存架构")) # 用 Sonnet
四、省钱技巧二:Batch API 打五折
Anthropic 提供 Batch API,异步批量处理请求,价格是标准 API 的 50%。适合不需要实时响应的任务——批量分类、离线内容生成、数据处理流水线。
import anthropic
import time
client = anthropic.Anthropic()
# 准备批量任务
texts_to_classify = [
"这款手机拍照真的太棒了!",
"质量很差,根本不值这个价",
"还行,凑合能用",
"包装很精美,快递也快",
"假货,和描述完全不符",
]
# 构建批量请求
requests = [
anthropic.types.MessageCreateParamsNonStreaming(
model = "claude-haiku-4-5-20251001",
max_tokens = 16,
messages = [{
"role": "user",
"content": f"判断情感(只输出:正面/负面/中性):{text}"
}]
)
for text in texts_to_classify
]
# 提交批量任务
batch = client.messages.batches.create(requests=requests)
print(f"批量任务已提交:{batch.id}")
print(f"预计节省:50% 费用(相比实时 API)")
# 等待完成(实际项目可以存 batch.id,之后再查)
while True:
status = client.messages.batches.retrieve(batch.id)
print(f"状态:{status.processing_status}")
if status.processing_status == "ended":
break
time.sleep(10)
# 获取结果
for result in client.messages.batches.results(batch.id):
if result.result.type == "succeeded":
idx = int(result.custom_id.split("_")[-1]) if "_" in result.custom_id else 0
output = result.result.message.content[0].text
print(f"文本:{texts_to_classify[idx][:20]}... → {output}")
每日批量跑数据(报表、标注、摘要)、离线内容审核、大量文档处理——这类任务不需要用户等待实时回复,用 Batch API 直接砍掉一半成本,是性价比最高的省钱手段。
五、省钱技巧三:Prompt Caching 最高省 90%
如果你每次请求都带着同一段很长的内容(比如一份10万字的文档、或者固定的 System Prompt),可以启用 Prompt Caching。被缓存的内容首次读取计费,后续读取只收 10% 的价格。
import anthropic
client = anthropic.Anthropic()
# 一份很长的文档(实际使用中可能有几十万 token)
LONG_DOCUMENT = """
[你的长文档内容,比如一份产品手册、法律文件等]
""" * 100 # 模拟长内容
# 启用缓存:在需要缓存的内容后面加 cache_control
response = client.messages.create(
model = "claude-sonnet-4-6",
max_tokens = 1024,
system = [
{
"type": "text",
"text": f"你是文档分析助手。以下是参考文档:\n\n{LONG_DOCUMENT}",
"cache_control": {"type": "ephemeral"}, # 标记为可缓存
}
],
messages = [{"role": "user", "content": "文档的主要内容是什么?"}],
)
# 查看缓存命中情况
usage = response.usage
print(f"输入 token:{usage.input_tokens}")
print(f"缓存写入:{getattr(usage, 'cache_creation_input_tokens', 0)}")
print(f"缓存命中:{getattr(usage, 'cache_read_input_tokens', 0)}")
# 第一次:cache_creation_input_tokens > 0(写入缓存,收1.25倍费用)
# 后续次:cache_read_input_tokens > 0(读缓存,只收0.1倍费用)
# 对同一文档继续提问,后续请求就会命中缓存
response2 = client.messages.create(
model = "claude-sonnet-4-6",
max_tokens = 1024,
system = [
{
"type": "text",
"text": f"你是文档分析助手。以下是参考文档:\n\n{LONG_DOCUMENT}",
"cache_control": {"type": "ephemeral"},
}
],
messages = [{"role": "user", "content": "文档提到了哪些风险?"}],
)
print(f"\n第二次请求缓存命中:{getattr(response2.usage, 'cache_read_input_tokens', 0)} tokens")
六、省钱技巧四:精简 System Prompt 和对话历史
"""
多轮对话的成本陷阱:
第1轮:输入=50 tokens,输出=100 tokens → 总计 150 tokens
第2轮:输入=50+100+50=200 tokens,输出=100 → 总计 300 tokens
第3轮:输入=200+100+50=350 tokens,输出=100 → 总计 450 tokens
第4轮:输入=350+100+50=500 tokens,输出=100 → 总计 600 tokens
10轮对话后,光输入就有几千 token
解决方案:滑动窗口——只保留最近 N 轮
"""
def trim_history(
history: list[dict],
max_turns: int = 10, # 保留最近10轮
max_tokens: int = 4000, # 或者按 token 数限制
) -> list[dict]:
"""
裁剪对话历史,控制输入 token 数量
保留最新的 max_turns 轮(每轮 = 1 user + 1 assistant)
"""
# 方法一:按轮数截断(简单,推荐)
max_messages = max_turns * 2 # 每轮2条消息
if len(history) > max_messages:
return history[-max_messages:]
return history
def estimate_tokens_rough(text: str) -> int:
"""粗略估算 token 数(不需要调 API,用于决策)"""
# 中英文混合时的经验公式
chinese_chars = sum(1 for c in text if '\u4e00' <= c <= '\u9fff')
other_chars = len(text) - chinese_chars
return int(chinese_chars * 1.5 + other_chars / 4)
# 精简 System Prompt 的原则
VERBOSE_SYSTEM = """
你是一个非常专业的、经验丰富的客服助手,你的职责是帮助用户解决各种各样的问题,
你需要保持礼貌、专业、友善的态度,始终以用户满意为目标,在回答问题时要详细、
全面、准确,不要给出错误的信息,如果不确定就说不知道……(500字)
"""
CONCISE_SYSTEM = """你是专业客服助手。礼貌、准确,不确定时直说。"""
# 从 500 字压缩到 20 字,每次请求节省约 100 tokens
# 每天1万次调用 × 100 tokens × Sonnet价格 = 每天约 $0.045,每月约 $1.35
七、省钱技巧五:max_tokens 按任务设,不要一刀切
"""
max_tokens 不影响实际计费——Claude 自然结束时不会因为 max_tokens 大就多收钱。
但 max_tokens 设太大会影响 Claude 的输出倾向:
设大了 → Claude 倾向于生成更长的回复 → 更多输出 token → 更贵
按任务类型设置合理的 max_tokens:
"""
TASK_MAX_TOKENS = {
"classify": 16, # 分类:只需要一个词
"extract": 256, # 提取:结构化信息
"chat": 512, # 对话:一段话
"summarize": 1024, # 摘要:几段话
"write": 4096, # 写作:长内容
"code": 4096, # 代码:完整函数
}
import anthropic
client = anthropic.Anthropic()
def smart_complete(message: str, task_type: str) -> str:
max_tokens = TASK_MAX_TOKENS.get(task_type, 1024)
response = client.messages.create(
model = "claude-haiku-4-5-20251001",
max_tokens = max_tokens,
messages = [{"role": "user", "content": message}]
)
return response.content[0].text
# 分类任务用 max_tokens=16,避免 Claude 多说废话
result = smart_complete("这条评论是好评还是差评:'东西不错'", "classify")
print(result) # 输出:好评
八、成本估算计算器
def estimate_monthly_cost(
daily_requests: int,
avg_input_tokens: int,
avg_output_tokens: int,
model: str = "all",
) -> dict:
"""
估算月度 API 费用
Args:
daily_requests: 每日请求数
avg_input_tokens: 平均输入 token 数(含 system prompt 和历史)
avg_output_tokens: 平均输出 token 数
model: 指定模型或 "all" 显示所有模型对比
"""
# 2026年3月官方价格(美元/百万token)
prices = {
"haiku": {"input": 1.0, "output": 5.0},
"sonnet": {"input": 3.0, "output": 15.0},
"opus": {"input": 5.0, "output": 25.0},
}
monthly_requests = daily_requests * 30
results = {}
for model_name, price in prices.items():
input_cost = monthly_requests * avg_input_tokens / 1_000_000 * price["input"]
output_cost = monthly_requests * avg_output_tokens / 1_000_000 * price["output"]
total = input_cost + output_cost
results[model_name] = {
"monthly_requests": monthly_requests,
"input_cost_usd": round(input_cost, 2),
"output_cost_usd": round(output_cost, 2),
"total_usd": round(total, 2),
"total_cny": round(total * 7.24, 1), # 参考汇率
}
return results
def print_cost_report(daily_requests, avg_input, avg_output):
print(f"\n{'='*55}")
print(f"月度成本估算")
print(f"日请求量:{daily_requests:,} 输入:{avg_input} tokens 输出:{avg_output} tokens")
print(f"{'='*55}")
print(f"{'模型':<10} {'输入费用':>10} {'输出费用':>10} {'月总费用':>12} {'人民币':>10}")
print("-" * 55)
results = estimate_monthly_cost(daily_requests, avg_input, avg_output)
for name, data in results.items():
print(
f"{name:<10} "
f"${data['input_cost_usd']:>9.2f} "
f"${data['output_cost_usd']:>9.2f} "
f"${data['total_usd']:>11.2f} "
f"¥{data['total_cny']:>9.1f}"
)
haiku_cost = results["haiku"]["total_usd"]
opus_cost = results["opus"]["total_usd"]
print(f"\n选 Haiku vs Opus:每月节省 ${opus_cost - haiku_cost:.2f}")
print(f"{'='*55}")
# 示例:客服机器人,每天1万次对话
print_cost_report(
daily_requests = 10_000,
avg_input = 500, # system prompt + 历史 + 用户消息
avg_output = 200, # 客服回复
)
# 示例:批量文本分类,每天100万条
print_cost_report(
daily_requests = 1_000_000,
avg_input = 100, # 简短文本 + 分类指令
avg_output = 10, # 只输出类别
)
九、省钱总结:按优先级排序
| 优先级 | 方法 | 实施难度 | 节省幅度 |
|---|---|---|---|
| ⭐⭐⭐⭐⭐ | 按任务选模型(Haiku/Sonnet/Opus) | 低 | 最高 80% |
| ⭐⭐⭐⭐ | 离线任务用 Batch API | 低 | 固定 50% |
| ⭐⭐⭐⭐ | 长文档反复查询用 Prompt Caching | 中 | 最高 90% |
| ⭐⭐⭐ | 裁剪对话历史(滑动窗口) | 低 | 10-30% |
| ⭐⭐⭐ | 精简 System Prompt | 低 | 5-15% |
| ⭐⭐ | 按任务类型设合理的 max_tokens | 低 | 5-10% |
| ⭐⭐ | Haiku 做意图识别路由 | 中 | 20-40% |
常见问题
Q:充值的钱会过期吗?
Anthropic 的预付额度(Credits)目前没有明确的有效期,充了之后按使用量消耗。但具体政策以官方最新说明为准,建议不要一次充太多,够用3-6个月就好。
Q:怎么设置消费上限,防止代码 Bug 导致超额消费?
在 console.anthropic.com → Billing → Usage limits 里可以设置月度消费上限,超过后 API 调用会返回错误而不是继续扣费。建议在项目上线前就设好上限,防止意外的循环调用或并发失控。
Q:同样是 Sonnet,为什么有时候一次请求花了很多 token?
多轮对话时检查输入 token 数——每次请求的"输入"包含了完整的历史消息。10轮对话后,光历史消息就可能有几千 token。用本文的滑动窗口方法控制历史长度,是最有效的解决方式。
总结
Claude API 的成本控制核心是三件事:选对模型(不是所有任务都需要 Opus)、用好两个官方折扣机制(Batch API 五折、Prompt Caching 九折)、控制输入长度(对话历史要裁剪、System Prompt 要精简)。用本文的成本估算代码,输入你的实际业务规模,就能算出在三个模型下的月费差距——这个数字通常比直觉中大得多,值得认真对待。