调度开销 —— 滚动 p95: 11ms. 数字为示意性建模结果,非实测。

模型调度与降级层

小的先上,大的兜底。

实时

  • −64%单位成本,同口径
  • 91.9%一次命中率
  • 11ms调度自身开销 p95

Switchyard 是一层中间件,横在你的应用和你付钱的每一家模型之间。请求出门前先打分,交给能过你质量下限的最便宜那一档;过不去的往上抬一级,上游抽风的横着绕开。

数字为示意性建模结果,非实测。

联锁实时进路表 —— 按成本排级,最便宜的在最下面FIG-00示意数据
020406080100120140160180200L-3R旗舰·深推理4%L-3旗舰通用19%M-2中型通用31%S-1小型通用38%C-0语义缓存8%n 134n 486n 749n 839n 192能力 / 成本/chat入口8百万 / 月进路记录 / 最近六条编号难度排到哪一档06D 37M-205D 35M-204D 12S-103D 63L-302D 13S-101D 5S-1 → M-2难度指纹9 msRw 0.34Cw 0.22Fw 0.14Kw 0.20Xw 0.10难度 D788645926176D3 · 复杂→ L-3升级横渡8.1%的已路由请求往上抬一级本次观测在途 / 本次会话在途请求 / 上限 36一次命中已模拟调用8.1% n 1793091.9%2,400010203040506070809101112131415161718192021222324252627282930
  • 01一个请求,带编号。走到它该去的那一档就离开画面。
  • 04被升级的。道岔打开,包往上抬一级,编号还是那个编号。
  • 一条轨流得多快,就是这一档占多少流量。这里没有一样东西是装饰。
示意模型 · FIG-00 · 每条轨上的包有多密,就是这一档的流量份额;被升级的请求,落在它原本要去的那一档上面一级。

02 — 为什么是现在

同一个问题,43.0倍的价差。

十八个月里,能拿去做生产的通用档位翻了两番还多,同一个答案的价格也跟着拉开。选型不再是上线前拍一次板的事,它变成了每个请求都要重做一次的决定。

  • 9 → 31可用于生产的通用档位只用供应商中立代号,从这段窗口起点算到现在
  • 43.0×最便宜的一档到最贵的一档同一个问题,每一档的输入输出长度都一样
  • 6默认阶梯的级数缓存、自托管、小型、中型、旗舰、旗舰深推理
各档位价格带一个答案的成本,每次调用美元,横轴对数FIG-01示意数据
$0.00001$0.0001$0.001$0.01通用档缓存与自托管档L-3R旗舰·深推理$0.01980L-3旗舰通用$0.01020M-2中型通用$0.00246S-1小型通用$0.00046H-1自托管 8B$0.00008C-0语义缓存$0.0000243.0×S-1 → L-3R · 最便宜的通用档到最贵的通用档每次调用美元 — 对数刻度
示意模型 · FIG-01 · 每一档都按同一条问题、同样的输入输出长度算一次;深推理那档同一个问题会吐更多输出,账也更贵。

看证据

03 — 问题

押一个模型,就是赌。

把所有档位放到同一批没分过难度的流量上测,结论永远是「只能买最贵的」。于是例行请求也按旗舰价付钱。这张图本身没错,错在它把难题和废话装进同一个桶里测。

成本 × 质量,同一批样本裁判分对每千次调用成本,横轴对数FIG-02示意数据
60708090$1$10S-171.2M-279.8L-388.6L-3R90.9这张图会让你买的那一档每千次调用美元 — 对数刻度裁判分 0–100那张图没有画出来的一个月一个点 = 当月模型开销 500 美元过度供给:例行请求也走旗舰60%重试黑洞:失败与截断的重跑6%上游抖动:限流期间的排队与超时重发2%真正必要的旗舰调用31%173 × $500$86,500
示意模型 · FIG-02 · 所有档位跑的是同一批没分难度的混合流量 —— 正是这张图,把一个又一个团队劝去买顶档。

一个中等规模的 AI 客服 + 文档问答产品(示意)

三笔没人单列的账
三笔没人单列的账值
过度供给:例行请求也走旗舰$52,300
重试黑洞:失败与截断的重跑$4,900
上游抖动:限流期间的排队与超时重发$2,100
真正必要的旗舰调用$27,200
合计$86,500

过度供给是大头。重试和上游抽风这两笔,从来不会出现在任何一张模型对比表里 —— 对比表一次只测一条调用,这两笔要攒够一个月才看得见。

而你押中的那一档一旦开始限流,你没有第二选择可以退,你只有一条队。

04 — 难度指纹

十毫秒,五个维度,一个分数。

指纹只回答一个问题,而且赶在请求出门之前回答:这条有多难。五个维度,固定权重,合成一个分数。不看用户是谁,不看历史,只看这一条请求本身。

  • 5 / 9 / 14 毫秒延迟(p50 / p95 / p99)
  • $0.00003每次调用成本
  • 0.71与人工标注一致性(κ)
  • 84.1%分档准确率(按流量加权)
五个维度,一个分数权重固定,写在图上;这个分数是路由器唯一的输入FIG-03示意数据
五个权重固定,加起来是一打分耗时p95 9 msR推理深度w 0.34C上下文跨度w 0.22F格式严格度w 0.14K事实敏感度w 0.20X拒答风险w 0.10把这段话翻成英文R12C8F20K15X5难度 D12难度带D1例行落到S-1把这份 PDF 里的表格抽成 JSON带 schema 校验R34C62F96K55X12难度 D51难度带D2常规落到M-2根据这三份合同,我们能不能单方面终止R78C86F45K92X61难度 D76难度带D3复杂落到L-3
示意模型 · FIG-03 · 每条请求五个维度,权重如图;D 是加权和

四个难度带

四个难度带
难度带区间流量份额
D1例行D < 2542%
D2常规25–5534%
D3复杂55–8019%
D4高风险长链D ≥ 805%
规模
60M 编码器,自托管
微调集
1,200,000 条打标请求

打分的是一个自托管的小编码器,所以「这条该走哪」这件事,不需要先把请求发出去才知道。

它会判错。判低的那部分由阶梯接住;判高的那部分就是白花的钱,这个数我们照实印出来,不抹平。阈值调紧,浪费变小,升级率跟着上去 —— 这个旋钮在你手里。

欠路由
判得比实际低一档以上。这部分由阶梯接住——它是升级的主要来源。
过路由
判得比实际高一档以上。这部分没人接:钱白花了,约占账单 11%。

打开术语表

它在哪判错按行归一化,各真实带内的流量占比 %FIG-03B示意数据
预测带真实带D1D2D3D4D191.27.90.80.1D29.479.810.10.7D31.114.677.27.1D40.22.418.379.1按行归一化到 100分带准确率(按流量加权)84.1%判低了 — 这些由阶梯兜住7.2%判高了 — 这就是多花的钱8.7%判高了 — 这就是多花的钱$0.439美元 / 千次11% 占调度后账单
示意模型 · FIG-03B · 分档准确率按流量加权。判低的那批由阶梯接住,判高的那批就是浪费掉的钱。

05 — 路由预算

预算不是报表,是约束。

每个端点自己声明一个每千次调用的美元上限,路由器在这个上限里面求解。余量见底时,整条阶梯当天下压一级。没有「钱花超了再发封邮件」这一步。

路由决策树每条边写着它的条件,每个叶子写着它占多少流量FIG-04示意数据
第一个判断语义缓存命中?cos ≥ 0.94 && same tenant && same prompt_versionD142 pp例行D234 pp常规D319 pp复杂D45 ppC-08S-130M-24S-18M-222L-34M-25L-313L-3R1L-32L-3R30102030405060708090100占全量流量的百分点Σ 100 pp路径档位ppD1缓存命中C-08D1D1 → 预算充足S-130D1D1 → 事实敏感度 K ≥ 70M-24D2D2 → 格式严格度 F < 80S-18D2D2 → 默认M-222D2D2 → K ≥ 85 或 F ≥ 95L-34路径档位ppD3D3 → 预算余量 < 20%M-25D3D3 → 默认L-313D3D3 → R ≥ 85L-3R1D4D4 → 预算余量 < 20%L-32D4D4 → 默认L-3R3
示意模型 · FIG-04 · 所有叶子的份额加起来就是全部被路由的流量。改预算,选中的分支真的会换一条 —— 这棵树是重算的,不是重画的。

每个决定都是这棵树上的一条路径,而这棵树是能读的。每个请求都带着它走这条边的理由:落在哪一带、哪条规则触发、最后拿到哪一档。

有四条旁路规则可以盖过这棵树:格式严的强制走带结构校验的档;事实敏感的禁用最小那档;预算余量不够的整条阶梯下压;容易被拒答的并行跑两档,取先到而且过了下限的那个。

看怎么接进去

各端点的预算与实测

美元 / 千次调用

各端点的预算与实测
端点质量下限预算实测余量
/chat客服对话裁判分 p10 ≥ 74$4.20$2.8133%
/docqa文档问答裁判分 p10 ≥ 78$5.50$4.2223%
/extract结构化抽取结构通过率 ≥ 99.0%$4.80$3.6823%
/review合同与代码审阅裁判分 p10 ≥ 84$9.60$8.6510%

在这个示意部署里预算是硬上限,四个端点都跑在各自的上限以内。

06 — 降级阶梯

出问题要横着倒,不要竖着塌。

一条阶梯就是一串有序的级:模型档、参数、提示版本、触发条件、最长等待。超时、报错、结构校验没过、裁判分低于下限,请求就往下一级走。同一条阶梯,上行下行都走得通。

  • 91.9%一次命中率8,455 / 9,200
  • 8.1%触发阶梯745 / 9,200
  • 1.4%升级抖动< 2.0%
一万次请求,从进到出缓存、一次命中、阶梯的每一级,以及最后掉出去的那一点FIG-05示意数据
每一万次进入最终给出了答案99.99%进入10,000语义缓存命中800进入路由9,200首选档一次通过8,455触发阶梯7458.1%02,0004,0006,0008,00010,000在触发阶梯的那些请求里斜纹 = 计为失败+1 档解决589+2 档解决127顶档解决25有损应答(Brownout)3硬失败1触发阶梯Σ 745一次命中率91.9%升级率8.1%升级后平均提分+12.0
示意模型 · FIG-05 · 按每一万次到达计。这里的升级率,和首屏那个计数器读的是同一个数。

阶梯的代价

阶梯的代价是延迟。中位数会明显往下掉,因为大多数请求本来就不需要旗舰档;最远那截尾巴反而略微变差,因为升级过的请求跑了两跳。这笔账我们认,也画在图上了。

如果某个端点吃不起这条尾巴,就让它并行跑两档,为扔掉的那一档付钱。

阶梯的代价
分位基线调度后变化
P502,265ms955ms−58%
P753,532ms1,927ms−45%
P905,911ms4,223ms−29%
P957,545ms7,257ms−4%
P9913,332ms13,511ms+1%
两条延迟分布阶梯的代价FIG-06示意数据
调度后基线调用占比,%0102030400–250250–500500–1k1k–2k2k–4k4k–8k8k–16k端到端延迟,毫秒 — 对数分桶分位基线P502,265msP753,532msP905,911msP957,545msP9913,332ms调度后P50955msP751,927msP904,223msP957,257msP9913,511msP99 +1% · 斜纹 = 比基线更差调度自身开销指纹 / 决策与预算,p95 9 / 4 msP506msP9511msP9919ms
示意模型 · FIG-06 · 端到端延迟,对数分桶,两条分布画在同一根轴上

07 — 质量下限

下限你定,不是我们定。

每个端点自己声明一条下限:裁判分的 p10,或者结构化输出的通过率。这条线不参与交易 —— 省钱只能在它上面那段余量里省。

  • −2.3整体裁判分89.1 → 86.8
  • +2.8尾巴反而是往好里走的p5 68.4 → 71.2
四个端点,各自对自己的下限交卷每个端点自己声明下限,量纲也自己挑:散文类用裁判分分位,结构化输出用 schema 通过率。四个端点都在自己声明的下限之上。降幅之间差三倍,原因每次都是下限。FIG-07示意数据
流量份额声明的下限实测美元 / 千次降幅/chat客服对话46%裁判分 p10 ≥ 74p10 = 79.160100$2.8174%/docqa文档问答29%裁判分 p10 ≥ 78p10 = 81.660100$4.2261%/extract结构化抽取18%结构通过率 ≥ 99.0%99.4%95100$3.6866%/review合同与代码审阅7%裁判分 p10 ≥ 84p10 = 85.260100$8.6520%Σ下限线右边那段空隙,就是省钱的来源$3.7865%
示意模型 · FIG-07 · 份额和为 1.00;降幅按同口径与单档基线比较

尾巴反而是往好里走的

整体裁判分掉了两分多,我们没打算藏。但分布最烂的那一头反而变好了:有了下限,最差的那批答案会被强制重做一遍 —— 单档架构根本不知道它们烂,因为它没有任何东西可以拿来比。

平均下来是这样
口径整体裁判分
基线:全量走旗舰档89.1
调度后:只算首选档85.8
调度后:算上阶梯86.8
难度切片 × 档位 裁判分在给任何东西定档之前,该读的是这张表FIG-07B示意数据
难度切片 × 档位 裁判分
档位D1 例行 · 42%D2 常规 · 34%D3 复杂 · 19%D4 高风险 · 5%
C-088.285.0——
S-186.879.466.151.8
M-289.186.176.363.2
L-390.489.887.978.6
L-3R90.690.289.485.4
示意模型 · FIG-07B · 空格是我们不会往那里路由的组合。每一列的权重,就是这一难度带的流量份额。

20%

/review · 合同与代码审阅

参考部署里有一个端点几乎没省下什么,这恰恰是对的:它的下限本来就贴着能服务它的那几档的天花板,根本没多少余量可省。

08 — 单位答案成本

按答案算账,别按 token 算账。

分母是被你的产品真正采纳的回答。分子里含重试、升级时被丢掉的低档调用、裁判评分、分类器摊销、影子重放。按 token 出的账单,把这些全藏起来了。

  • −64%单位成本,同口径$10.81 → $3.88
  • −53%账单$86.5k → $40.4k
  • +30%调用量(百万)8.0 → 10.4
六个月账单,对着反事实曲线看调度覆盖率一路放量时的月度支出,底下的流量还在涨FIG-08示意数据
实际付掉的账单同样的流量全程只用一档两条线之间的面积0306090120M0 基线M1M2M3M4M5M6月账单,千美元112.440.4两条线之间的面积路由覆盖率08.0158.2358.5608.9829.4959.910010.4每月调用,百万次实际付掉的账单−53%$86.5k → $40.4k每月调用,百万次+30%8.0 → 10.4每千次调用美元−64%$10.81 → $3.88
示意模型 · FIG-08 · 这段时间流量是在涨的,所以往下走的那条线是单位成本降了,不是这个月调用少了。
调度后的单位成本花在哪美元 / 千次调用FIG-08B示意数据
每千次调用美元$0$3$6$9$12基线$10.81调度后$3.884−64%模型推理(五档混合)$3.669被略过的那四行×100升级浪费(丢弃的低档调用)$0.073影子重放(3% 流量)$0.105指纹分类器(自托管摊销)$0.030裁判评分(6% 抽样)$0.007$0$0.12调度后Σ $3.884
示意模型 · FIG-08B · 美元 / 千次调用 · 合计 $3.884

其中三项是我们自己吃掉的:升级浪费、影子重放、分类器摊销。我们照样把它们列出来 —— 不列,账面就会比现实好看,那是 PPT 赢过现实的老办法。

图上两条线,一条是实际付掉的账,一条是同样的流量继续全量走单档会付的账。两条线之间那块面积,就是这个产品的全部论据。

单位答案成本

单位答案成本
口径单位成本采纳率单位答案成本
基线$10.8194.1%$11.49
调度后$3.8894.6%$4.11

11%

过路由

判得比实际高一档以上。这部分没人接:钱白花了,约占账单 11%。

09 — 影子重放 · 切换窗口

新档位要先在影子里活够久。

一小部分真实流量会被复制一份,离线喂给候选档。这些回答不返回给任何人,只用来更新质量分和置信区间。

  • 3%影子重放312,000 / mo
  • 5,0005,000 条影子样本2–4 d
  • ±0.6置信区间下界不差过 0.5 分σ ≈ 22
置信区间怎么收窄的裁判分置信区间的半宽,对影子样本量FIG-09示意数据
置信区间半宽,裁判分该样本数下的理论半宽σ ≈ 22±0±1±2±3±0.6切换门槛±3.1200±1.9500±1.41,000±1.02,0005,000±0.410,000±0.320,000同一端点上的影子样本数 — 对数刻度置信区间半宽,裁判分放量三步切换门槛 · 5,000 · 7 d15%225%3100%
示意模型 · FIG-09 · 影子流量和普通调用一样要付钱,这笔钱已经算在上一段那个单位成本里了。

一个候选档要穿三道门才能变成默认:同端点的影子样本够多、连续天数够长、置信区间的下界不比现任差太多。三道门都过了也不是一把切过去,放量分三段走。

三道门

5,000 条影子样本
同一个端点上的 5,000 条。不是全站凑 5,000——端点之间不通用。
连续 7 天
足够装下一个周末和一个周一,这两者长得完全不一样。
置信区间下界不差过 0.5 分
95% 区间的下界,不得比现任档低 0.5 分以上。

样本门槛不是谁挑了个整数,而是置信区间刚好收窄到「差半分不再是噪声」的那个位置。

档位 · 状态

C-0 复用层, H-1 指纹 / 兜底, S-1 D1 主档, S-2 D1 长文, M-2 D2 主档, M-3 /extract 候选, L-3 D3 主档, L-3R D4 主档(输出≈3×), X-9 2026-06 移出

档位也会出去。上个季度提上来几个,回滚一个,下架两个。一个只进不出的调度层,不是在维护阶梯,是在收藏阶梯。

5% → 25% → 100%然后才放量

10 — 有损可用 · 立场

宁可灯光变暗,不要全城断电。

上游限流或者直接躺了的时候,端点自动压到低档、砍掉输出上限、关掉顶档,继续出答案。一个降了质的回答,总好过一个错误页。

  • 31.4%上游失败率upstream 5xx+429 > 8% over 60s
  • 1.1%用户侧错误率检出耗时 40s
  • 41.2%来自有损档的应答整体裁判分 86.9 → 81.6
一次事故,逐分钟上游失败率、用户侧错误率、降级份额、裁判分,共用一条时间轴FIG-10示意数据
示意事件:旗舰档上游 429 率从 0.3% 冲到 31.4%upstream 5xx+429 > 8% over 60s上游失败率31.4%3508% / 60s来自有损档的应答41.2%450用户侧错误率1.10%1.20整体裁判分86.9 → 81.68878+4min切换 · 检出耗时 40s0481216202428距首次报错的分钟数
示意模型 · FIG-10 · 标出来的那一分钟,是阶梯切过去的时刻。后面那一整段,都是「继续出答案」的代价。

示意事件里,上游失败率冲到两位数,用户那一侧的错误率几乎没动。代价就印在旁边:相当一部分回答来自降级档,整体裁判分在事故持续期间一直压着。检测时间按秒算,不是按工单算。

触发规则:上游 5xx 与 429 在 60 秒内超过 8%。

/chat 与 /docqa 顶档由 L-3 换到 M-2,输出上限 1024 → 512,关闭 L-3R

我们不做的五件事

  1. 不训练、不托管模型权重(除一个自用的 8B 分类/兜底档)
  2. 不做公开评测榜,不发布任何点名厂商的质量对比
  3. 不保留提示与输出正文——默认只留指纹、路由决策、指标;正文留存需你显式开启
  4. 不替你决定质量下限;下限是你的产品决定,不是我们的默认值
  5. 不做锁定:阶梯配置是纯文本,导出即可在没有我们的情况下继续跑

每一条都让我们少赚一点,所以才值得写下来。

我们也会直接说什么时候别买:只有一个端点、只用一个模型、月支出本来就不大,或者你的下限已经贴着能服务它的那几档的天花板。 看我们的立场