GPT-4账单2300块后,我才发现System Prompt用错了
上周收到账单,GPT-4 API 调用费干掉了 2300 块。
就一个月。
我盯着那个数字看了得有五分钟,咖啡都凉透了。旁边同事问我怎么了,我把屏幕转过去,他看了一眼,说了句"卧槽"。
后来花了两周把 Token 消耗砍掉 60%,效果还没怎么打折。今天把这些省钱套路全抖出来,特别是最后一条,知道的人真不多。
先搞明白钱是怎么没的
很多人以为 API 调一次就花一次钱。不是的。计费按 Token 算,Token 不是你发了多少个字,是模型怎么切你的文本。
一个挺残酷的事实:中文的 Token 消耗通常是英文的 2-3 倍。
我测过,同样一句话:
- 英文 "How are you?" → 4 tokens
- 中文 "你好吗?" → 8 tokens
意思一样,中文直接翻倍。所以如果你 Prompt 全是中文,成本天然就比英文用户高。这不是什么秘密,但 OpenAI 的文档里也不会特意告诉你。
等等,这里我要更正一下——准确说不是"翻倍",是中文每个汉字大概占 1.5-2 个 Token,英文一个单词通常 1-2 个 Token,但英文单词短,整体下来中文确实贵不少。我刚开始算的时候也搞混过。
第一刀:砍 System Prompt
刚用 GPT API 那会儿,我的 System Prompt 长这样:
你是一个资深的、经验丰富的、专业的前端开发工程师,
拥有 10 年以上 React 开发经验,精通 TypeScript、
Next.js、状态管理、性能优化...光这一段就 80 多个 Token。每次调用都带着。一天调 500 次,一个月光 System Prompt 就烧掉几百块。
优化后:
你是 React 专家,用 TypeScript。回答简洁,不解释基础概念。12 个 Token。效果差不多。模型不需要你夸它,真的。
踩坑提醒:别把 System Prompt 当说明书写。我一开始恨不得把整个项目文档塞进去,后来发现模型根本记不住那么多,白白烧钱。现在我的原则是:System Prompt 不超过 3 句话,每句话不超过 20 个字。嗯...这个其实没有严格验证过,但我自己的经验是这样。
第二刀:历史消息瘦身
对话类应用最烧钱的就是历史消息。每次请求都要把之前所有对话重新发一遍,Token 消耗指数级增长。
说个血泪教训:去年 11 月做了个客服机器人,用户平均对话 20 轮。第 20 轮的时候,单次请求的 Token 消耗是第一轮的 15 倍。15 倍啊。
省钱方案:
- **滑动窗口**:只保留最近 6-8 轮对话,旧的直接丢弃
- **摘要压缩**:超过 10 轮时,用便宜模型(GPT-4o-mini 或者 DeepSeek V3)把历史对话总结成一段话,替换掉原始消息
- **智能截断**:用户消息保留完整,AI 回复只保留关键信息,砍掉客套话
我们现在的做法是混合策略:最近 5 轮完整保留,5-15 轮用摘要,15 轮以上全丢掉。成本降了 45%,用户完全没感觉。这个数字是我上周刚算的,之前估算的是 40%,后来拉了下监控才发现实际更高。
第三刀:别杀鸡用牛刀
这可能是最立竿见影的一招。
我见过太多人什么任务都用 GPT-4。写个分类标签用 GPT-4,提取关键词用 GPT-4,连格式化 JSON 都用 GPT-4。大哥,格式化 JSON 你用 JSON.stringify 不行吗。
不同任务的模型选择,我觉得大概是这样的:
- **简单分类、情感分析、关键词提取** → DeepSeek V3 或者 GPT-4o-mini,便宜到可以忽略不计
- **文本润色、翻译、摘要** → Claude 3.5 Haiku 或者 GPT-4o-mini,性价比之王
- **复杂推理、代码生成、长文创作** → 才轮到 GPT-4o 或 Claude 3.5 Sonnet
我们做了个实验:用 DeepSeek V3 替代 GPT-4 做内容分类,准确率从 96% 降到 94%,但成本从每月 800 块降到了 30 块。2% 的准确率换 96% 的成本下降,这买卖太划算了。老板看了直呼好家伙。
第四刀:缓存
这个被严重低估了。
如果你的应用有重复请求——同样的 System Prompt、相似的用户问题——缓存能省下一大笔钱。
两种策略:
1. 精确匹配缓存:完全相同的请求直接返回缓存结果,一分钱不花。适合 FAQ 场景
2. 语义缓存:意思相近的问题(比如"怎么退款"和"如何申请退款"),用向量相似度匹配,命中率更高
我们用 Redis 做了一层语义缓存,embedding 模型用的是 text-embedding-3-small,命中率大概 30%。也就是说 30% 的请求根本不到模型那一层,直接省下来了。
不过有个坑:缓存过期时间要设好。我一开始设了 24 小时,结果用户问"今天天气"返回的是昨天的缓存,被人截图发群里嘲笑。后来改成动态内容 5 分钟、静态内容 1 小时,才没再翻车。这个 TTL 配置我调了大概三四版,现在算是稳定了。
第五刀:别让模型废话
模型默认的输出有时候真的很啰嗦。你问它"这个报错怎么修",它先给你解释一遍这个错误是什么、为什么会出现、有哪些可能原因,最后才说怎么修。谁要听你讲课啊。
强制精简的方法:
- System Prompt 里加一句:`用不超过 100 字回答`
- 设置 `max_tokens` 参数,物理截断
- 用 JSON 模式,让模型只返回结构化数据
我们有个接口原本平均输出 800 Token,加上 max_tokens=200 之后,模型被迫学会了精炼表达。信息密度反而更高了。这个挺反直觉的,但确实是这样。
我现在的技术栈
折腾了两个月,目前稳定运行这套方案:
- **网关层**:统一做鉴权、限流、缓存,用的 Nginx + Lua
- **路由层**:根据任务复杂度自动分配模型,简单任务走便宜模型
- **监控**:Grafana 面板实时看每个接口的 Token 消耗和成本,异常马上飞书告警
上个月账单 940 块。同样业务量,从 2300 降下来的。
最后说一个反直觉的点
省钱不代表效果变差。
有些优化反而让输出质量更高了。比如限制输出长度之后,模型不再废话连篇,回复更精准。比如做历史消息瘦身之后,模型反而不会被太早的上下文带偏。
所以别把省钱当成妥协。当成工程优化来做。
你们在 API 调用上踩过什么坑?或者有什么省钱妙招?评论区聊聊,我请喝咖啡,虚拟的那种 ☕
#AI #Token计费 #省钱攻略 #API优化 #LLM
读者评论 2