模型质量线上线下漂移归因:Cohort、延迟标签与版本证据
离线分数上升而线上满意度下降,可能来自人群变化、标签延迟、Fallback 或多个组件同时换代。本文把曝光、完整运行 Bundle、标签水位和归因窗口冻结成可更正而不可改写的证据。
本文要点
- 主题聚焦:AI、大模型、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
候选模型在冻结评测集上提高 4 分,上线一周后“有帮助”却下降。原因可能不是模型退化:新流量来自更难的入口,差评要等退款或工单关闭才出现,供应商超时让 8% 请求回退旧模型,Prompt 和检索器又在实验中途热修。若只按日期连接两个仪表盘,任何解释都能看起来合理。
Agent 在线评测指标定义成功率、接管和成本等观测,RAG 评估漂移聚焦查询分布与离线金标失配。本篇覆盖完整模型应用 bundle,并要求每个线上结果能回到准确 exposure,而不是从总体曲线猜归因。
冻结归因合同和实际曝光
发布 qualityAttributionPlan.v1,绑定离线 run receipt、候选与基线 bundle digest、资格规则、稳定 cohort hash、分流比例、主指标与 guardrail、slice 字典、最小效应、分析窗口、label 来源、成熟延迟、最大等待、right-censor 规则、fallback 处理和更正政策。bundle 至少包括模型、Prompt、检索索引、工具目录、输出 parser、安全策略与供应商路由;只写 model name 无法归因。
schema: qualityAttributionPlan.v1
plan: support-quality-q3@4
offlineRun: eval-2026q3-184@sha256:8a1...
bundles: [baseline@sha256:21c..., candidate@sha256:9bd...]
assignment: account-sticky@7
labelMaturity: 14d
maxWait: 30d
primary: resolved_without_reopen@30d
路由在响应前写不可变 assignmentReceipt.v1,包含 assignment、匿名实验单位、资格/cohort、预定 bundle、slice、时间和数据用途。执行与 fallback 按同一 exposure ID、稳定 attempt ID 追加 receipt;已知结果才写 terminal servingReceipt.v1,记录实际 bundle、fallback chain 和终态,不明只记 SERVING_UNKNOWN observation。assignment 不能冒充实际曝光;intent-to-treat 仍须对 serving disposition 完整对账。
Google 的 Rules of ML 强调训练与服务路径一致、记录特征并监控偏差;Hidden Technical Debt in Machine Learning Systems 说明数据依赖和配置纠缠会让局部变更产生远端影响。这些原则不自动给出因果结论。若实验同时升级模型、Prompt 和检索器,证据只能归于整个 bundle;组件归因需要单独受控实验、shadow replay 或预注册交互设计。
延迟标签必须有水位和终态
状态为 ASSIGNED -> EXECUTING -> SERVED | SERVING_UNKNOWN | INVALID_CONFIRMED,且 SERVING_UNKNOWN -> RECONCILING -> SERVED | INVALID_CONFIRMED。reconciler 只按原 exposure/attempt ID 查询 router、provider 和 delivery receipt,不能换 ID 或重跑替代;只有证据证明未服务或该 observation 按 plan 不可恢复,才可记 invalid。finalizeServingReceipt CAS 匹配 assignment/attempt/reconciliation root 与空 terminal slot;重复返回原 receipt,冲突隔离。只有 SERVED 进入 AWAITING_LABEL -> MATURED | RIGHT_CENSORED,标签始终按稳定 outcome/exposure ID 连接。
窗口只有在 exposure watermark 越过结束时间、标签成熟期与 ingest watermark 达标且 SERVING_UNKNOWN = 0 后才进入 READY_TO_CLOSE。未成熟样本单列,超过 maxWait 才按 plan right-censor;各 cohort 还要报告延迟分布和敏感性分析。
唯一窗口接受点 closeQualityWindow CAS 匹配 plan、assignment、attempt/reconciliation、terminal serving、label/correction、bundle 与 metric roots,要求 SERVING_UNKNOWN = 0 并验证分母守恒后写 qualityAttributionReceipt.v1。迟到标签或确认错误产生 correction generation,旧报告标 superseded 而不改数。AI 成本归因可复用 exposure identity,但 assignment 或账单行不能充当质量曝光。
离线与线上只能在相同 slice 和口径下比较方向,不应相减成一个“漂移分”。先检查线上输入覆盖离线集的程度、每个 slice 的离线误差与线上结果,再区分 INPUT_MIX_SHIFT、LABEL_PROCESS_SHIFT、SERVING_BUNDLE_DRIFT、MODEL_BEHAVIOR_DRIFT 或 UNRESOLVED。总体改善而高风险 slice 退化时不得用平均数晋级。模型供应商退化排障帮助排除区域和供应商事故。
让标签和版本故意错位
故障注入包括 cohort salt 改变、跨组用户、assignment 冒充曝光、fallback 漏记、响应后 ACK 丢失、provider 查询不可用/返回错 attempt、用新 ID 替换 UNKNOWN、两个 reconciler 竞争、Prompt 热修不升 bundle、标签延迟和人群混合。预期 UNKNOWN 关闭窗口、无证据 invalid、新 ID 替代和一个 exposure 多终态均为 0,报告分母完全守恒。
门禁要求 assignment 覆盖率至少 99.99%,terminal serving/bundle 覆盖率 100%,SERVING_UNKNOWN 对账 p99 不超过 15 分钟且 close 时为 0,分桶与标签 join 冲突为 0;每个关键 slice 报样本和区间,离线 run 可回到评测 Run 可复现制品。先 shadow receipt,再做 1% canary,标签成熟前不扩量;guardrail 触发就回切基线并保留负向曝光,correction 只能追加。
Related