首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >多模型 API 成本核算实战:把「每百万 token 单价」换算成一张可交付的月度预算表

多模型 API 成本核算实战:把「每百万 token 单价」换算成一张可交付的月度预算表

原创
作者头像
张玉良聊AI转型
发布2026-09-20 10:32:31
发布2026-09-20 10:32:31
680
举报

文中价格均取自官方定价页并标注数据日期;所有金额示例均为演示数据,不代表真实账单。 数据截至 2026-08-24,正式预算前请以官方定价页复核。

一、这道题为什么总是答不上来

做 AI 应用的同学大概率被问过一句话:「这个功能跑一个月,大概多少钱?」

答不上来通常不是数学问题,而是计费模型的问题。AI API 的账单由四个维度共同决定:调的是哪个模型、输入多少 token、输出多少 token、走没走缓存与错峰。任何只报一个「单价」的答案都是不完整的,因为不存在「一次调用多少钱」这个固定值——同样一次调用,成本可能相差十倍。

更麻烦的是价格本身在高频变动。2026 年 8 月就同时发生了两件事:DeepSeek 自 8 月 17 日起执行峰谷定价,V4-Pro 高峰输出价抬到每百万 token 27 元;Anthropic 在 8 月 24 日确认 Claude Sonnet 5 的涨价取消,输入 2 美元、输出 10 美元从「限时介绍价」转为标准价。拿三个月前的表格做预算,结论必然是错的。

这篇文章给一套能直接落地的核算链路:对齐口径 → 单价存档 → 代码算账 → 优化动作。四步走完,你交付的不再是一个含糊的「大概几百美元」,而是一张有来源、有日期、可复核的预算表。

二、第一步:把计费口径对齐(四个维度,缺一不可)

在写任何代码之前,先把下面五条钉死,否则数字没有意义。

  1. 单位是每百万 token(/M)。官方标 $10/M,指每 100 万 token 10 美元,即每千 token 0.01 美元。把 $10/M 误读成「每次 10 美元」,成本瞬间放大三个数量级。
  2. 输入与输出分列计价。输出价通常是输入价的数倍(Sonnet 5 为 5 倍)。只报一个价格的方案,要么不专业,要么在误导。
  3. 缓存是第三个计费维度。支持 prompt 缓存的模型,缓存命中价远低于常规输入价。「命中率」必须进核算字段。
  4. 峰谷是第四个维度。部分模型分时段计价,把可延迟任务挪到闲时,输出成本可直接减半。
  5. 数据必须带日期与来源。没有日期的价格表等于废纸,这一点在评审时尤其重要。

三、第二步:单价存档(带来源日期)

以下是 2026-08-24 口径的核心单价,单位为美元 / 每百万 token:

模型

输入价

输出价

缓存命中

数据来源与日期

Claude Sonnet 5

$2.00

$10.00

$0.20

Anthropic 官方定价页,2026-08-24 确认转正为标准价

Claude Opus 5

$5.00

$25.00

以官方页为准

官方定价页快照,2026-08-24

Claude Haiku 4.5

$1.00

$5.00

以官方页为准

官方定价页快照,2026-08-24

DeepSeek V4-Pro(高峰)

¥27.00

DeepSeek 官方新规,2026-08-17 起执行

DeepSeek V4-Pro(闲时)

¥13.50

DeepSeek 官方新规,2026-08-17 起执行

两个实用提醒:

  • 不要背书。单价应当以「数据字典」形式存在代码或配置中心里,每条记录带 as_of 日期字段。价格更新时改一处,全链路生效。
  • 币种不要混算。美元与人民币的单价必须在同一张报表里先统一币种再汇总,否则月度合计没有意义。

四、第三步:代码算账(可直接抄走)

下面这段代码把上面四个维度全部覆盖:输入输出分列、缓存命中单独计价、峰谷分档、月度汇总。Python 3.10+ 可直接运行。

代码语言:python
复制
# token_cost.py —— 单次调用成本 + 月度预算核算
from dataclasses import dataclass


@dataclass(frozen=True)
class Price:
    """单价结构:每百万 token 的计价,as_of 必须写数据日期。"""
    input_per_m: float
    output_per_m: float
    cache_hit_per_m: float = 0.0   # 无缓存价的模型置 0
    as_of: str = ""


# 单价存成数据字典:一处维护,全链路引用(口径见第三节,2026-08-24)
PRICE_BOOK: dict[str, Price] = {
    "claude-sonnet-5": Price(2.00, 10.00, cache_hit_per_m=0.20, as_of="2026-08-24"),
    "claude-opus-5":   Price(5.00, 25.00, as_of="2026-08-24"),
    "claude-haiku-4.5": Price(1.00, 5.00, as_of="2026-08-24"),
}

# DeepSeek V4-Pro 输出价:高峰 ¥27 / 闲时 ¥13.5(官方新规,2026-08-17)
DEEPSEEK_V4_PRO_OUTPUT = {"peak": 27.0, "off_peak": 13.5}


def call_cost(model: str, input_tokens: int, output_tokens: int,
              cached_tokens: int = 0) -> float:
    """单次调用成本:常规输入 + 缓存命中 + 输出,三段分别计价。"""
    p = PRICE_BOOK[model]
    billed_input = max(input_tokens - cached_tokens, 0)          # 未命中部分走常规输入价
    hit_price = p.cache_hit_per_m or p.input_per_m               # 无缓存价则按输入价计
    cost = billed_input / 1_000_000 * p.input_per_m
    cost += cached_tokens / 1_000_000 * hit_price
    cost += output_tokens / 1_000_000 * p.output_per_m
    return round(cost, 6)


def deepseek_output_cost(output_tokens: int, peak: bool = True) -> float:
    """DeepSeek 输出成本:按峰谷档位计价。"""
    return round(output_tokens / 1_000_000 * DEEPSEEK_V4_PRO_OUTPUT["peak" if peak else "off_peak"], 6)


def monthly_budget(calls_per_day: int, unit_cost: float, days: int = 30) -> float:
    """月度预算 = 日调用量 × 单次成本 × 工作天数。"""
    return round(calls_per_day * unit_cost * days, 2)


if __name__ == "__main__":
    # 示例 1:标准问答,输入 2000 / 输出 500,其中 1600 命中缓存
    unit = call_cost("claude-sonnet-5", 2000, 500, cached_tokens=1600)
    print("Sonnet 5 单次:", unit, "USD / 月度(1000 次/天):",
          monthly_budget(1000, unit), "USD")

    # 示例 2:批处理生成,单次输出 5000 token,日 10 万次
    peak = monthly_budget(100_000, deepseek_output_cost(5000, peak=True))
    off = monthly_budget(100_000, deepseek_output_cost(5000, peak=False))
    print("DeepSeek 高峰月度:", peak, "CNY / 闲时月度:", off, "CNY / 节省:", round(peak - off, 2))

跑完这两个示例,你会得到两个非常具体的数字:一个是「长上下文 + 缓存」场景下的单次成本,一个是「批处理错峰」能省下的金额。这两个数字,就是预算表的两端。

五、最容易算错的三处

坑一:把 /M 看成每次都收费。 这是最高频的错误,后果是预算放大 1000 倍。

坑二:只算输出,漏算输入。 对话、Agent、RAG 场景里输入往往远超输出。举个例子:单次输入 20,000 token、输出 800 token,用 Sonnet 5,输入成本 0.04 美元、输出成本 0.008 美元——输入占了 83%。账单高而输出量不大,问题多半出在 prompt 塞了太多上下文。

坑三:无视缓存与峰谷。 多轮对话场景下,同样 10,000 token 的固定前缀,无缓存每轮约 0.023 美元,开启缓存后约 0.005 美元,差距接近 5 倍。峰谷同理:DeepSeek 场景把可延迟任务挪到闲时,输出成本直接减半。

六、把成本压下去的三个杠杆

  1. 错峰:可延迟的批处理、报表、离线摘要类任务,全部排到闲时段执行,这是零改造成本、收益最确定的一项。
  2. 缓存:把稳定的系统提示词、知识前缀做成可缓存前缀,命中率是唯一需要盯的指标。
  3. 上下文瘦身:RAG 场景做召回裁剪与去重,把「塞进去的字数」当成成本项来管——减少 30% 上下文,通常比换模型省得更多。

七、把核算固化成可重复动作

单价每月在动,靠手算和记忆维护不了。我们团队的做法是把它固化成技能(Skill),在对话里直接问结果:输入模型、日调用量、输入输出 token 量,输出覆盖输入/输出/缓存/峰谷四类计价的结构化账单,并强制标注单价来源与数据日期——未知价格会先确认,绝不臆造数字

相关技能已发布在 SkillHub:搜索「AI Token 成本计算器」与「Claude API 价格查询」即可安装,前者负责算账、后者负责查实时价,两个配合使用即可覆盖「查价 → 算账」的完整链路。

八、可信度与来源说明

  • Claude 系列单价:Anthropic 官方定价页,Sonnet 5 的 $2/$10 为 2026-08-24 官方确认的标准价;
  • DeepSeek V4-Pro 峰谷价:DeepSeek 官方定价页 2026-08-17 新规,高峰 ¥27 / 闲时 ¥13.5(每百万输出 token);
  • 本文金额均为示例数据,用于演示计算方法,不作为真实账单依据;
  • 模型价格处于高频调整期,本表标注日期为 2026-08-24,预算前请复核最新官方单价。

如果你正在做多模型接入或成本治理,欢迎在评论区交流你们的字段设计与对账口径。


Link AI 提供企业级多模型 API 统一接入与成本管理服务,文中单价数据取自官方定价页实时数据。

(内容由 AI 辅助整理,价格以官方定价页为准)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、这道题为什么总是答不上来
  • 二、第一步:把计费口径对齐(四个维度,缺一不可)
  • 三、第二步:单价存档(带来源日期)
  • 四、第三步:代码算账(可直接抄走)
  • 五、最容易算错的三处
  • 六、把成本压下去的三个杠杆
  • 七、把核算固化成可重复动作
  • 八、可信度与来源说明
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档