logo

大模型调用成本如何评估:价格与性能的综合判断

作者:KAKAKA2026.11.11 03:22浏览量:0

简介:价格上涨时,如何判断大模型服务是否划算?本文提出"有效成本"框架,把单次调用价格、任务一次通过率和人工修正成本放在同一个计算中,并给出可直接运行的成本估算与评测代码,帮助开发者和企业用真实数据完成选型与预算决策。

一、先看任务,不看单价

大模型服务通常按调用量计费。新版本上线时,单价比上一代高一截很常见,但单价本身无法回答”贵不贵”。判断标准应该是:完成一项业务任务需要花多少钱,结果质量是否达标。

常见的判断误区有三种:

  • 只看单价:忽略了一次任务是否需要重试,以及需要多少人工复核。
  • 只看公开榜单:通用评测分数与自身业务的数据分布未必一致。
  • 只看个人体验:少量试用样本难以代表线上的长尾输入。

因此,性价比判断要从”单次调用价格”走向”单个成功任务的总成本”。

二、把单价拆解为单任务成本

多数按量计费的服务,成本由输入和输出两部分构成。常见计费维度包括输入token数、输出token数、缓存命中情况和批量调用方式。具体折扣和规则以服务方公布的价目为准,下面只讨论通用的计算方法。

单次调用成本可以写成:

单次成本 = 输入token数 × 输入单价 + 输出token数 × 输出单价

一个业务任务常常包含多次调用,例如先检索、再生成、最后校验。任务成本是所有调用之和。

  1. def call_cost(input_tokens, output_tokens, in_price, out_price):
  2. """计算单次调用成本。价格单位为每百万token的金额。"""
  3. return (input_tokens * in_price + output_tokens * out_price) / 1_000_000
  4. def task_cost(calls):
  5. """calls 为列表,每项为 (输入token, 输出token, 输入单价, 输出单价)。"""
  6. return sum(call_cost(i, o, ip, op) for i, o, ip, op in calls)

三、用有效成本衡量性价比

单次调用便宜,不代表业务成本低。任务失败会带来重试开销和人工修正开销,还会拖慢流程。因此需要引入有效成本:

有效成本 = 单任务成本 ÷ 一次通过率 + 单次人工修正成本 × 失败率

这里的一次通过率,指任务输出在无需重试、无需人工干预的情况下达到验收标准的比例。该公式假设每次失败都要重做一次,平均每个成功任务需要 1/通过率 次尝试。

下面的数字是假设值,只用于说明计算方式,不代表任何真实服务的表现。

  • 方案A:单任务成本1.0元,一次通过率60%,人工修正成本2.0元。
    有效成本 = 1.0 ÷ 0.6 + 2.0 × 0.4 ≈ 2.47 元
  • 方案B:单任务成本为A的2.5倍,即2.5元,一次通过率95%,人工修正成本同为2.0元。
    有效成本 = 2.5 ÷ 0.95 + 2.0 × 0.05 ≈ 2.73 元

在这组假设下,单价更高的方案有效成本反而略高。但如果人工修正成本提高到5.0元,结果变为A约3.67元、B约2.88元,结论就会反转。可见,结论取决于通过率和失败代价这两个参数,必须用实测数据代入计算。

  1. def effective_cost(unit_cost, pass_rate, review_cost):
  2. """计算单个成功任务的有效成本。pass_rate 取值范围为 (0, 1]。"""
  3. if pass_rate <= 0:
  4. raise ValueError("pass_rate 必须大于 0")
  5. return unit_cost / pass_rate + review_cost * (1 - pass_rate)

四、建立与业务对齐的评测集

通过率必须通过实测获得。建议按以下步骤构建评测集:

  1. 抽取真实输入:从线上日志中抽样,避免只用人工构造的理想样本。
  2. 分层:按任务类型划分,例如简单问答、长文档摘要、结构化抽取、代码生成。每层保证足够样本量。
  3. 定义验收标准:可以是标准答案比对、规则检查(如JSON是否合法、必填字段是否齐全),也可以是评分量表。
  4. 盲评:评审人员不知道输出来自哪个模型,减少主观偏差。
  5. 定期更新:业务数据分布会变化,评测集需要定期补充新样本。

下面的代码用于在同一批样本上运行候选方案,统计通过率、平均成本和P95延迟:

  1. import time
  2. def run_eval(samples, model_call, check, in_price, out_price):
  3. """
  4. samples: 列表,每项包含 input 和 expected 字段
  5. model_call: 函数,输入 input,返回包含 text、input_tokens、output_tokens 的字典
  6. check: 函数,输入 (输出文本, expected),返回 True 或 False
  7. """
  8. passed, total_cost = 0, 0.0
  9. latencies = []
  10. for sample in samples:
  11. start = time.perf_counter()
  12. resp = model_call(sample["input"])
  13. latencies.append(time.perf_counter() - start)
  14. total_cost += call_cost(resp["input_tokens"], resp["output_tokens"],
  15. in_price, out_price)
  16. if check(resp["text"], sample["expected"]):
  17. passed += 1
  18. n = len(samples)
  19. latencies.sort()
  20. p95_index = max(0, int(n * 0.95) - 1)
  21. return {
  22. "pass_rate": passed / n,
  23. "avg_cost": total_cost / n,
  24. "p95_latency_s": latencies[p95_index],
  25. }

得到结果后,把 pass_rate 和 avg_cost 代入有效成本公式,即可在同一口径下比较不同方案。

五、性能不只是准确率

除通过率外,选型时还应关注以下维度:

  • 指令遵循:输出格式是否稳定。格式不稳定会直接导致下游解析失败,进而增加重试。
  • 事实一致性:在知识问答和合规文本场景中,错误输出的代价远高于普通失误,需要单独统计。
  • 长上下文表现:输入变长后,回答质量是否明显下降,需要用长文本样本专门测试。
  • 延迟:平均值会掩盖长尾问题,P95和P99更能反映用户实际感受。
  • 稳定性:同一输入多次运行的结果差异,以及服务的可用性记录。

六、按任务难度分流

高价格的模型适合复杂推理、多步骤任务和高风险输出。简单分类、信息抽取、文本改写等任务,较小的模型往往已经足够。通过路由策略把请求分流,可以在保证质量的前提下降低整体成本。

```python
def route(task_type, text_length):
“””阈值应来自评

发表评论

活动