前面九篇笔记,我们已经学会了调用大模型 API、管理消息与 token、控制生成参数、处理错误与重试。到此,“能不能跑起来”的问题基本解决了。但从这一篇开始,我们要面对一个更现实的问题:该用哪个模型? 同一个任务,用最强的模型和用最便宜的模型,成本可能相差 25 倍。本文介绍模型选择的核心权衡——能力、延迟、价格,以及如何用代码估算一次调用的成本。

三个权衡维度:能力、延迟与价格

选模型本质上是三件事的权衡:

  • 能力:模型对复杂推理、长文本、代码等任务的完成质量。
  • 延迟:从发出请求到收到完整结果的耗时。
  • 价格:每次调用按 token 计费的花费。

这三者通常互相冲突:能力越强,往往越贵、越慢;便宜的小模型速度快、成本低,但复杂任务上质量不够。所以不存在“最好的模型”,只存在“最适合当前任务的模型”。

判断一个模型够不够用,最直接的办法是拿真实任务做小批量对比测试:同一批输入,分别用候选模型跑一遍,人工或脚本比对输出质量。这个流程看似麻烦,却是避免凭感觉选模型的最可靠方式。

以 GPT-5.6 系列为例看模型分层

以 OpenAI 当前(2026 年 8 月)的 GPT-5.6 系列为例,同一代模型按能力分成三档(价格为每 100 万 token):

模型 定位 输入价格 输出价格
gpt-5.6-sol 旗舰,复杂专业任务 $5.00 $30.00
gpt-5.6-terra 均衡,兼顾质量与成本 $2.00 $12.00
gpt-5.6-luna 低成本,高吞吐场景 $0.20 $1.20

三个模型的上下文窗口都是 1.05M token、最大输出 128K token,主要差别在“思考能力”:它们都支持从 nonemax 的推理档位(reasoning),档位越高输出质量越好,但延迟和成本也越高。注意输入价格从 luna 到 sol 相差 25 倍——选错模型,代价会直接反映在账单上。

计费上还有两个关键点:输出 token 比输入 token 贵(通常是几倍),所以让模型少说废话也能省钱;另外有两个官方省钱机制——缓存输入(命中缓存约按原价 10% 计费,适合重复的固定前缀)和 Batch 批处理(约半价,适合非实时的批量任务)。

成本是怎么算出来的

一次调用的费用 = 输入 token 数 × 输入单价 + 输出 token 数 × 输出单价,单价以每 100 万 token 计。举个例子:一次调用消耗 2000 个输入 token、500 个输出 token,用 gpt-5.6-terra 计算:2000 ÷ 1000000 × 2.00 + 500 ÷ 1000000 × 12.00 = 0.004 + 0.006 = 0.01 美元,折合人民币约 7 分钱。单看一次不贵,但每天调用一万次就是 100 美元——批量场景下成本会迅速累积,这正是模型选择值得专门花一篇来讨论的原因。

按任务匹配模型:一个简单决策思路

不要追求“最强的模型”,而是让模型能力与任务难度匹配。一个实用的决策思路:

  • 简单任务(分类、抽取、改写、翻译):小模型足够,选最便宜的档位。
  • 常规任务(日常问答、一般代码):中等档位,质量与成本均衡。
  • 复杂任务(长文分析、数学推理、高难度代码):旗舰模型,必要时调高 reasoning。

另外两条经验:交互式场景(聊天、客服)优先考虑延迟,别让用户等太久;开发时先用便宜模型把流程调通,确认质量不达标再升级模型,而不是一开始就上旗舰。

最小可运行示例:按任务选模型并估算成本

下面的程序把“选模型”和“算成本”封装起来:根据任务难度选模型,调用后打印 token 用量与估算成本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import os

from openai import OpenAI

client = OpenAI(
api_key=os.environ["OPENAI_API_KEY"],
base_url=os.environ.get("OPENAI_BASE_URL"),
)

# 价格表:每 100 万 token 的美元价格(输入/输出),以官方定价页为准
PRICES = {
"gpt-5.6-sol": (5.00, 30.00),
"gpt-5.6-terra": (2.00, 12.00),
"gpt-5.6-luna": (0.20, 1.20),
}

def pick_model(task: str) -> str:
"""按任务难度选择模型:简单任务用便宜模型。"""
easy_keywords = ("分类", "改写", "翻译", "抽取", "起标题")
if any(k in task for k in easy_keywords):
return "gpt-5.6-luna"
if "代码" in task:
return "gpt-5.6-terra"
return "gpt-5.6-sol"

def chat(task: str) -> None:
model = pick_model(task)
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": task}],
)
usage = resp.usage
input_price, output_price = PRICES[model]
cost = (
usage.prompt_tokens / 1_000_000 * input_price
+ usage.completion_tokens / 1_000_000 * output_price
)
print(f"模型: {model}")
print(f"输入 {usage.prompt_tokens} token,输出 {usage.completion_tokens} token")
print(f"估算成本: ${cost:.6f}")
print(resp.choices[0].message.content)

if __name__ == "__main__":
chat("把这句话翻译成英文:你好,世界。")
chat("写一段 Python 代码,判断一个数是否为质数。")

几个关键点:

  • pick_model 用关键词做最简单的任务分级,实际项目中可以换成更细的规则,或后续文章要讲的模型路由。
  • resp.usage 返回 prompt_tokenscompletion_tokens,是计费的真实依据;成本公式就是“输入 token 数 × 输入单价 + 输出 token 数 × 输出单价”,注意单价以 100 万 token 为单位。
  • 模型名和价格会随官方调整,建议把模型名放进环境变量(如 MODEL_NAME)统一管理,并定期核对官方定价页。

常见问题

是不是越贵的模型越好? 不是。对分类、改写这类简单任务,贵模型和小模型的输出质量几乎没有差别。把简单任务交给旗舰模型,等于花 25 倍的钱买同样的结果。

模型名会不会变? 会。服务商会发布新模型、弃用旧模型,价格也会调整。不要把模型名硬编码散落在代码里,统一放在配置或环境变量中,并在新模型发布时重新评估。

怎么知道一次调用花了多少钱? 看响应里的 usage 字段:里面有输入和输出的 token 数,乘上对应单价即可。想控制成本就先从这里记账,找出消耗最大的调用路径。

延迟太高怎么办? 先检查是不是模型选大了。把简单任务切到小模型,或降低 reasoning 档位,通常立竿见影;交互场景还可以用前面学过的流式输出改善首字体验。

什么时候应该调高 reasoning 档位? 当你发现当前模型或低档位在复杂推理上明显出错、而任务又必须保证质量时。reasoning 档位越高,模型花在内部推理上的时间越长,质量通常越好,但延迟和成本同步上升。默认从低档位开始,按实际效果逐步调高,是控制成本最稳妥的做法。

小结

  • 模型选择的本质是在能力、延迟、价格三者间权衡,三者通常此消彼长。
  • 同一代模型往往分多个档位,价格可能相差数十倍,先让任务难度匹配模型档次。
  • 计费按输入、输出 token 分别计价,输出更贵;缓存输入和 Batch 是两种省钱手段。
  • resp.usage 记账并估算成本,是控制开销的第一步。
  • 实践顺序:先用便宜模型跑通流程,质量不达标再升级模型。

下一篇开始进入提示词阶段,我们学习如何写出清晰、稳定的提示词。