模型回滚流程:版本能切回去,数据也要对得上

模型回滚流程:版本能切回去,数据也要对得上

一、模型回滚不只是把镜像换回旧版本

模型上线后发现效果退化,常见反应是回滚镜像。但 AI 服务的版本不只在镜像里。模型权重、tokenizer、prompt 模板、后处理逻辑、向量索引和评测阈值都可能参与结果。只回滚容器镜像,未必能恢复到旧行为。

因此模型回滚需要一套版本清单。每次发布要记录运行镜像、模型文件摘要、配置版本、依赖数据版本和流量策略。回滚时按清单恢复,而不是靠人临时回忆。

二、把模型发布对象做成不可变快照

平台可以把一次模型发布抽象为 Release。Release 包含所有影响结果的组件引用。线上服务只引用 Release ID,回滚就是把流量切回旧 Release。

flowchart TD A[模型权重] --> E[Release 快照] B[Tokenizer] --> E C[Prompt 模板] --> E D[后处理配置] --> E E --> F[灰度流量] F --> G{指标异常} G -->|是| H[切回旧 Release] G -->|否| I[扩大流量]

Release 一旦发布就不应被修改。需要修复时创建新 Release。这样审计和回滚才不会混乱。

三、控制面要拒绝不完整的发布

下面示例展示一个发布校验函数。它要求关键组件都有摘要,避免“引用了一个路径但不知道内容是什么”。

type ModelRelease struct { ID string ImageDigest string ModelDigest string PromptVersion string ConfigChecksum string } func ValidateRelease(r ModelRelease) error { if r.ID == "" || r.ImageDigest == "" || r.ModelDigest == "" { return fmt.Errorf("release missing immutable identity") } if !strings.HasPrefix(r.ImageDigest, "sha256:") { return fmt.Errorf("image digest must be immutable") } if r.PromptVersion == "" || r.ConfigChecksum == "" { return fmt.Errorf("release missing prompt or config version") } return nil }

这里强制使用 digest,而不是 tag。镜像 tag 可以移动,digest 才能保证回滚时拿到同一份产物。

四、回滚前后都要保留对比窗口

回滚不是结束,还要确认指标是否恢复。平台需要在回滚前后保留同一组指标:错误率、延迟、输出拒答率、业务转化、用户反馈和成本。只看服务是否 200,无法证明模型行为恢复。

还要处理数据兼容。新模型可能写入了新的缓存、向量或日志结构。回滚旧版本后,如果旧代码不认识这些数据,会出现二次事故。发布前就要定义向后兼容策略,尤其是共享存储和缓存 key。

灰度也要可撤销。流量切换最好走统一控制面,不要手改多个 Ingress 或服务配置。手工回滚越多,事故中越容易漏一处。

五、总结

模型回滚流程要围绕不可变 Release 设计。一次发布应记录镜像、模型、prompt、配置和依赖数据的版本摘要,回滚时切换 Release,而不是只换镜像。回滚前后要对比行为指标,并提前处理数据兼容。AI 平台的可靠性,体现在出问题时能准确退回去。