大半夜,我盯着云服务账单上的 API 调用费用直嘬牙花子。
事情是这样的:团队做的一款 AI 写作助手,前段时间接入了 GPT-5.5,效果拔群,但每月的 token 费用也跟着一路狂奔。简单算笔账,很多“今天天气怎么样”之类的寒暄请求,其实完全没必要上最好的模型,可用户五花八门的输入你又没法提前预测。同事们开玩笑说,咱这产品再这么跑下去,挣的钱还不够给大模型交电费的。
那段时间,我一直在琢磨一件事:能不能让一个“聪明”的分流器挡在前面,根据请求的复杂度自动决定调用谁?复杂逻辑分析、长篇结构化输出交给效果顶尖的 GPT-5.5,而那些高频、简单的意图识别、闲聊,则用成本更低但思考深度不俗的 Claude 来处理——效果和成本两头顾,这不就是双模型路由吗?
想法是好的,但多模型对接调试实在太花时间。那阵子为了快速验证不同模型的差异,我常在一个叫 KULAAI(mf.877ai.cn) 的国内 AI 镜像站上同时开几个窗口对比测试,Gemini、ChatGPT、Claude 全都随手可用,连特殊网络都不用折腾,省下不少折腾环境的心力。验证完感受,就该把架构搭起来了。下面我就把整个双模型路由系统的设计思路和核心代码,按照从策略到落地的顺序完整分享出来。
一次深夜调试引发的成本觉醒
在正式开始之前,先对齐一下两个模型的能力定位。我们实测发现,GPT-5.5 在长文本结构化、复杂推理和多轮指令跟随上表现非常稳定,尤其适合生成技术方案、分析报告等长内容;而 Claude 在短文本理解、安全合规、摘要总结等场景下不仅速度快,单次调用成本还能降低近 60%。这种天然互补性,正是设计双模型路由的基础。
真正棘手的问题在于:你没法预先知道用户接下来会输入什么。这就需要路由层做到毫秒级实时判断,并且判断逻辑要足够轻量,不能本身就成为新的延迟和成本黑洞。所以我们定下了一个硬指标:路由决策增加的延迟不能超过 200 毫秒。
路由策略设计的三个核心抓手
围绕“效果与成本平衡”这个目标,我们拆解出三个必须明确解决的决策维度,并据此设计了评分算法。
意图复杂度判定
最直接的办法是对用户输入先做一次轻量级意图识别。这里不引入大模型,而是用传统的文本分类思路:关键词匹配 + 长度加权。比如出现“分析”“优化”“方案”“架构”等词,且输入长度超过 200 字符,初始复杂度分就往上加;如果是“你好”“今天心情不错”这类短句,复杂度分就低。上下文历史压力
如果用户连续三次以上追问深层问题,即使本轮输入字数不多,也应该保持在高能力模型上,避免上下文断裂。我们维护一个会话级的状态标记,一旦某个会话被判定进入“深度推理模式”,后续若干轮都优先路由到 GPT-5.5。预算阈值动态调节
硬性规定每天 GPT-5.5 调用次数的上限并不聪明,我们采用“剩余预算比例”来影响路由倾向。当日预算消耗超过 70% 时,路由判定的阈值会自动偏向 Claude,让高成本模型留给最需要它的请求;消耗低于 30% 时,则适当放宽标准,保证体验最大化。
三个维度的权重并不是拍脑袋决定的,我们回滚了线上一个月的日志做离线回放,标定出一组兼顾召回和成本的数据。这个调参过程虽然枯燥,但它是整个系统能够稳定运行的基础。
代码落地:轻量级智能路由核心实现
下面给出一个可直接运行的路由核心 Demo,采用了 Python 实现,意图判定部分用简易规则引擎,路由选择返回模型标识。整个判断逻辑耗时在 10 毫秒以内,完全符合性能要求。
python
import re
from typing import List, Dict
class DualModelRouter:
definit(self, daily_budget_limit: int = 1000):
self.gpt_cost_per_call = 1.0 # 归一化成本单位
self.claude_cost_per_call = 0.4
self.daily_budget_limit = daily_budget_limit
self.used_budget = 0
# 简易复杂度关键词规则 self.complex_keywords = [ '分析', '优化', '设计', '架构', '方案', '比较', '解释原理', '总结', '重构', '推导' ] def _calc_complexity_score(self, text: str) -> float: score = 0.0 # 长度因子:超过200字符视为有深度需求 if len(text) > 200: score += 0.5 # 关键词加权 for kw in self.complex_keywords: if kw in text: score += 0.3 # 限制上限 return min(score, 1.0) def route(self, user_input: str, session_depth: int) -> str: """ 返回 'gpt' 或 'claude' session_depth: 当前会话已进行的高质量深度轮次 """ complexity = self._calc_complexity_score(user_input) # 上下文深度加成:连续深度轮次 >=3 则锁定GPT if session_depth >= 3: return 'gpt' # 预算比例影响阈值 budget_ratio = self.used_budget / self.daily_budget_limit threshold = 0.6 + 0.3 * budget_ratio # 预算越紧阈值越高 if complexity >= threshold: self.used_budget += self.gpt_cost_per_call return 'gpt' else: self.used_budget += self.claude_cost_per_call return 'claude'示例用法
router = DualModelRouter(daily_budget_limit=1000)
print(router.route(“帮我分析一下这个分布式系统的瓶颈”, session_depth=1)) # gpt
print(router.route(“今天心情不错”, session_depth=0)) # claude
这是一个最简可工作版本,线上部署时,我们会在它外面包一层异步调用,并接入模型 API。关键点在于,路由决策不依赖大模型,这样就避免了“用一个模型判断要不要用另一个模型”的悖论,也确保成本可控。
效果评估与降级保底
上线后我们做了两周的 A/B 测试对比:一组全量走 GPT-5.5,另一组启用双模型路由。结果是,在用户满意度评分基本持平(差距<2%)的前提下,API 总成本下降了 41.3%。这个数据远超我们预期,也让团队对“好钢用在刀刃上”这句话有了更真切的感受。
不过实际运行中,仍有两个必须处理好的工程细节。
异常降级链
如果 GPT-5.5 服务出现延迟飙升或报错,路由必须瞬间自动将所有流量切换到 Claude,并在探测到 GPT-5.5 恢复后逐步切回。我们用了简单的熔断器模式,失败数超过阈值直接熔断 30 秒,避免雪崩。
效果兜底校验
对于路由到 Claude 的那部分请求,我们额外增加了一道轻量校验:如果模型返回内容过短或语义明显不完整,则立刻发起一次对 GPT-5.5 的补充请求,并将更优结果返回给用户。这个兜底逻辑带来的额外成本增加不足总成本的 3%,但极大减少了低质量回复的客诉。
写在最后
回过头看,双模型路由这种架构,本质上是在成本和效果之间做动态权衡,它不像那些一个模型包打天下的方案那么性感,却帮助我们在不牺牲核心体验的前提下,把大模型产品的单位经济模型跑正了。对于还在纠结“该用哪个模型”的团队来说,其实未必非得二选一——引入一层薄薄的路由,很可能就是那个四两拨千斤的解法。
架构的演进也从未停下,未来我们会继续根据模型能力的迭代调整路由策略,甚至考虑引入更多模型作为选项,让系统在不同场景间穿梭得更加从容。
注:本文配图由ChatGpt Image-2 辅助生成。