模型路由怎么做:按任务难度分配速度、成本与质量
来源:17golang原创
时间:2026-10-07 15:46:28 147浏览 收藏
模型路由的核心不是“把请求随机分给不同模型”,而是先识别任务需要的能力,再在满足质量门槛的候选中选择延迟和成本更合适的模型。轻量任务走快速模型,复杂推理、长上下文、高风险或低置信任务升级到更强模型;路由器还要记录策略版本、选择原因和实际结果,才能持续校准。
Google 官方模型路由参考:https://cloud.google.com/vertex-ai/generative-ai/docs/reference/rest/v1beta1/GenerationConfig
Gemini Flash-Lite 官方说明:https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-lite.md
先定义任务难度与质量门槛,再谈模型名称。模型会升级,路由规则应该围绕能力、预算和风险保持稳定。
先把路由目标写成可衡量约束
我最早做模型路由时,只写了一个规则:字数少于 200 就走快速模型,否则走强模型。它很容易实现,却经常把短而难的代码审查、权限判断和数学题分错;一段很长但只需提取字段的文本,反而被送到高成本档。
更实用的目标至少有四个维度:
| 维度 | 路由器要回答的问题 | 建议指标 |
|---|---|---|
| 质量 | 最低可接受正确率或任务得分是多少 | 任务簇通过率、人工接受率 |
| 延迟 | 首响应和完整响应能等多久 | P50、P95 延迟 |
| 成本 | 单请求或每日预算允许到哪一档 | 令牌量、相对成本单位 |
| 风险 | 错误答案的后果是否需要强制升级 | 高风险命中率、升级率 |
Google 的官方资料给出了两个有用信号:Flash-Lite 这类模型面向高频、低延迟和成本敏感任务,也可作为复杂度分类器;Vertex AI 的自动路由配置则提供质量优先、平衡、成本优先等偏好。这说明生产路由更适合围绕约束设计,而不是把某个模型 ID 写死在业务代码里。
准备一个不绑定厂商的最小项目
这个小项目只需要 Python 标准库。模型调用本身通过统一接口注入,示例不会绑定具体 SDK,也不会把密钥写入代码。
from dataclasses import dataclass
from typing import Protocol
@dataclass(frozen=True)
class Task:
text: str
needs_reasoning: bool = False
needs_structured_output: bool = False
high_risk: bool = False
context_tokens: int = 0
@dataclass(frozen=True)
class ModelProfile:
name: str
quality_tier: int
latency_tier: int
relative_cost: float
class ModelClient(Protocol):
def generate(self, model: str, prompt: str) -> str:
... # 由具体厂商客户端实现统一调用接口
MODELS = [
ModelProfile("fast", quality_tier=1, latency_tier=1, relative_cost=1.0),
ModelProfile("balanced", quality_tier=2, latency_tier=2, relative_cost=3.0),
ModelProfile("quality", quality_tier=3, latency_tier=3, relative_cost=8.0),
] # 使用相对档位,避免把会变化的价格写死
这里的 fast、balanced 和 quality 是能力别名。部署时再把它们映射到当前可用模型,升级模型时不需要修改路由业务逻辑。
用可解释规则估算任务难度
第一版路由器不必立刻训练分类模型。可解释规则更容易上线和排错,等积累了真实标签后再替换为学习型分类器。下面把四类信号转成 0 到 8 的难度分数:
def difficulty(task: Task) -> tuple[int, list[str]]:
score = 0
reasons: list[str] = []
if task.needs_reasoning:
score += 2
reasons.append("reasoning") # 复杂推理提高能力要求
if task.needs_structured_output:
score += 1
reasons.append("structured_output") # 严格结构输出增加失败成本
if task.context_tokens > 32000:
score += 2
reasons.append("long_context") # 长上下文需要单独评估能力与预算
if task.high_risk:
score += 3
reasons.append("high_risk") # 高风险任务强制进入更高质量档
return score, reasons # 同时返回原因,便于日志与复盘
不要只依赖提示词长度。实际项目还可以加入工具调用数量、输入模态、目标语言、是否要求引用、是否需要代码执行、用户等级和业务 SLA。高风险并不等于“模型更强就可以自动决策”,医疗、法律、金融或安全场景还需要人工复核和明确责任边界。
把分数映射到速度、成本与质量档位
难度分数只决定最低质量档,再由预算筛选候选。一个简洁策略是:分数 0–2 走快速档,3–5 走平衡档,6 以上走质量档;高风险任务最低为质量档。
@dataclass(frozen=True)
class Budget:
max_relative_cost: float
max_latency_tier: int
def choose_model(task: Task, budget: Budget) -> tuple[ModelProfile, list[str]]:
score, reasons = difficulty(task)
minimum_quality = 1 if score = minimum_quality
and model.relative_cost
最关键的处理是“没有候选时失败”,而不是悄悄把高风险请求降到快速模型。实际系统可以返回需要人工处理、排队等待更高预算,或让调用方显式调整约束。

增加失败回退与质量升级
模型调用失败不应全部升级。连接超时、限流和服务不可用属于传输层问题,应该先按供应商建议和总预算进行有限重试;输出格式错误、答案缺少必要字段、分类置信不足才属于质量升级信号。
@dataclass
class Result:
text: str
confidence: float
valid: bool
def run_with_escalation(client: ModelClient, task: Task, budget: Budget) -> Result:
selected, _ = choose_model(task, budget)
result = call_and_check(client, selected.name, task) # 调用后执行结构和质量检查
if result.valid and result.confidence >= 0.8:
return result # 结果满足门槛时立即返回,避免无意义升级
stronger = next((m for m in MODELS if m.quality_tier > selected.quality_tier), None)
if stronger is None or stronger.relative_cost > budget.max_relative_cost:
return result # 无更强候选或预算不足时保留原结果并标记低置信
return call_and_check(client, stronger.name, task) # 最多升级一次,防止循环调用
我更倾向于限制一次升级,并给整个请求设置总令牌与总时间预算。路由器不是无限尝试直到“看起来正确”的代理;它必须有清楚的停止条件。
接入应用并记录路由证据
上线后至少记录以下字段:请求所属任务簇、难度分数、触发信号、策略版本、候选集合、选中模型别名、是否升级、首响应延迟、总延迟、输入输出令牌、相对成本和质量反馈。不要保存完整敏感提示词,可记录哈希、长度和脱敏标签。
def route_event(task: Task, model: ModelProfile, reasons: list[str]) -> dict:
return {
"policy_version": "router-v1",
"task_family": classify_family(task), # 只记录受控任务标签
"model_alias": model.name,
"difficulty_reasons": reasons,
"relative_cost": model.relative_cost,
"prompt_length": len(task.text),
} # 不把原始提示词和密钥写入路由日志
这组数据有两个用途:线上观察是否出现某个任务簇持续升级,离线重放同一批样本比较新旧策略。若只看总平均延迟,很容易忽略高风险任务质量下降或某个小语种任务被错误降档。
用离线评测验收并调整阈值
验收集应按任务簇分层,例如摘要、抽取、问答、代码、复杂推理和高风险辅助,每簇保留简单、中等、困难样本。对每个策略版本同时统计质量、延迟和相对成本,而不是先上线再凭账单猜测。
一个实用的验收顺序是:
- 先固定模型候选和评测样本,只调整路由阈值。
- 确认每个任务簇的质量底线没有下降。
- 再比较 P50、P95 延迟和相对成本。
- 检查高风险任务是否全部进入规定档位。
- 以小流量发布新策略,并保留旧版本快速回退。

模型路由适合请求量较大、任务难度差异明显、且已经有评测集的应用。若请求很少、任务高度同质,维护路由策略、观测和评测的成本可能高于节省的推理成本,此时固定一个满足要求的模型反而更稳。
常见问题
可以让一个小模型直接判断该调用哪个模型吗?
可以,官方模型资料也给出了用低延迟、低成本模型做复杂度分类器的模式。但仍应保留规则兜底、风险强制升级、总预算和离线评测,不能把分类器当作绝对正确。
模型路由最容易漏掉什么指标?
最常漏掉任务簇级质量。只看平均延迟和总成本,可能掩盖代码、长上下文或小语种任务的退化。
是否应该把具体模型 ID 写进提示词?
不建议。业务层使用能力别名,部署配置再映射具体模型,更方便版本升级、供应商切换和灰度发布。
参考资料:Google I/O 2026 官方汇总:https://blog.google/innovation-and-ai/technology/ai/google-io-2026-all-our-announcements/;Gemini Flash-Lite:https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-lite.md;Vertex AI 路由配置:https://cloud.google.com/vertex-ai/generative-ai/docs/reference/rest/v1beta1/GenerationConfig
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习