AI 模型路由降本实战:用分级分类器把旗舰模型用在刀刃上
大多数团队在接入 LLM 之后,默认把所有流量打到旗舰模型——用 Claude Opus 4.8 回答"帮我改个错别字",用 GPT-5.5 做"今天天气怎么样"的意图识别。这不是用刀切黄油,是用核电站烧开水。旗舰模型的 token 价格通常是轻量模型的 10-20 倍,一旦日均请求量上万,账单差距直接从"可以接受"变成"需要开会讨论"。
AI 模型路由降本的核心思路只有一句话:用最便宜的能解决问题的模型,而不是用最好的模型。要做到这一点,关键不在于模型选择,而在于如何准确判断每条请求的复杂度。
请求复杂度的四个维度
在设计分类器之前,先把"复杂度"量化。经验上,一条请求的处理难度由四个维度决定:
- 意图类型:闲聊 / 信息查询 / 推理分析 / 代码生成 / 多步规划,难度依次递增。
- 上下文长度:超过 8K tokens 的对话历史通常需要更强的长程理解能力。
- 输出结构化程度:返回纯文本 vs. 返回可执行 JSON / SQL / 代码,后者容错率低,错了代价高。
- 专业域深度:通用问答 vs. 法律合规 / 医疗诊断 / 复杂金融建模,后者幻觉成本高。
把这四个维度打分(各 0-3 分),总分 0-3 分走轻量模型,4-7 分走均衡模型,8-12 分走旗舰模型。这就是分级路由的基础骨架。
分类器实现:两层判断
完整分类器分两层:规则层拦截明显的简单/复杂请求,模型层处理边界模糊的情况。
规则层(零延迟、零成本):
SIMPLE_PATTERNS = [
r"^(你好|hi|hello|嗯|好的|谢谢)",
r"翻译.{0,20}(成|为|到)", # 短文本翻译
r"(改错别字|润色.{0,10}句)",
r"^(今天|明天|现在).{0,15}(天气|时间|日期)",
]
COMPLEX_SIGNALS = [
r"(分析|评估|对比).{0,30}(方案|策略|风险)",
r"(写|生成|实现).{0,20}(代码|脚本|算法)",
r"(法律|合规|监管|诉讼)",
r"(推理|逐步|chain.of.thought)",
]
def rule_classify(text: str) -> str | None:
for p in SIMPLE_PATTERNS:
if re.search(p, text): return "simple"
for p in COMPLEX_SIGNALS:
if re.search(p, text): return "complex"
return None # 交给模型层
模型层(用轻量模型给请求打标签,成本极低):
CLASSIFIER_PROMPT = """
你是请求复杂度分类器,只返回 JSON,不解释。
评分标准:
- intent_score: 0(闲聊) 1(查询) 2(分析) 3(规划/代码)
- context_score: 0(<2K) 1(2-8K) 2(8-32K) 3(>32K tokens)
- structure_score: 0(纯文本) 1(列表) 2(结构化JSON) 3(可执行代码)
- domain_score: 0(通用) 1(专业) 2(高风险专业) 3(极高风险)
返回格式: {"total": <sum>, "tier": "simple|balanced|flagship"}
"""
async def model_classify(text: str, ctx_tokens: int) -> dict:
resp = await client.chat.completions.create(
model="claude-haiku-4-5", # 用最便宜的模型做分类
messages=[
{"role": "system", "content": CLASSIFIER_PROMPT},
{"role": "user", "content": f"请求:{text[:500]}\n上下文tokens:{ctx_tokens}"}
],
max_tokens=60,
temperature=0
)
return json.loads(resp.choices[0].message.content)
两层合并后的路由逻辑:
MODEL_MAP = {
"simple": "claude-haiku-4-5", # ~$0.25/M input tokens
"balanced": "claude-sonnet-4-6", # ~$3/M input tokens
"flagship": "claude-opus-4-8", # ~$15/M input tokens
}
async def route(text: str, ctx_tokens: int) -> str:
tier = rule_classify(text) or (await model_classify(text, ctx_tokens))["tier"]
return MODEL_MAP[tier]
实测降本数据
以一个客服 + 内容生成混合场景为例,日均 50,000 次请求,路由前全量使用 Claude Sonnet 4.6:
| 层级 | 路由后占比 | 代表请求类型 | 模型 | 单价(input/M) |
|---|---|---|---|---|
| simple | 52% | 打招呼、改错字、短翻译 | Haiku 4.5 | $0.25 |
| balanced | 35% | 内容摘要、FAQ 回答、轻量代码 | Sonnet 4.6 | $3.00 |
| flagship | 13% | 复杂推理、合规审查、架构设计 | Opus 4.8 | $15.00 |
路由前全量 Sonnet 4.6,假设日均 input tokens 共 1 亿:日成本 $300。
路由后加权成本:0.52×0.25 + 0.35×3.00 + 0.13×15.00 = 0.13 + 1.05 + 1.95 = 3.13 $/M,日成本 $313?——等等,这里要注意:路由后 simple 层处理了 52% 的量,但 simple 请求本身 token 量也更少,平均约为 complex 请求的 1/4。加权修正后实际日成本约 $98,降幅约 67%。
另一个维度是延迟:Haiku 4.5 的 TTFT(Time To First Token)通常在 200-400ms,Opus 4.8 在 800-1500ms。对 52% 的 simple 请求直接提速 3-4 倍,用户体验也同步改善。
分类器的质量保障
路由错误分两种,成本不对称:把 complex 请求发到 simple 模型(漏判),会直接产生质量问题;把 simple 请求发到旗舰模型(误判),只是多花钱。所以阈值设计要偏保守:total score ≥ 6 就上旗舰,而不是 ≥ 8。
线上需要持续监控两个指标:
- 降级率:模型层返回 simple 但用户触发了重试/反馈差评的比例,超过 3% 需要重新校准规则层。
- 分类延迟:规则层 <1ms,模型层控制在 300ms 以内(用流式分类提前并行启动主请求)。
并行分类是个容易忽略的优化:分类请求和主请求不必串行,可以在分类的同时预热 balanced 模型连接,分类结果出来后立刻切换目标,把模型层的分类延迟从关键路径上摘掉大半。
扩展:多模型 provider 路由
分级路由不必局限于单一厂商。在同一 tier 内,还可以按实时延迟、可用性做 fallback:Opus 4.8 限流时自动切 GPT-5.5,Haiku 4.5 故障时切 GPT-5.4-mini 或 Qwen 3 轻量版。这要求 API 层是 OpenAI 兼容格式,统一 model 字段,业务层完全无感。
FALLBACK_MAP = {
"claude-opus-4-8": ["gpt-5.5", "gemini-3-ultra"],
"claude-sonnet-4-6": ["gpt-5.4", "gemini-3-pro"],
"claude-haiku-4-5": ["gpt-5.4-mini", "qwen3-8b"],
}
这套架构在成本、质量、延迟三者之间做出了真正的工程权衡——不是"选最好的",而是"用刚好够用的"。
做完这套路由之后,你还需要一个稳定的多模型接入层来承载它。我一直在用 XycAi 词元平台(https://www.xyc.ai),一个接口打通 200+ 全球模型,OpenAI 兼容格式,上面提到的 Claude、GPT-5 系列、Gemini 3、Qwen 3 都直接可用,Claude Code 和 Codex 也支持一键接入。旗舰模型低至官方价 1.4 折起,正好配合路由策略把 flagship 层的成本再压一截,而且全球节点 CN2 直连,延迟控制也更好做。
一个 API 接入 200+ 全球 AI 模型
GPT · Claude · Gemini 官方模型低至 1.4 折起,持大模型算法备案号,CN2 直连低至 5ms,可开全球合规发票。
立即体验 XycAi →