总结
- 需要做api成本预算的理由是:防止“功能很好,但公司亏钱”
- api成本预算的公式是:成本 = (输入 token 数 × 输入单价) + (输出 token 数 × 输出单价)
- 粗算:一段 1000 字中文 ≈ 1000 tokens, 一段 2000 英文字符 ≈ 500 tokens
- 真实项目中的隐藏成本: Embedding 成本,重试成本,流量 & 带宽,向量数据库费用等
- 优化的方案:做限流,做缓存,用小模型做预处理,裁剪历史对话控制 max_tokens等
为什么要做API成本核算
防止“功能很好,但公司亏钱”
举个🌰👇🏻
GPT-4o 输入/输出 的官方 Token 单价
- 输入 tokens(prompt/请求) :大约 2.50美元 / 1 M tokens(即每个 token ~ $0.0000025)
- 输出 tokens(模型生成的内容) :大约 10.00美元 / 1 M tokens(即每个 token ~ $0.00001)
- 每次对话消耗 10k tokens(假设输入 5k + 输出 5k)
- 使用 GPT-4 级别模型
- 单次成本假设 $0.0625
- 1 万日活用户 × 每人 5 次
每天成本:
10000 × 5 × 0.0625 = $3,125
一个月就是:
$93,750
如果咱们产品一个月收入才 5 万人民币,那直接凉凉。
所以,在 AI 项目里,不会算 API 成本 == 不具备上线能力。
如何核算API成本
一、核心公式
大模型 API 成本本质是:
成本 = (输入 token 数 × 输入单价) + (输出 token 数 × 输出单价)
举例说明(以gpt-4o模型为例):
- 输入:$2.50/ 100万 tokens
- 输出:$10.00 / 100万 tokens
如果一次对话:
- 输入 2000 tokens
- 输出 1000 tokens
那么这一次对话的成本如下:
输入成本 = 2000 × 2.50 / 1,000,000 ≈ $0.005
输出成本 = 1000 × 10.00 / 1,000,000 ≈ $0.01
总成本 ≈ $0.015
二、Token 怎么估算?
咱们不可能每次都真实算,不是需要很精细的地方,粗略估算的话,以如下方法进行即可
文本换算token平替
英文:
1 token ≈ 4 字符
中文:
1 token ≈ 1-1.5 个汉字
所以,一般核算直接用如下数据带入就好:
- 一段 1000 字中文 ≈ 1000 tokens
- 一段 2000 英文字符 ≈ 500 tokens
完整项目成本估算步骤
如果领导(老板,面试官)问:
如果你要做一个 AI 产品,你如何估算成本?
我们可以这样答:
第一步:估算单次请求成本
统计:
- 系统 prompt 多长?
- 用户平均输入多少?
- 模型平均输出多少?
- 是否有历史对话?
比如:
系统提示:800 tokens
用户输入:500 tokens
历史对话:2000 tokens
模型输出:1000 tokens
总输入:
3300 tokens
第二步:估算日活和调用次数
假设:
- DAU = 5000
- 每人每天 10 次提问
总调用次数 = 50000 次 / 天
第三步:算每日成本
单次成本 × 调用次数 = 每日成本
比如:
单次 $0.02
50000 × 0.02 = $1000 / 天
一个月就是:
$30000
老板听到这个数字才会认真。
四、真实项目里的隐藏成本
很多人只算模型费,其实还包括:
Embedding 成本
如果你做 RAG:
- 每次查询都要 embedding
- 每条数据也要 embedding
要单独算。
向量数据库费用
- 存储费用
- 查询费用
流量 & 带宽
如果是流式输出(SSE),长连接会占资源。这个倒是不花钱,就是扣除你一个http请求的资格,(chrome内核的浏览器http并发最多六个)
重试成本
- 超时
- 用户刷新
- 网络断线
真实消耗往往比理论高 10%–30%。每次重试根据项目的工程步骤不同搞不好还得花钱。(比如某个功能里面有一个agent要过几道ai 模型反馈,结果断在了最后一道。前面作废,重新花钱来)
五、优化成本的方法
1. 控制 max_tokens
限制模型输出 token 有两个明显好处:
- 更容易控制成本上限,便于预算核算。
- 提高输出的可控性,避免模型产生大量冗余内容,有些模型天然喜欢废话。节省费用。
但缺点也很明显:不适合进行大范围的详细解说。
但是这个缺陷个人认为不重要,大部分问题都可以在4000token内解说清楚,符合大部分用户需求,而针对那小部分用户,完全可以通过 工程手段去检测 ”详细,明确,更多,精讲“关键字的,动态调整 4000 token的 prompt。
2. 裁剪历史对话
只保留最近几轮,这样可以减少模型输入的消耗
3. 用小模型做预处理
例如: 分类, 意图识别
用便宜模型先判断。
4. 做缓存
- 相同问题直接缓存结果
- embedding 结果缓存
最后
如果对你有用的话