本节摘要:全书最后一节收两笔长期账。第一笔是高基数边界:官方口径下约二十个以上选项的场景 laya 不如 Jev,第 6.3 节的 shortlist 与 tournament 是工程补偿,但补偿有代价——短名单召回失败会连累模型,锦标赛的轮次让推理次数按选项数对数增长。本节给出「走补偿路线还是直接留在 Jev」的判断表。第二笔是校准自理:laya 的温度不会自动跟随微调更新,每次微调后必须重拟合(第 7.1 节),还要按节奏定期重校准并监控漂移——混合语言的输入更要先测 Router 的脚本检测,防止检查点错配。本节末尾给一张全书运维清单总表,作为本书与生产环境之间的交接文件。
官方口径很直接:约二十个以上选项的高基数场景,Jev 更强。第 6.3 节给的两段式补偿——先 shortlist 缩到二十个以内,再 tournament 两两对比——能把任务塞进 laya 的能力区间,但两条补偿路径各有账单:
| 补偿手段 | 代价 | 失败模式 |
|---|---|---|
| shortlist 短名单 | 召回层要自建(规则/向量/排序模型) | 正确选项没进短名单,后面全白搭 |
| tournament 锦标赛 | 推理次数约按选项数对数增长 | 轮次间的位置偏差叠加(第 10.2 节) |
| 两者叠加 | 系统复杂度显著上升 | 排查问题时分层定位成本高 |
于是判断表变成一道简单的算术题:
| 条件 | 建议 |
|---|---|
| 高基数 + 低频调用(每天几百次) | 留在 Jev,按量计费不心疼 |
| 高基数 + 高频调用 + 对延迟不敏感 | Jev 或 Kev(大底座高基数更强) |
| 高基数 + 高频调用 + 必须毫秒级 | 补偿路线,但先测短名单召回率 |
| 名义高基数、实际常用选项少 | 先做选项分层,把热路径变成低基数 |
最后一行常被忽略:很多「高基数」任务的热路径其实只集中在少数选项上,把长尾交给 Jev 或人工、热路径交给 laya,比硬上锦标赛划算得多——这与第 9.2 节混合架构的思路一脉相承。
第 7 章讲过温度拟合与两种置信,这里只强调运维事实:校准状态是有保质期的。三类事件会让它过期:
其一,微调。任何一次微调(第 5 章)都会改变概率分布的形状,旧温度立即作废——必须用隔离的校准集重新拟合,然后重跑第 10.1 节的最小验证集,两个动作缺一不可。跳过重拟合的表现很典型:答案准确率上去了,置信度却系统性偏高或偏低,min_confidence 弃权(第 7.3 节)的阈值全部失准。
其二,分布漂移。生产输入的语言、长度、话题分布慢慢变化,概率分布跟着变。监控手段是把置信分布做分桶看板(示意做法):健康的分布形状稳定,某一天突然整体右移,就是输入侧出了新话题或新语言,先查数据再查模型。
其三,路由错配。多语言输入经 Router 的脚本检测分流(第 2.2 节),检测错了检查点就错了——中文句子被误判进英语检查点,效果直接跌回近随机。上线前与每月例行都要做 Router 自测:准备各语言的固定探针句(每语言十条,示意值),验证分流的正确率;混合语言(一句话中英夹杂)要单独测,必要时在请求里显式指定检查点,绕过自动路由。
# calib_ops.py —— 校准运维三件事:重拟合触发、漂移监控、Router 探针 from datetime import date CALIB_POLICY = { "微调后": "立即重拟合温度 + 重跑最小验证集", # 硬性,不可跳过 "例行重校准": "每季度一次(示意节奏)", # 低风险任务可放宽 "漂移监控": "每日分桶看置信分布,形状突变即告警", # 自动化 "Router 探针": "每月一次各语言探针句验证分流", # 混合语言重点 } def check_calibration_health(conf_hist_recent, conf_hist_baseline, psi_warn=0.25): # 用分桶 PSI 对比近期与基线的置信分布(阈值示意) buckets = [0.0, 0.2, 0.4, 0.6, 0.8, 1.0] psi = 0.0 for i in range(len(buckets) - 1): p = proportion(conf_hist_recent, buckets[i], buckets[i + 1]) q = proportion(conf_hist_baseline, buckets[i], buckets[i + 1]) if p > 0 and q > 0: psi += (p - q) * __import__("math").log(p / q) return {"psi": round(psi, 3), "动作": "重校准" if psi > psi_warn else "继续观察"}
把第 7 章与本节的运维要求合并,得到 laya 生产化的交接清单:
| 频率(示意) | 动作 | 关联章节 |
|---|---|---|
| 每次微调后 | 重拟合温度;重跑最小验证集 | 第 5、7.1、10.1 节 |
| 每日 | 置信分布分桶看板;弃权率监控 | 第 7.3、10.3 节 |
| 每周 | 抽样生产问题做打乱重测(位置偏差) | 第 10.2 节 |
| 每月 | Router 各语言探针;回退开关演练(若迁移自 Jev) | 第 9.3、10.3 节 |
| 每季度 | 例行重校准;边界复读(高基数任务清单过一遍) | 第 10.3 节 |
这张表的潜台词是:laya 的总拥有成本里,运维是持续项,选型时(第 9.1 节的六轴)要把它算进「微调门槛」与「算力」两轴,而不是只看推理费。
| 问题 | 排查顺序与处置 |
|---|---|
| 短名单召回率多高才能用 | 目标 95% 以上(示意值):正确选项没进短名单,后面全白搭;先在历史数据上离线测召回再上线 |
| 锦标赛轮次里位置偏差叠加怎么办 | 固定配对次序加对称轮(每对打两个次序);轮次预算与第 10.2 节对称化成本合并核算 |
| 温度多久重拟合一次 | 两次硬性时机:每次微调后立即;例行每季度(示意节奏)。漂移告警触发时不受周期限制 |
| 漂移告警响了先查什么 | 按序查三处:输入分布(新话题/新语言进来了)→ Router 分流(脚本检测是否误判)→ 模型本身(最后才怀疑) |
| 混合语言探针怎么做 | 每语言固定 10 句(示意值),含 3 句夹杂语;预期检查点与实际分流不一致即记错配,月度统计错配率 |
| 高基数任务想要毫秒级又想要精度 | 别硬扛:热路径分层(常用选项给 laya,长尾留给 Jev 或人工)优于全量锦标赛——见第 10.3 节判断表最后一行 |
| 季度重校准做了但置信看着仍正常 | 正常不等于免检:校准是保险不是纠错,等「看着不正常」再重拟合通常已经误判了一段;按节奏做,把例行的成本算进第 9.1 节的成本轴 |
| 多个微调检查点并存怎么管理 | 命名带版本与日期、一屏登记(检查点名/温度/验证集得分/上线日期);线上只挂一个,其余归档——检查点漂移与第 10.2 节的位置偏差一样,都靠登记制度防乱 |
| 锦标赛结果要不要落日志 | 要:每轮配对、每对的概率、最终胜者——排查「分派异常」时没有轮次日志就只剩猜 |
| Router 显式指定会不会更稳 | 封闭单语言业务建议显式指定(绕开脚本检测的误判面);混合语言才交给自动路由 |
排查的共同底色:高基数与校准的问题都不是「一次修好」,而是「制度管住」——第 10.3 节开头的判断表管选型,这张表管日常。交接清单三件套:
边界写在 README 里是项目的诚实,边界写进运维手册里才是生产的成熟。
全书到此收束:三向选型(第 9 章)给你的路线图,本章给你的边界与账单——合在一起,才是「养得起」的完整答案。附录 A/B/C 收拢术语与速查,练习题留给读者推演。