候选模型更新后,最危险的门禁不是“测得太严格”,而是把没有结果解释成没有问题。容器启动失败、来源缺失与模型答错,需要不同处理。如果它们全变成一个空值,再被平均函数忽略,门禁就会悄悄放行。
SWE-bench评测指南提供了运行报告与缓存语义的具体参照;Anthropic十月调查则说明评测行动边界也应留下证据。本文不部署门禁,而是用一个候选版本检查状态迁移。
证据缺失时停在阻断态
假设候选C的来源身份完整,但测试日志未上传。它应停在blocked,等待补证;不能因为“暂无失败记录”变成accepted。补齐日志后,仍要检查阈值与失败类型,再进入人工复核或拒绝。
def gate(evidence, outcome): required = {"input_hash", "model_id", "test_log", "environment"} if not required <= evidence: return "blocked" if outcome == "infra_error": return "review_infrastructure" if outcome == "task_failed": return "rejected" if outcome == "passed": return "review_candidate" return "blocked" full = {"input_hash", "model_id", "test_log", "environment"} assert gate(full-{"test_log"}, "passed") == "blocked" assert gate(full, "infra_error") == "review_infrastructure" assert gate(full, "task_failed") == "rejected" assert gate(full, "passed") == "review_candidate" print("missing evidence never becomes automatic acceptance")示例刻意没有自动发布分支。实际批准应绑定确切输入、版本与结果,不能把对候选C的批准用在后来替换的D上。回滚也需要明确目标版本与触发条件,并保存回滚后的验证记录,而不是只把状态字段改回绿色。
统计告警负责提示,不负责替所有人决策
KS检验文档定义的是分布比较。分布显著变化,可能是输入业务构成变了,也可能是模型输出退化,需要进一步调查;不显著也不能保证没有重要小群体受损。门禁应保留效应量、切片质量和缺失率,而不是单看一个p值。
来源核对负责身份与时效,数值检查负责实现不变量,任务评测负责目标质量,权限检查负责可执行范围。把各层角色写清,失败后才知道补日志、修环境还是更换模型。重复运行也要新尝试号,保留前一次错误,避免把重试成功覆盖成“首次通过”。
本文状态机是内存夹具,没有访问CI、模型服务或生产环境。后续实施还需要并发一致性、持久化、审计与回滚演练,不能把四个条件判断称为完整MLOps平台。
本地验证:上方各 Python 代码块独立保存后,在 Python 3.9.6 的临时目录以python3 example.py执行,退出码均为 0;输出分别为missing evidence never becomes automatic acceptance。数据为文中教学夹具,不是模型、GPU或线上性能测量。
调查发布10月9日、更正12日;其余为持续维护文档。没有生产部署与回滚实测。