返回博客

成本优化指南

通过模型路由降低 API 成本:先使用廉价模型,再升级

将简单请求发送给廉价模型,仅升级困难的请求。查看 10,000 个请求在 10%、30% 和 50% 升级率下的混合成本,以及一个简短的 Python 路由器。

作者:CheapTokens Team发布于 6 分钟阅读

封面:请求首先发送给廉价模型,仅当卡住时才升级到第二个模型
本页内容
  1. 你的哪些请求是简单的?
  2. 10,000 个请求的成本:级联 vs 路由器
  3. Python 中的路由器:两次调用和一次检查
  4. 自我检查
  5. 下一步去哪里

当廉价模型的首次处理比第二个模型便宜得多,且升级的请求很少时,路由可以削减账单:先将每个请求发送给廉价模型,仅将困难的请求重新发送给第二个模型。是否真正节省取决于你升级的请求比例。以下是 10,000 个请求在 10%、30% 和 50% 升级率下的算术,以及一个可以粘贴到项目中的 Python 函数。

这种模式并不新鲜。Anthropic 的工程文章 "Building effective agents"(2024 年 12 月 19 日)称之为路由工作流:常见、简单的问题交给更小、成本更低的模型,不寻常、困难的问题交给能力更强的模型。该文章没有给出价格,因此这里的数字是我们自己的,基于 CheapTokens 的实时价格。

你的哪些请求是简单的?#

只有当你能用规则说明“困难”的含义时,路由才有效。不是凭感觉,而是代码可以检查的规则。选择最接近你情况的情形:

选择你的情况

选择你的情形

支持聊天机器人

大多数工单是简短的常见问题:我的订单在哪里,如何重置密码。少数需要冗长、仔细的回答。简单:第一个模型回答并且不回复 UNSURE。困难:它说 UNSURE,或者回答被截断(finish_reason 为 length)。

文档流水线

每个文档首先经过提取。简单:结果解析为包含所有必填字段的有效 JSON。困难:解析失败或字段为空。只有这些文档会在第二个模型上重新运行。

编码代理

简单编辑交给廉价模型。当同一步骤连续失败两次,或回答被截断(finish_reason 为 length)时,升级该步骤。

除非你告诉模型如何表达,否则不要因为“模型听起来不确定”而升级。一行指令(“如果无法回答,请准确回复 UNSURE”)将感觉转化为 if 可以读取的内容。

10,000 个请求的成本:级联 vs 路由器#

假设你运行一个支持机器人,每月 10,000 个请求。平均请求输入 800 个 token,输出 300 个 token。这些是假设;请从 usage 替换为你自己的数据(我们的 token 计数文章 显示了从哪里读取它们)。

有两种方式连接路由,它们的计费方式不同:

  • 级联。 每个请求都发送给廉价模型。比例为 p 的请求未通过检查,并再次发送给第二个模型。这些请求被支付两次:成本 = N × [廉价 + p × 第二个]。
  • 路由器。 一个小型分类器调用预先决定。简单的请求交给廉价模型,困难的直接交给第二个模型:成本 = N × [(1 − p) × 廉价 + p × 第二个],加上每个请求的分类器。

我们将使用级联,因为它不需要分类器,并且更容易上手。第一遍是 GLM-5.3-Flash(zai-org/GLM-5.3-Flash,390K 上下文,最多 8,192 输出 token)。第二遍是 DeepSeek-V4-Flash 版本 0731(deepseek-ai/DeepSeek-V4-Flash-0731,380K 上下文,最多 32,768 输出 token),因此无法在 8,192 token 内完成的回答有空间完成。两者在总成本上都比 OpenRouter 便宜,输入和输出一起计算;下面的实时表格显示了 OpenRouter 列在我们旁边。

第一遍始终覆盖所有 10,000 个请求:8,000,000 输入和 3,000,000 输出 token。第二遍仅覆盖升级的比例。最后一列是替代方案:所有 10,000 个请求直接使用第二个模型。

升级比例 第二遍 token(输入 / 输出) 第一遍,所有 10,000 第二遍,仅升级 全部在第二个模型上,所有 10,000
10% 800,000 / 300,000 $0.28 $0.042 $0.42
30% 2,400,000 / 900,000 $0.28 $0.126 $0.42
50% 4,000,000 / 1,500,000 $0.28 $0.21 $0.42

将每行中的第一遍和第二遍列相加,得到级联的月度成本,然后将该总和与最后一列比较。第一遍是固定成本,只有第二遍随 p 增长。这就是级联的全部故事:你升级得越多,就越接近为工作支付两次费用。

以下是所有模型同时处理相同负载的情况,以便你看到单模型选项的位置:

模型 每次请求 10,000 次请求 OpenRouter,10,000 次请求
GLM-5.3-Flash $0.000028 $0.28 $0.517
DeepSeek-V4-Flash $0.000042 $0.42 $0.98
MiniMax-M2.7 $0.000085 $0.85 $10.20

每次请求 800 个输入 token 和 300 个输出 token。每 100 万 token 的价格为当前价格,会随我们的资费一同变动;OpenRouter 列显示相同工作负载的参考价格。

什么时候级联不值得?当第一遍加上升级比例的成本高于将所有请求发送给第二个模型时。用符号表示:廉价 + p × 第二个 < 第二个,这意味着 p < 1 − 廉价/第二个。对于这对模型,在此负载下第一遍的成本占第二个模型价格的显著部分,因此级联的收益缩小,在高升级比例下消失。在 50% 时,级联可能输给简单地将所有 10,000 个请求发送给第二个模型,因此在承诺之前,请检查两遍的总和与最后一列的对比。比率取决于你的输入/输出组合,因为两个模型对两侧的定价不同,所以请从你自己的行中读取。

路由器变体增加了一件事:分类器。假设它在廉价模型上每个请求读取 300 个输入 token 并以 5 个 token 回答。对于 10,000 个请求,即 3,000,000 输入和 50,000 输出 token,每月额外 $0.062。将此行与第一遍列的份额 p(10%、30% 或 50%)比较:这就是级联在随后升级的请求上运行第一遍所浪费的。如果分类器行更大,级联是更便宜的起点;如果更小,路由器节省更多。

在构建任何东西之前,先试试你自己的数字:

成本计算器

支持机器人的一个月,全部在一个模型上

每次请求的输入 token 数: 800 · 每次请求的输出 token 数: 300 · 每日请求数: 10,000

模型每天每月
GLM-5.3-Flash$0.28$8.40
DeepSeek-V4-Flash$0.42$12.60
MiniMax-M2.7$0.85$25.50

将 runs 改为你的量,并读取每个模型的总计。然后使用上表查看第二遍会增加多少。

Python 中的路由器:两次调用和一次检查#

两个模型位于一个 OpenAI 兼容的基础 URL 和一个余额之后,因此路由不需要第二个账户或密钥。下面的代码是一个示例:其中的数字(max_tokens,UNSURE 规则)由你调整。第二次调用获得更高的 max_tokens,因此被截断在 600 token 的回答可以完成。基础 URL、模型 ID 等都在 CheapTokens 文档 中。

python
import os
from openai import OpenAI

client = OpenAI(
    base_url='https://api.cheaptokens.dev/v1',
    api_key=os.environ['CHEAPTOKENS_API_KEY'],
)

CHEAP = 'zai-org/GLM-5.3-Flash'
SECOND = 'deepseek-ai/DeepSeek-V4-Flash-0731'
SYSTEM = 'Answer briefly. If you cannot answer well, reply exactly UNSURE.'


def ask(model, question, max_tokens):
    r = client.chat.completions.create(
        model=model,
        max_tokens=max_tokens,
        messages=[
            {'role': 'system', 'content': SYSTEM},
            {'role': 'user', 'content': question},
        ],
    )
    choice = r.choices[0]
    return choice.message.content or '', choice.finish_reason


def needs_escalation(text, finish_reason):
    return finish_reason == 'length' or not text.strip() or 'UNSURE' in text


def answer(question):
    text, why = ask(CHEAP, question, 600)
    if needs_escalation(text, why):
        text, why = ask(SECOND, question, 4000)
        if 'UNSURE' in text:
            text = 'Sorry, I could not answer this one.'
    return text
路由流程:请求、廉价模型、检查、第二个模型、回复
级联:第二个模型只看到未通过检查的请求

三个习惯使这诚实而不仅仅是便宜:

  • 计算升级次数。 记录 needs_escalation 触发的频率。那就是你的 p,它是决定级联是否划算的数字。
  • 在你自己的测试集上选择第二个模型。 从日志中取 50 个困难请求,通过两个模型运行,仅当第二个模型修复了第一个模型遗漏的请求时才保留它。其文档优势是 32,768 token 的回答限制,你自己的集合显示这是否是你需要的优势。
  • 发送相同的请求,而不是更长的请求。 如果你将失败的回答粘贴到第二次调用中,你会将其作为输入付费。除非第一个回答是真正有用的上下文,否则请干净地开始第二遍。
一个升级的请求:第一个模型回复 UNSURE,第二次调用返回答案
一个请求通过路由器:检查前后

自我检查#

快速检查

在级联中,30% 的请求在第一个模型上未通过检查。这些请求的成本是什么?

显示答案

答案: 第一个模型的价格加上第二个模型的价格

当你丢弃第一个回答时,第一次调用已经计费。升级的请求支付两次,这就是为什么份额 p 决定一切。

下一步去哪里#

如果你不确定哪个模型应该承担第一遍,MiniMax-M2.7 vs DeepSeek-V4-Flash 按任务比较它们。对于按任务而非按 token 的视图,请参阅 每 1M token 的价格 vs 每任务成本,对于多步骤循环,请参阅 如何估算 AI 代理的成本。每个模型的实时价格在 定价页面 上,模型页面是 DeepSeek 和 GLM。