大语言模型 API 费用优化指南:让成本降低 60% 的 7 个技巧
系统讲解 LLM API 计费原理,以及 Prompt 压缩、模型选择、缓存、批量处理等实用降本技巧,附代码示例。
NixAPI Team 2025年2月3日
约 10 分钟阅读
大模型 API 按 Token 计费,Token 就是文本的”碎片”,大约每 1.5 个中文字或每个英文单词算 1-2 个 Token。
许多团队上线 AI 功能后,发现 API 费用飙升——其实大部分浪费都可以避免。本文整理了 7 个经过验证的降本技巧。
理解计费:Input + Output Token
总费用 = Input Token × 单价 + Output Token × 单价
- Input:你发给模型的内容(System Prompt + 历史对话 + 当前问题)
- Output:模型回复的内容
Output 单价通常是 Input 的 3-4 倍,所以控制输出长度收益更大。
技巧 1:选对模型——不要用大炮打蚊子
最简单直接的省钱方法:任务不复杂,就别用最贵的模型。
| 任务类型 | 推荐模型 | 成本对比 |
|---|---|---|
| 简单分类、提取关键词 | GPT-4o mini / Claude Haiku | 基准 1× |
| 普通问答、摘要 | GPT-4o mini | ~5× |
| 复杂推理、代码生成 | GPT-4o / Claude 3.5 Sonnet | ~15× |
| 最复杂任务 | o1 / Claude Opus | ~50× |
很多场景用 GPT-4o mini 完全够用,成本只有 GPT-4o 的 1/10。
技巧 2:压缩 System Prompt
System Prompt 每次请求都会消耗 Input Token,要精简再精简:
# ❌ 啰嗦版(约 80 token)
system = """
你是一个非常专业的客服助手。你的职责是回答用户关于我们产品的问题。
请确保你的回答准确、有帮助,并且保持友好的语气。如果你不知道答案,
请直接说不知道,不要编造信息。
"""
# ✅ 精简版(约 30 token)
system = "客服助手。准确回答产品问题,不确定时直接说不知道。"
每次节省 50 token,如果每天 10 万次请求,一个月就省了 1.5 亿 token。
技巧 3:限制输出长度
明确告诉模型只需要简短回答:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[...],
max_tokens=200, # ← 硬限制
# 在 prompt 里也要说清楚
)
同时在 Prompt 里补充:「请用 100 字以内回答」,双重限制效果更好。
技巧 4:多轮对话裁剪历史记录
多轮对话中,历史越来越长,Token 消耗指数级增长:
def trim_history(messages, max_tokens=3000):
"""保留最新 N 个 token 的历史,System Prompt 始终保留"""
system = [m for m in messages if m["role"] == "system"]
others = [m for m in messages if m["role"] != "system"]
# 粗略估算:4 个字符 ≈ 1 token
total = sum(len(m["content"]) // 4 for m in others)
while total > max_tokens and len(others) > 1:
removed = others.pop(0) # 删除最早的消息
total -= len(removed["content"]) // 4
return system + others
技巧 5:用缓存避免重复计算
相同的请求不要每次都打 API:
import hashlib, json
from functools import lru_cache
def cache_key(model, messages):
payload = json.dumps({"model": model, "messages": messages}, sort_keys=True)
return hashlib.md5(payload.encode()).hexdigest()
# 简单内存缓存(生产环境用 Redis)
_cache = {}
def cached_completion(model, messages, **kwargs):
key = cache_key(model, messages)
if key in _cache:
return _cache[key] # 直接返回,不耗 Token
result = client.chat.completions.create(
model=model, messages=messages, **kwargs
)
_cache[key] = result
return result
FAQ 类问题缓存命中率可以达到 60% 以上。
技巧 6:Batch API 批量处理
非实时任务(数据分析、批量翻译等)用 Batch API,价格是实时接口的一半:
# 准备批量任务
tasks = [
{"custom_id": f"task-{i}", "method": "POST", "url": "/v1/chat/completions",
"body": {"model": "gpt-4o-mini", "messages": [{"role": "user", "content": text}]}}
for i, text in enumerate(texts_to_process)
]
# 提交批量任务(24小时内完成,价格减半)
batch = client.batches.create(
input_file_id=upload_file(tasks),
endpoint="/v1/chat/completions",
completion_window="24h",
)
技巧 7:监控 Token 消耗,找出大头
先知道钱花在哪里,才能有针对性地优化:
# 每次请求后记录用量
usage = response.usage
print(f"本次:input={usage.prompt_tokens}, output={usage.completion_tokens}")
# 写入日志/数据库,按功能模块统计
log_usage(
feature="chat",
model=model,
input_tokens=usage.prompt_tokens,
output_tokens=usage.completion_tokens,
)
通常会发现 20% 的功能消耗了 80% 的 Token,集中优化这部分即可。
小结
| 技巧 | 预期节省 |
|---|---|
| 模型降级 | 50-90% |
| 压缩 System Prompt | 10-30% |
| 限制输出长度 | 20-50% |
| 裁剪历史记录 | 20-60% |
| 缓存重复请求 | 30-60% |
| Batch API | 50% |
多管齐下,整体降本 60% 完全可以实现。
👉 在 NixAPI 使用,国内直连,价格透明,欢迎试用。