决策模型的阈值。
把一次 LLM 分类调用换成决策模型,你真正上线的是一个阈值,而不是一个模型——而截至 2026 年 10 月,没有任何厂商公布设定这个阈值所需的校准证据。概率值多少钱,全看你在自己的标注流量上量出来多少;而成本节省只存在于你能在这条线之上自动化的那部分流量里。
步骤 1为什么交付物是阈值,又为什么没人把它递给你。
决策模型——TypeSafe 的 Jev、OpenAI Decisions API、Cloudflare 的 Clef,以及这篇品类对比里的其余后来者——接收一份状态和一组带类型的问题,返回的是概率分布而不是一段文字。这消灭了格式错误的输出,却没有消灭错误的输出,也不会告诉你概率到多少时可以放心照着执行。这个数得你自己找,而它恰恰是决定这次集成成败的那一环。
你想要的证据并不存在。截至 2026 年 10 月,TypeSafe 的发布文章声称“置信度越高,准确率越高”,却没有给出任何指标;它那篇 “antibenchmaxxing” 文章更是明说不会公布公开基准表。OpenAI 的 Decisions 指南让你用标注样本来设阈值,同样没有公布校准数字。Jev 唯一一个公开的期望校准误差来自第三方,即 Pinocchio 论文(arXiv:2609.24881):在 1,718 条回答上 ECE 0.133、AUROC 0.666、Brier 0.240——但那是一项超出标签用途的任务,即给另一个模型的回答打分,而不是 Jev 主打的分布内分类。它是一个警告,不是一个你能拿来用的数字。
还有一点让可用信号更窄:Jev 的 confidence 字段是 probabilities 的确定性函数。对 Choice 而言它等于 (n·p_max − 1)/(n − 1),所以 (0.6, 0.3, 0.1) 和 (0.6, 0.2, 0.2) 读出来都是 0.4。它没有提供分布里本来没有的任何信息;一切校准结论都只附着在概率上。把一个分数变成弃权闸门的一般理论,见不确定性与校准;本页是针对决策模型 API 落地这件事的操作手册。
利害关系在 Vercel 自己的数字里一目了然。它的 AI Gateway Production Index(2026 年 10 月 15 日)显示,35.3% 的付费团队在头两周试用了 Jev,而 Jev 只占支出的大约四分之一个百分点(报告摘要给出的是 0.27%)。试一下决策模型很便宜;要把真实流量压上去,就得做完本页的这些功课。
步骤 2用你自己的流量构建标注集,并按算术来定规模。
让决策模型以影子模式跑在它要替换的那个 LLM 调用旁边,输入用真实生产数据,记录两边的答案以及完整的 probabilities 对象。精挑细选的评测集不行:校准是一个分布的性质,而唯一要紧的分布是你自己的。TypeSafe 以 MIT 许可开源的 system-one-adapter-python 能把同样的带类型问题跑在 OpenAI、Anthropic、Gemini 或任何 OpenAI 兼容端点上,于是在位方和候选方回答的是形状完全相同的问题——这正是做对比的天然测试架。
真值要由人来标,而不是由在位的 LLM 来标。与旧模型的一致率量的是模仿程度,你要的是正确率。如果用模型评审来扩大标注规模,先按面向智能体的 LLM 评审把评审本身校准好。
标注集的大小,由你需要看清的错误率决定,而不是拍一个整数。假设自动执行区间的错误率要守在 2% 左右,而你想在 95% 置信度下把它确定到 ±1 个百分点以内。正态近似给出 n = 1.96² × 0.02 × 0.98 / 0.01² ≈ 753 条落在执行区间内的标注样本。如果你预计这个区间大约承接一半流量,那总共就要标大约 1,500 条输入,这还没算下面那几个区间。零错误的捷径从另一面讲的是同一件事:在 n 条样本里一个错误都没看到,也只能把真实错误率的上界压到约 3/n,所以 300 条干净样本证明的是“低于 1%”,而不是“为零”。容差每收紧一点,所需标注就按平方增长;先想清楚你付得起多少“知道”,再去选一个你验证得了的容差。
步骤 3从概率上读出校准,再选定工作点。
标注集到手后,取每个答案的最高概率(对 Noul 就取概率本身;它没有 confidence 字段,值接近 0.5 就是模型在说自己拿不准)。把它分箱——在这个样本量下按十分位分就够了——然后画出每个箱的准确率对该箱平均概率的曲线。这张可靠性图告诉你,在你的流量上“0.9”是否真意味着十次对九次。接着扫描阈值,画出覆盖率–风险曲线:在每个切点上,你会作答的输入占比,以及其中的错误率。
按问题逐个从曲线上选阈值,依据是这个问题你能容忍的错误。把工单分错队列和自动批准退款是两个问题,阈值也不同;全局只用一个阈值,就等于你按最危险的那个问题来设,并在其他所有地方用覆盖率来买单。TypeSafe 的文档还建议把最高概率以及最高与次高概率之比也试作信号;如果确认阈值设得较低,一个间隔检验(最高减次高)能把一个明确的 0.55 胜出者与一次 0.55/0.45 的抛硬币区分开。
成本账要在选定的工作点上算,而不是在 100% 上算。如果 70% 的流量越过了执行阈值,剩下 30% 仍然要走老的 LLM 路径或交给人,所以你的账单是“决策模型跑全部流量”加上“在位方跑剩余流量”。那些标题倍数——TypeSafe 主页凭自家工作流评测宣称便宜 444.6 倍,而 OpenChamber 汇总用户自报得出的中位数是 30 倍——描述的是被自动化的那部分,而不是你的总账。
步骤 4三个区间,按爆炸半径定标,并且有一个真实可去的升级出口。
TypeSafe 的置信度文档推荐用三个区间而不是一刀切:高置信度执行,中置信度确认,低置信度升级,阈值按动作的风险来定。就用这个形状。
- 执行。高于上阈值,决策直接执行,不经复核。这是唯一能省钱的区间,也是你在 STEP 2 里精确测过错误率的唯一区间。
- 确认。介于两个阈值之间,决策先准备好,由一道廉价的检查——一次人工点击、一条确定性规则、再追问一个问题——来放行。
- 升级。低于下阈值,输入转给老的 LLM 路径或交给人。让这条路一直活着、一直有预算;新模型上线那一周就把它下线,正是升级区间变成故障的方式。
上阈值要按一次错误的代价来定。可撤销的标签可以接受较低的门槛,不可逆的动作则不行;凡是涉及钱或客户的动作,通常在数据证明之前根本不该有执行区间。
步骤 5相信曲线之前,先探一遍已知的锯齿边缘。
分布内流量上一条漂亮的覆盖率–风险曲线,对模型已知会在哪些地方变形只字未提。晋级之前逐项测试:
- 选项顺序。TypeSafe 的 Jev 1.13 锯齿页(最后复核于 2026 年 10 月 2 日)说 Choice 会“偏向排在最前面的选项”。抽一批样本把选项打乱重跑,量一量答案或所在区间改变的频率。
- 重复请求。Pinocchio 报告 Jev 对完全相同的重复请求会返回不同的分数,在他们的 AUROC 上带来约 0.02 的运行间波动;TypeSafe 的文档承诺相似的输入得到相似的答案,但没有确定性保证。把相同请求发几遍,数一数每个阈值附近的区间翻转。
- 对抗性状态。文档承认模型默认不把状态当作敌意内容。HiddenLayer 演示了一个被注入的页面元素劫持了结账决策;Wu 与 Lim(arXiv:2609.28613)发现注入文本会移动概率,却很少翻转被选中的答案,自适应攻击把成功率从 1.8% 提到了 3.5%。要细读这句话:即便 argmax 不变,一个被推动的概率也可能让答案越过你的阈值。
- 算术与日期。文档直说 Jev “不是计算器”,并且把日期当文本来读。计数、求和、日期比较放在代码里算,只把剩下的判断交给模型。
步骤 6钉住版本,把阈值绑在版本上,并盯住各区间。
阈值是关于某一个模型版本的事实。别名会在你脚下移动:截至 2026 年 10 月 19 日,jev-latest 指向 1.13.0,而 TypeSafe 的 1.14 文章说它会在 10 月 14 日发布一周后切到 1.14.0,也就是 10 月 21 日前后。文档说别名会静默移动,并建议:如果阈值是针对某个版本调出来的,就钉住带版本号的 ID。TypeSafe 计划在弃用 1.13.0 前提前 60 天通知、1.14.0 提前 30 天;正式的弃用政策已承诺但尚未公布。把每次版本升级都当成一个新模型:重跑标注集、重画曲线、重新推导阈值,见模型弃用与迁移和未钉住的厂商默认值。
# request: pin the version the thresholds were derived on { "model": "jev-1.13.0", ... } # not "jev-latest": the alias moves silently # thresholds are keyed by version; values here are illustrative THRESHOLDS = { "jev-1.13.0": { "act": 0.97, "confirm": 0.80 } } # choice/score answers; for a noul, use max(p, 1 - p) of its "noul" value def band(response, question): t = THRESHOLDS[response["model"]] # unknown version -> KeyError, by design probs = response["answers"][question]["probabilities"] top = max(probs.values()) # read probabilities, not "confidence" if top >= t["act"]: return "act" if top >= t["confirm"]: return "confirm" return "escalate" # old LLM path or a human
响应里会回显实际作答的模型,所以要用它来查表,而不是用你请求时写的那个;这样遇到未知版本就会大声失败,而不是悄悄借用旧阈值。
在生产中,三个信号承担了大部分分量。各区间的人口占比:执行、确认、升级三个区间的流量占比是你手里最便宜的回归信号,因为它不需要标注,而且模型或输入分布一变,它当天就动。升级率:它才是真正的成本驱动因素,因为每条被升级的输入都要为两个模型付费。执行区间的抽检标注:从自动执行的决策里稳定地抽一小份交给人复核,因为错误正是在这个区间里无人察觉地发出去的,而你在 STEP 2 的估计也会在这里悄悄过期。把这三项都接进质量回归检测。
在把任何一条真实决策交给它之前:让决策模型以影子模式跑在在位方旁边,并人工标注足够的流量,以你需要的精度量出执行区间的错误率(2% ± 1% 约需 750 条区间内样本)。用 probabilities 画可靠性图和覆盖率–风险曲线,忽略 confidence。按问题设三个区间,按爆炸半径定标,并让升级路径保有预算。打乱选项、重复请求、注入敌意状态。钉住 jev-1.13.0 或对应的版本号,阈值按版本做键,每次升级都重新推导。然后盯住区间占比、升级率和执行区间的抽检标注。如果只记一句:厂商卖给你的是模型,阈值得你自己造。