batch-job-model-routing · ZH · 2026-10-18

通宵批处理拆给便宜模型和强模型:十行代码能写出的分流规则

介绍如何按任务难度将批处理作业拆分为便宜模型和强模型,给出可落地的分流规则与示例代码,并说明同一 API key 下的成本对比方法。

为什么要把批处理拆开

通宵批处理通常包含大量条目,但并非所有条目都需要同等强度的模型。把简单条目交给便宜模型、难条目交给强模型,可以在保证质量的同时控制成本。本文给出一套可落地的分流规则和十行左右的代码示例,并说明如何在同一把 API key 上做成本对比。

分流的核心思路

分流的本质是给每个条目打一个“难度分”,然后按阈值路由。难度分可以来自:

  • 规则判断:文本长度、是否包含多步推理关键词、是否需要结构化输出、是否涉及代码或数学。
  • 小模型预判:用便宜模型先给条目打一个 0-1 的难度分或分类标签。
  • 历史反馈:之前失败或重试过的条目自动标记为“难”。

关键是把“难”的定义收敛成可执行的信号,而不是凭感觉。

可落地的分流规则

以下规则可以单独或组合使用,按优先级从高到低:

  • 长度规则:超过一定字符数的条目直接走强模型,因为长上下文更容易出错。
  • 关键词规则:包含“证明”“推导”“多步”“比较方案”“代码审查”等词的条目走强模型。
  • 输出结构规则:要求严格 JSON、表格或多字段对齐的条目,优先走强模型或先让强模型生成模板。
  • 预判规则:用便宜模型对条目做二分类(简单/复杂),置信度低于阈值时升级到强模型。
  • 重试规则:便宜模型输出未通过校验(格式错误、空结果、明显矛盾)时,自动重试一次强模型。

这些规则不需要复杂基础设施,一个函数就能实现。

十行代码示例

下面是一个最小分流器,输入条目文本,输出应使用的模型名。实际使用时把模型名替换为聚合站支持的标识即可。

def route(item, cheap="deepseek-chat", strong="claude-sonnet"):
    text = item.get("text", "")
    if len(text) > 2000:
        return strong
    hard_words = ["证明", "推导", "多步", "比较方案", "代码审查"]
    if any(w in text for w in hard_words):
        return strong
    if item.get("require_json") and item.get("fields", 0) > 5:
        return strong
    return cheap

这段代码只做规则路由。如果要加入预判,可以在 return cheap 之前调用一次便宜模型做分类,置信度低时返回 strong。

同一把 key 上的成本对比

聚合站的一个 API key 可以调用多个模型,因此成本对比可以在同一个账户内完成。对比时关注两个量:

  • 每条目的实际扣费:按官方价乘以倍率计算。用户侧统一按官方价 ×1.3 扣费,所以模型之间的相对成本等于官方价之比。
  • 分流后的加权成本:假设简单条目占比 p,难条目占比 1-p,则加权成本约为 p × 便宜模型官方价 ×1.3 + (1-p) × 强模型官方价 ×1.3。

举例来说,如果便宜模型官方价是强模型的十分之一,且 80% 条目走便宜模型,那么加权成本大约是全部走强模型的 0.8×0.1 + 0.2×1 = 0.28 倍。这个比例取决于实际占比和模型价差,需要用自己的数据测算。

如果同时贡献 key,贡献侧按官方价 ×1.1(优质 ×1.2)返 USDC,这部分收益与消费侧分开计算,不影响上面的分流逻辑。

实施建议

  • 先跑一批历史数据,统计简单/难条目的比例和便宜模型的失败率,再定阈值。
  • 把分流决策和实际扣费记录到日志里,便于事后核对加权成本。
  • 对失败条目保留原始输入和模型输出,方便调整规则。
  • 不要一开始就追求精细分类,先用长度和关键词两条规则跑通,再逐步加入预判和重试。

小结

按难度分流不需要复杂架构:几条规则加一个路由函数就能落地。配合同一把 key 的多模型调用,可以在一个账户内完成成本对比和效果验证。关键是先用数据确定“难”的信号,再逐步迭代规则。