1. 什么是多供应商模型路由——不是“换着用”,而是“按需调度”
“多供应商模型路由”这个词,最近在AI工程圈里突然密集出现,尤其在大模型应用落地的团队例会上,几乎成了高频词。它不是指简单地把不同厂商的大模型API挨个试一遍,也不是让业务方自己选“今天用哪家的模型”,更不是搞个随机轮询把请求甩给各家API——这些做法我见过太多次,最后都卡在稳定性、成本和效果三重崩塌上。真正的多供应商模型路由,本质是一套带策略、可感知、有兜底的智能调度系统:它像一个经验老到的交通调度员,在用户发来一条“写一封给客户的道歉邮件”请求时,0.3秒内完成判断——当前Qwen3负载低、响应快、中文润色强,优先调用;若Qwen3超时或返回格式异常,则自动切到Claude-3.5-Sonnet做兜底生成;若请求含大量金融术语且需强合规校验,哪怕延迟高200ms,也强制走本地部署的DeepSeek-R1模型。它解决的从来不是“有没有模型可用”,而是“在什么条件下,用哪个模型,以什么方式,达成什么质量目标”。这背后涉及模型能力画像、实时状态探活、语义意图识别、SLA分级保障、降级熔断机制等一整套工程化能力。适合正在搭建企业级AI中台、需要长期稳定支撑客服/投研/法务等关键业务线的技术负责人、MLOps工程师,以及被“模型API频繁抖动”“某家模型突然限流”“成本越跑越高却说不清原因”反复折磨的AI产品经理。如果你还在靠人工改配置文件切换模型,或者靠Excel表格记录各家API的响应时间,那这7条规则,就是你从“能跑通”迈向“跑得稳、跑得省、跑得准”的分水岭。
2. 为什么必须立下7条铁律——踩过坑才懂的血泪教训
我亲手参与过4个从零搭建的多供应商模型路由系统,最早一个项目是给某全国性银行做智能投顾后台,当时团队天真地认为“只要把各家API封装成统一接口就行”。结果上线第三天,就因一条规则缺失导致全线崩溃:当阿里云百炼平台因机房升级临时不可用时,路由层没有设置熔断阈值,所有请求持续重试30秒,拖垮了整个下游推荐引擎,客户投诉电话打爆运维热线。后来我们花了整整两周回溯日志,才定位到问题根源——不是模型不行,是路由逻辑没设防。这7条规则,每一条都对应一个真实踩过的坑,不是理论推演,全是生产环境里用故障单、监控告警和客户投诉换来的:
第1条“能力声明必须由模型方提供,而非客户端硬编码”:早期我们把Qwen2的“支持128K上下文”直接写死在路由配置里。结果Qwen2.5发布后,官方悄悄将该能力降为64K,但我们的路由仍按128K分发长文档,导致大量截断错误。后来改成每次启动时主动调用各厂商的
/v1/models/{id}/capabilities接口拉取最新能力清单,并缓存2小时,失效后自动刷新。第2条“路由决策必须基于实时状态,而非静态权重”:曾用加权轮询(WRR)分配请求,给三家模型分别配了40%、35%、25%权重。但某天其中一家突发网络抖动,P99延迟从300ms飙升至4.2秒,WRR却照常分发35%流量过去,直接拖垮整体体验。现在我们每15秒采集一次各模型的
avg_latency_1m、error_rate_5m、queue_length三项指标,用动态权重公式重新计算:weight = base_weight × (1 - error_rate) × (1000 / avg_latency),延迟越高、错误越多,权重自动归零。第3条“降级路径必须预置且可验证,不能依赖‘理论上能切’”:曾以为只要代码里写了
if (qwen_unavailable) use_claude()就算降级。但Claude的API密钥权限未提前开通,切过去后报401错误,二次降级又没设计,最终返回500。现在所有降级路径都要求:① 预先在沙箱环境完成全链路压测;② 每日凌晨自动触发一次降级演练(模拟主模型不可用);③ 降级日志单独归档,确保可追溯。
这7条规则,不是锦上添花的“最佳实践”,而是防止系统在关键时刻掉链子的“安全阀”。它们共同构成一个闭环:能力声明是输入基准,实时状态是决策依据,降级路径是容错底线,而剩下的四条,则是保障这个闭环不被人为绕过、不被短期KPI牺牲的刚性约束。接下来,我会一条一条拆解,告诉你每条规则背后的具体实现逻辑、参数怎么算、配置怎么写,以及——最关键的是,如果违反它,第二天早上你会收到什么样的告警短信。
3. 7条执行规则逐条详解与实操落地
3.1 规则一:能力声明必须由模型方提供,而非客户端硬编码
这条规则的核心,是把模型能力的“权威来源”从开发者的记忆或文档截图,转移到模型服务自身的元数据接口。硬编码能力声明最大的风险在于“信息滞后”——模型方迭代更新了能力(如支持新格式、提升上下文长度、新增工具调用),但路由层毫不知情,继续按旧能力分发请求,轻则结果错误,重则触发模型侧的非法请求拦截。
实操要点:
首先,必须确认所有接入的模型供应商是否提供标准化的能力查询接口。主流平台基本都支持,例如:
- OpenAI:
GET https://api.openai.com/v1/models/{model_id}返回包含context_length、max_completion_tokens等字段; - Anthropic:
GET https://api.anthropic.com/v1/models返回input_tokens、output_tokens上限; - 阿里云百炼:
GET https://dashscope.aliyuncs.com/api/v1/models/{model_id}包含max_input_tokens、max_output_tokens、support_stream布尔值。
关键参数计算逻辑:
以“上下文长度”为例,不能直接取接口返回的max_input_tokens。因为实际可用长度 =max_input_tokens - prompt_tokens - system_prompt_tokens - reserved_for_output。我们预留10%作为输出缓冲区(避免因token估算偏差导致截断),并动态计算system prompt长度(不同业务场景system prompt不同)。例如,客服场景system prompt固定为:“你是一名专业客服,回答需简洁、友好、带解决方案……”共127 tokens,那么对Qwen2-72B(max_input_tokens=32768),实际可用上下文为:32768 - 127 - floor(32768 × 0.1) = 29363。这个值每天凌晨自动刷新并写入Redis缓存,Key为model:qwen2-72b:effective_context,TTL设为2小时,确保即使上游接口短暂不可用,也能用缓存值维持服务。
提示:务必在路由决策前校验
len(prompt) + len(system_prompt) ≤ effective_context,否则直接返回400错误并记录CONTEXT_OVERFLOW告警,绝不尝试发送超长请求——这是保护模型侧稳定性的第一道防线。
3.2 规则二:路由决策必须基于实时状态,而非静态权重
静态权重(如Round Robin、Weighted RR)在实验室环境看似公平,但在生产环境中等于放弃对服务质量的控制。我们曾用WRR给三家模型分配流量,结果某天其中一家因CDN节点故障,P99延迟从350ms升至3.8秒,但WRR仍持续分发35%请求过去,导致整体P99飙升至2.1秒,用户明显感知卡顿。
实时状态采集方案:
我们采用“双通道探活+滑动窗口统计”:
- 主动探活:每15秒向各模型endpoint发送轻量级健康检查请求(
POST /v1/chat/completions,body仅含{"model":"xxx","messages":[{"role":"user","content":"ping"}]}),超时阈值设为1000ms,连续3次失败标记为UNHEALTHY; - 被动监控:从Nginx access log实时解析各模型的真实请求耗时、HTTP状态码,按分钟聚合
avg_latency_1m、error_rate_5m(5分钟滚动窗口)、queue_length(当前等待队列长度)。
动态权重计算公式:final_weight = base_weight × (1 - min(error_rate_5m, 0.95)) × max(0.1, 1000 / avg_latency_1m) × (1 if queue_length < 5 else 0.3)
解释:
min(error_rate_5m, 0.95)避免错误率100%时权重归零导致雪崩,设上限0.95;1000 / avg_latency_1m将延迟转化为反比权重,300ms对应3.33,1000ms对应1.0;queue_length惩罚项:队列>5时权重砍至30%,逼迫流量转向其他节点。
配置示例(YAML):
models: qwen2-72b: base_weight: 40 health_check_url: "https://dashscope.aliyuncs.com/api/v1/chat/completions" latency_window: 60 # 分钟级延迟统计窗口 error_window: 300 # 5分钟错误率窗口 claude-3-5-sonnet: base_weight: 35 health_check_url: "https://api.anthropic.com/v1/messages" # 其他同上注意:权重每分钟重算一次,但生效需平滑过渡——新权重不是立即覆盖,而是与旧权重线性插值(α=0.2),避免流量突变引发连锁抖动。
3.3 规则三:降级路径必须预置且可验证,不能依赖“理论上能切”
降级不是“写个if语句”,而是要形成一条经过验证、权限完备、链路通畅的备用通道。我们曾因降级路径未验证,导致主模型故障时切过去报401(密钥无权限)、再切报429(备用模型限流)、最后fallback到本地小模型却因prompt模板不兼容返回乱码。
降级路径四要素验证清单:
| 要素 | 验证方式 | 频次 | 不通过处理 |
|---|---|---|---|
| 权限完备 | 调用curl -H "Authorization: Bearer $KEY" $ENDPOINT测试401/403 | 每次密钥变更后 | 自动邮件通知负责人,阻断上线 |
| 链路通畅 | 从路由服务所在VPC发起curl,验证DNS解析、网络连通性、TLS握手 | 每日02:00 | 告警并自动触发网络诊断脚本 |
| 能力匹配 | 用标准测试集(含长文本、多轮对话、JSON输出等)跑通全链路 | 每周一次 | 生成差异报告,标注不兼容点 |
| 容量充足 | 模拟峰值流量的120%压测,观察P99、错误率 | 每月一次 | 若P99>800ms或错误率>1%,暂停该路径 |
降级触发逻辑:
- 一级降级:主模型连续3次健康检查失败,或
error_rate_5m > 0.05且avg_latency_1m > 2000; - 二级降级:一级降级目标也触发相同条件,启用预设的二级路径(如本地模型);
- 熔断:若二级路径也连续失败,停止所有外部调用,返回预置的
SERVICE_UNAVAILABLE兜底响应(含友好的用户提示和预计恢复时间)。
3.4 规则四:所有路由决策必须留痕,且日志保留不低于90天
没有日志的路由,等于蒙眼开车。我们曾遇到一个诡异问题:某类法律咨询请求总是返回格式错误,但复现时一切正常。翻查日志才发现,路由层在特定时间窗口内,因时区配置错误,将timezone=Asia/Shanghai误传为timezone=UTC,导致模型侧时间戳解析异常,进而影响了日期相关推理。若无完整日志,这个问题永远无法定位。
日志结构设计(JSON Schema):
{ "request_id": "req_abc123", "timestamp": "2024-06-15T08:23:45.123Z", "user_id": "usr_789", "intent": "legal_advice", "prompt_length": 1842, "selected_model": "qwen2-72b", "reason": "lowest_latency_1m(287ms) AND error_rate_5m(0.002)", "fallback_chain": ["qwen2-72b", "claude-3-5-sonnet"], "response_status": "success", "latency_ms": 423, "output_length": 652, "cost_usd": 0.0217 }reason字段必须记录决策依据,不能只写“默认路由”;fallback_chain记录本次请求实际经过的模型序列,便于分析降级有效性;cost_usd按各模型官方定价实时计算,为成本分析提供原子数据。
存储与检索:
- 实时写入Elasticsearch,索引按天分割(
routing-log-2024.06.15); - 设置ILM策略:热节点(30天)→ 温节点(60天)→ 冷节点(归档至S3,保留90天);
- 提供Kibana仪表盘,支持按
intent、selected_model、reason、latency_ms多维下钻分析。
实操心得:日志量巨大(我们日均2.3亿条),务必在采集端做采样——对
response_status=success且latency_ms<500的请求,采样率1%;对error_rate>0.01的模型,100%全量采集。否则存储成本会失控。
3.5 规则五:模型切换必须保证语义一致性,禁止跨范式混用
这是最容易被忽视的隐形陷阱。把一个需要强推理的数学题请求,从Claude-3.5(强推理范式)切到Qwen2(强生成范式),结果可能得到一堆正确但无关的废话;反之,把一个需要高保真润色的文案请求,从Qwen2切到本地Llama3(强开源微调范式),可能因prompt工程差异导致风格突变。语义一致性不是指“都能回答”,而是指“用同一种思维模式回答”。
范式分类与匹配策略:
我们定义三大范式:
- 推理型(Reasoning):擅长多步逻辑推演、数学证明、代码生成,代表模型:Claude-3.5、GPT-4o;
- 生成型(Generation):擅长流畅文本生成、风格迁移、多轮对话,代表模型:Qwen2、Gemini-1.5;
- 领域型(Domain):经垂直领域微调,对特定术语、流程、格式高度适配,代表模型:本地部署的FinBERT(金融)、Legal-BERT(法律)。
路由匹配逻辑:
- 先用轻量级分类器(TinyBERT微调)对
prompt做意图识别,输出intent_class(如math_reasoning,creative_writing,financial_analysis); - 查表匹配范式优先级:
intent_class primary_purpose preferred_paradigm fallback_paradigms math_reasoning 推理 Reasoning Generation creative_writing 生成 Generation Reasoning financial_analysis 领域 Domain Generation - 仅在同范式内选择最优模型,绝不跨范式降级。例如
financial_analysis请求,宁可熔断,也不切到纯生成型模型。
验证方法:
每月用标准测试集(1000条各类型prompt)跑AB测试:
- A组:严格按范式路由;
- B组:允许跨范式降级;
对比answer_correctness(专家评分)、style_consistency(BLEU-4相似度)、user_satisfaction(NPS问卷)。结果B组在financial_analysis类任务上,answer_correctness下降23%,user_satisfaction下降37%——证明范式隔离的必要性。
3.6 规则六:成本必须实时计入路由决策,且单次请求成本偏差≤5%
很多团队把成本优化放在事后分析,但路由层才是成本控制的第一道闸门。我们曾发现,某类长文本摘要请求,路由到GPT-4o的成本是Qwen2的4.7倍,但P99延迟只快120ms。若路由层不感知成本,这类“性价比极低”的调用会持续发生。
成本建模方法:
- 基础成本:
cost = input_tokens × input_price_per_token + output_tokens × output_price_per_token; - 隐性成本:增加
latency_penalty(延迟>500ms时,每100ms加价0.001USD)、error_penalty(每次错误调用加价0.01USD); - 总成本分值:
score = cost_usd + latency_penalty + error_penalty,路由选择score最低者。
实时成本计算实操:
- 在请求进入路由层时,用预估模型(基于历史prompt长度分布)估算
input_tokens; - 模型返回后,用实际
usage.input_tokens、usage.output_tokens修正成本; - 将修正后的
cost_usd写入日志,并更新该模型的avg_cost_per_request滑动窗口(30分钟); - 下次决策时,用
avg_cost_per_request替代静态定价,更贴近真实成本。
偏差控制:
设置cost_deviation_alert:若单次请求实际成本 > 预估成本×1.05,触发告警并记录COST_OVERESTIMATE事件。我们发现,Qwen2对含大量emoji的prompt,token计数偏差高达18%,因此对这类请求启用emoji-aware-tokenizer重算。
3.7 规则七:任何绕过路由层的直连调用,必须经CTO书面审批并限时关闭
这是组织层面的铁律。技术债往往始于“临时直连”——运营同学为快速上线一个活动页面,直接调用Qwen2 API;算法同学为调试新prompt,绕过路由层直连Claude。这些“临时”调用,最终变成线上幽灵流量,当路由层做容量规划时,完全无法感知这部分真实负载,导致扩容不足、雪崩频发。
管控机制:
- 网络层隔离:所有模型API域名(
api.openai.com,api.anthropic.com等)在防火墙策略中,仅允许路由服务所在Pod的ServiceAccount访问,其他Pod一律拒绝; - API网关拦截:在Kong网关配置
request-transformer插件,检查每个请求的X-Route-SourceHeader,非router-service值的请求,返回403; - 审计与问责:每月扫描所有Pod的outbound连接日志,生成
Direct-Call-Report,列出所有绕过路由的调用源IP、域名、QPS; - 审批流程:确需直连(如紧急故障排查),必须提交Jira工单,填写《直连调用申请》,注明原因、预期时长、负责人,由CTO在线审批,系统自动设置TTL(最长72小时),到期自动禁用。
实操心得:我们曾发现一个“幽灵调用源”——某前端SDK内置了Qwen2的API Key,用于客户端侧实时纠错。虽QPS不高,但因未走路由,完全不受熔断、降级、成本监控约束。最终推动前端团队将该功能迁移到路由层,统一管控。
4. 实操过程中的典型问题与排查技巧
4.1 问题一:模型状态探活频繁误报,导致流量被错误切走
现象:某天凌晨,Qwen2的健康检查连续5次超时(阈值1000ms),路由层将其标记为UNHEALTHY,80%流量切到Claude,但实际Qwen2服务完全正常,只是偶发网络抖动。
排查思路:
- 先查探活请求本身:
tcpdump抓包发现,探活请求发出后,Qwen2侧TCP SYN包有响应,但HTTP层无返回——说明问题不在网络,而在服务端; - 查Qwen2日志:发现其WAF规则将短连接
ping请求识别为扫描行为,自动限速; - 查探活配置:原探活用的是
POST /v1/chat/completions,属于业务接口,易被WAF拦截。
解决方案:
- 将探活接口改为专用健康检查端点
GET /healthz(需厂商支持); - 若厂商不提供,改用
HEAD /v1/models(轻量、无业务语义); - 增加探活容错:连续失败次数从3次提高到5次,且要求5次失败中至少3次超时>1500ms(排除瞬时抖动)。
注意:绝不能为了“减少误报”而提高超时阈值到2000ms以上——这会让真实故障的发现延迟翻倍。平衡点在于“精准识别抖动”而非“容忍抖动”。
4.2 问题二:降级后效果反而更差,用户投诉激增
现象:主模型Qwen2因GPU资源紧张,P99延迟升至3.2秒,路由层触发降级到Claude-3.5。但用户反馈“回答变短了、不详细”,NPS评分下降15点。
根因分析:
- 对比两模型输出:Qwen2返回约800字详尽解答,Claude-3.5仅返回300字核心结论;
- 查Claude-3.5的
max_tokens配置:路由层为节省成本,设为max_tokens=512,但Qwen2默认不限制,实际输出远超此值; - 查prompt模板:Qwen2模板含
请详细展开,不少于500字指令,Claude模板无此约束。
修复步骤:
- 统一输出长度约束:所有模型路由前,根据
intent动态设置max_tokens——legal_advice类设为1024,quick_answer类设为256; - 标准化prompt指令:在路由层注入统一system prompt后缀:“请根据问题复杂度,提供详尽/简洁的回答,字数控制在{max_tokens}以内”;
- 建立降级效果基线:对每个降级路径,用标准测试集跑出
avg_output_length、answer_depth_score(基于LLM评估),设定阈值(如answer_depth_score < 0.7即告警)。
4.3 问题三:成本监控显示某模型单日花费突增300%,但QPS无明显变化
现象:Qwen2账单显示昨日花费$2,800,较前日$700增长300%,但监控显示QPS稳定在1200/s,无异常峰值。
排查路径:
- 查日志:筛选
selected_model=qwen2-72b的日志,按cost_usd排序,发现TOP10请求单次成本均>$1.5; - 分析TOP请求:均为长文档摘要,
input_tokens平均达120,000,远超日常均值15,000; - 追溯源头:发现某运营活动页面,用户可上传PDF(最大100MB),后端未做页数限制,导致单次请求送入整本PDF(500页);
- 查路由配置:
max_input_tokens校验开关被误关闭,未拦截超长请求。
根本解决:
- 立即开启
max_input_tokens硬校验,并设置max_file_pages=50(PDF解析后最多取50页); - 在前端增加文件上传预检:JS读取PDF元数据,页数>50时提示“请上传前50页”;
- 成本告警升级:除日粒度外,增加“单小时成本环比增长>50%”实时告警,缩短响应时间。
4.4 问题四:多供应商路由后,A/B测试结果失真,无法归因效果差异
现象:上线新prompt后,整体answer_correctness提升8%,但分析发现,提升主要来自Qwen2流量(+15%),而Claude流量反而下降2%。团队争论是prompt优化有效,还是Qwen2模型本身升级所致。
归因难题:
传统A/B测试将用户分流,但多供应商路由下,同一用户可能因模型状态变化,在不同时间调用不同模型,导致“用户分组”与“模型分组”混淆。
解决方案:
采用双重分层实验设计(Two-Level Stratified Experiment):
- 第一层(用户层):将用户按ID哈希分为A/B组,A组用新prompt,B组用旧prompt;
- 第二层(模型层):对每组内请求,按
intent再分模型桶——legal_advice类只路由到Qwen2,math_reasoning类只路由到Claude; - 分析时:交叉分析
[A/B组] × [Qwen2/Claude]四象限数据,用ANOVA检验交互效应。若A组-Qwen2显著提升,而A组-Claude无变化,则归因于prompt对Qwen2的适配性优化。
关键点:模型层分桶必须固定,不能随状态动态调整,否则破坏实验纯净性。为此,我们为实验流量单独配置
experimental_routing策略,关闭实时状态权重,仅按intent硬路由。
5. 工具链与基础设施建议
5.1 路由核心服务选型:自研 vs 开源 vs 托管
我们对比过三种方案,结论很明确:中小团队用开源框架起步,中大型团队必须自研核心路由引擎。
开源方案(如LangChain Router、LlamaIndex Agent):
优势:上手快,内置简单路由逻辑(如基于关键词、Embedding相似度);
劣势:无法满足7条铁律中的实时状态感知、成本实时计算、范式一致性等硬需求;
适用场景:POC验证、内部工具、低流量场景(<100 QPS)。托管服务(如AWS Bedrock Orchestrator、Azure AI Gateway):
优势:免运维,自带基础监控;
劣势:黑盒、不可定制、成本不可控(按调用次数收费,不区分模型成本)、日志不开放;
适用场景:无专职MLOps团队、合规要求极高的金融客户(需厂商SLA背书)。自研方案(推荐):
技术栈:Go(高性能、低GC) + Redis(实时状态缓存) + Elasticsearch(日志) + Prometheus(指标);
架构亮点:- 状态中心:独立
state-service,聚合所有模型探活、监控、成本数据,提供gRPC接口供路由服务调用; - 策略引擎:用Drools规则引擎管理7条铁律,规则可热更新(无需重启);
- 灰度发布:支持按
user_id % 100、intent、region多维灰度,新规则先放1%流量验证。
- 状态中心:独立
我们自研路由服务上线后,故障平均恢复时间(MTTR)从47分钟降至8分钟,成本波动率下降62%。投入产出比极高。
5.2 监控告警体系:不止看P99,更要盯住“决策健康度”
传统监控只关注latency、error_rate,但路由层的健康,更要看“决策是否合理”。
核心监控指标:
| 指标名 | 计算方式 | 告警阈值 | 业务意义 |
|---|---|---|---|
routing_decision_stability | 过去10分钟,同一intent下模型选择变化率 | >15% | 反映路由策略是否震荡,过高说明状态探活不准或权重计算不稳 |
fallback_rate | 降级请求量 / 总请求量 | >5%持续10分钟 | 主模型稳定性预警,需立即检查上游服务 |
cost_efficiency_ratio | 实际成本 / 理论最低成本(假设永远选最便宜模型) | <0.85 | 衡量路由成本优化效果,过低说明未充分利用低价模型 |
paradigm_compliance_rate | 同范式路由请求量 / 总请求量 | <99.5% | 语义一致性保障,低于阈值需检查意图识别准确率 |
告警分级:
- L1(页面告警):
fallback_rate > 10%,需15分钟内响应; - L2(电话告警):
routing_decision_stability > 30%且latency_p99 > 2000ms,需5分钟内介入; - L3(全员会议):
cost_efficiency_ratio < 0.7持续1小时,启动成本专项复盘。
5.3 团队协作流程:让非技术角色也理解路由逻辑
路由不是纯技术问题,产品、运营、法务都需要理解其边界。我们推行“路由透明化”:
- 产品侧:提供
Routing Impact Simulator——输入一个新需求(如“支持粤语问答”),系统自动输出:- 哪些模型已支持(能力声明);
- 当前状态下,预计QPS、P99、成本增幅;
- 若需新增模型,路由层改造点(如需新增范式、修改探活逻辑);
- 运营侧:每日推送
Routing Health Digest邮件,含:- 昨日各模型
uptime、avg_latency、cost_per_1k_requests; - TOP3降级事件及根因简述;
- 成本节约榜(如“昨日通过智能路由,节省$1,240”);
- 昨日各模型
- 法务侧:路由层自动生成
Model Compliance Report,按GDPR、CCPA等要求,列出:- 各模型数据驻留地;
- 是否支持数据不出境;
- 本次请求是否触发敏感数据过滤(如身份证号脱敏)。
最后分享一个小技巧:我们在路由服务首页加了一个“实时决策看板”,用大屏展示此刻正在发生的每一次路由选择——谁的请求、什么意图、选了哪个模型、为什么选它(显示
reason字段)。新同事入职第一天,盯着看板10分钟,就明白了什么叫“多供应商模型路由”。