为什么需要成本优化
Token 不是免费的:
客服 Prompt 5000 token(含系统提示 + 示例)
每天 10000 次对话 × 5000 token = 5000 万 token/天
GPT-4o 输入 $5/百万 token
→ $250/天 = $7500/月
→ 一个 Prompt 设计不当,月烧 7500 美元
而优化后:
压缩到 1500 token + 缓存命中 80%
实际付费:1500 × 20% + 500(输出)= 800 token/次
→ $40/天 = $1200/月
→ 省 84%,一年省 $75000
成本优化不是"砍功能",是让每个 Token 花在刀刃上。
Token 成本的 5 个来源
来源 1:系统提示重复发送
每次请求都带完整系统提示(2000 token)
10000 次/天 × 2000 = 2000 万 token/天
→ 这 2000 万 token 内容完全相同,但每次全价付费
解法:Prompt 缓存。
来源 2:冗长示例
Prompt 含 5 个示例,每个 300 token = 1500 token
→ 但实际任务只需 2 个示例
→ 多余 900 token 白付费
解法:示例精简,保留最有代表性的。
来源 3:背景信息过度注入
把整个产品文档(10000 token)塞进 Prompt
→ 每次请求都带,但用户问的可能只需其中 500 token
解法:RAG 检索相关片段注入,而非全量。
来源 4:输出冗长
Prompt 要求"详细回答"
→ AI 输出 1000 token
→ 用户只需 200 token 的答案
解法:加"简洁回答"约束,限制输出长度。
来源 5:大模型干小活
所有请求都走 GPT-4o($5/百万输入)
→ 但 70% 是简单问题(查天气/算账/格式化)
→ 用 GPT-4o-mini($0.15/百万)足够
→ 多付 33 倍价格
解法:模型路由,简单任务转小模型。
四类优化策略
策略 1:压缩(Compression)
把 Prompt 压短,保留语义。
压缩前
你是一位非常专业的客服代表,你的工作是回答用户关于我们产品的问题。
请保持礼貌、专业、耐心。回答时要先给结论,再展开说明。
如果用户的问题你无法回答,请告诉用户你会转接给人工客服。
请用中文回答。回答要分点列出,每点不超过 50 字。
→ 120 token
压缩后
你是客服。先结论后展开,分点,每点≤50字,中文。无法回答转人工。
→ 25 token
节省 80%。 语义不变。
压缩技巧
- 删除冗词("非常专业的"→ 删)
- 合并指令("礼貌专业耐心"→ 删,角色已隐含)
- 用约束代替描述("分点每点≤50字"代替"请用分点列出")
- 示例从 5 个减到 2 个
自动压缩工具
def compress_prompt(prompt: str, target_ratio=0.5) -> str:
"""用小模型压缩 Prompt,保留语义"""
compress_instruction = f"""请压缩以下 Prompt,要求:
1. 保留所有指令和约束
2. 删除冗余修饰词
3. 合并相似指令
4. 示例保留最有代表性的 2 个
5. 目标长度 ≤ 原文的 {int(target_ratio*100)}%
原文:
{prompt}
输出压缩后的 Prompt:"""
# 用便宜的小模型压缩
return call_llm("gpt-4o-mini", compress_instruction)
original = "你是非常专业的客服代表..." # 120 token
compressed = compress_prompt(original, 0.3)
# → 25 token,省 80%
策略 2:缓存(Caching)
固定部分缓存,只付一次。
系统提示(2000 token)+ 固定示例(1000 token)= 3000 token
→ 缓存后只付一次(约 0.1× 价格)
→ 10000 次/天:
无缓存:3000 × 10000 = 3000 万 token × $5 = $150
有缓存:3000 × 1 + 3000 × 10000 × 0.1 = 3 万 + 3 万 = 6 万 token × $5 = $0.3
→ 省 99.8%
详见 Prompt 缓存。
策略 3:路由(Routing)
简单任务转小模型。
def route_model(query: str):
"""按任务复杂度路由到不同模型"""
# 简单任务 → 小模型(便宜 33 倍)
if is_simple(query): # 查询/格式化/翻译
return "gpt-4o-mini" # $0.15/百万
# 复杂任务 → 大模型
return "gpt-4o" # $5/百万
def is_simple(query: str) -> bool:
"""判断是否简单任务"""
simple_patterns = [
r"^\d+[+\-*/]\d+$", # 算术
r"翻译", # 翻译
r"格式化", # 格式化
r"天气", # 查询
]
return any(re.search(p, query) for p in simple_patterns)
# 70% 简单 + 30% 复杂
# 无路由:100% × $5 = $5/百万
# 有路由:70% × $0.15 + 30% × $5 = $0.105 + $1.5 = $1.605/百万
# → 省 68%
策略 4:蒸馏(Distillation)
用大模型生成训练数据,蒸馏出小模型。
Step 1:用 GPT-4o 跑 1000 条任务,记录输入输出
Step 2:用这 1000 条数据微调 GPT-4o-mini
Step 3:微调后的小模型接近 GPT-4o 效果,但成本 1/30
适合:高频固定任务(如客服问答、文档分类)。
成本测算公式
def estimate_cost(
input_tokens: int,
output_tokens: int,
price_in: float, # $/百万 token
price_out: float,
calls_per_day: int,
cache_hit_rate: float = 0,
cache_price: float = 0.1, # 缓存价格倍数
):
"""估算 API 成本"""
# 有效输入 token(扣除缓存命中)
paid_input = input_tokens * (1 - cache_hit_rate)
cached_input = input_tokens * cache_hit_rate
daily_cost = (
paid_input * price_in / 1e6 +
cached_input * price_in * cache_price / 1e6 +
output_tokens * price_out / 1e6
) * calls_per_day
return {
"daily": daily_cost,
"monthly": daily_cost * 30,
"yearly": daily_cost * 365,
}
# 示例
cost = estimate_cost(
input_tokens=3000, # 系统+示例+用户
output_tokens=500, # 输出
price_in=5.0, # GPT-4o 输入
price_out=15.0, # GPT-4o 输出
calls_per_day=10000,
cache_hit_rate=0.8, # 80% 缓存命中
)
print(cost)
# daily: $60, monthly: $1800, yearly: $21900
ROI 评估
优化不是免费的——压缩可能降效果,路由可能降质量。
def optimize_roi(
cost_before, cost_after,
quality_before, quality_after, # 0-1 满意度
calls_per_day
):
"""评估优化 ROI"""
daily_saving = cost_before["daily"] - cost_after["daily"]
quality_drop = quality_before - quality_after
# 每降 1% 质量省多少
saving_per_quality = daily_saving / max(quality_drop * 100, 0.01)
return {
"daily_saving": daily_saving,
"quality_drop": quality_drop,
"$/%": saving_per_quality, # 每降 1% 质量省多少
"verdict": "值得" if quality_drop < 0.05 and daily_saving > 0 else "慎做",
}
原则:质量降幅 < 5% 时,省钱是划算的。降幅 > 10% 时,省的钱可能不够补回流失的用户。
优化优先级
按"省得多 × 风险低"排序:
1. 缓存固定部分 → 省 80%+,零质量风险 ← 先做
2. 路由简单任务 → 省 68%,低风险
3. 压缩 Prompt → 省 50%,低风险
4. RAG 替代全量注入 → 省 90%,中风险
5. 蒸馏小模型 → 省 97%,高风险 ← 谨慎
常见坑点
坑 1:过度压缩丢语义
压缩到 10 token → 指令全没了 → AI 自由发挥
解决:压缩后跑 A/B 测试,质量降幅 < 5% 才上线。
坑 2:缓存命中率假象
缓存命中率 80% → 但实际 80% 是不同请求
→ 缓存没命中,还多付缓存写入费
解决:监控真实命中率,按 版本管理 记录。
坑 3:路由误判
"翻译这段代码注释" → 被判为简单翻译
→ 走小模型 → 代码理解不了 → 翻译错
解决:路由规则要细分,代码相关任务走大模型。
坑 4:蒸馏过拟合
1000 条数据微调 → 只会这 1000 种问法
→ 新问法效果差
解决:数据要覆盖多样性,至少 5000 条,定期补数据。
坑 5:只看单价不看总量
单价降了 50% → 但调用涨了 3 倍
→ 总成本反而升了
解决:监控总成本,不只单价。
与其他技巧的关系
小结
成本优化的核心思想:不是少用,是用得准。
- 压缩 → 每个 Token 都有用
- 缓存 → 相同内容只付一次
- 路由 → 简单任务不请大模型
- RAG → 只注入相关片段
- 蒸馏 → 高频任务沉淀到小模型
配合 缓存、版本管理(每版记成本)、A/B 测试(优化不降质量),你的 Prompt 工程不只是"效果好",更是"花得值"。