AI On-Call 心理学:为非确定性告警重建运维直觉
当一名 on-call 工程师第一次以“模型刚才又表现得有点怪”为由关闭告警页面时,团队就已经悄然越界了。这句话同时表达了三层意思:它宣告了问题不可调查,它将未来类似的告警归类为噪音,并免除了轮值人员记录事件经过的责任。一周后,同样的特征再次触发告警,另一个人看到“之前已经关闭过一次”,于是真正的回归(regression)便会一直潜伏在生产环境中,直到有客户在 Twitter 上发帖投诉。
这种模式并不是因为懒惰。它是将标准的 SRE 直觉运行在一个不再表现出确定性的系统上所产生的必然结果。经典的 on-call 培训教导工程师将“输入相同但输出不同”的情况视为可观测性堆栈中的 Bug——这不可能是系统本身的 Bug,因为系统不会那样运作。但基于大语言模型(LLM)的系统正是在每一次请求中都以这种方式运作,这是其设计使然。如果建立 on-call 轮值机制时没有内化这一点,系统就会滑向两个极端:要么是瘫痪(每一个随机波动都是 P2 级事故),要么是虚无主义(模型总是很奇怪,别再给我发告警了)。
我所见过的处理得比较好的 团队,会将 AI on-call 视为一门与传统可靠性工作截然不同的学科。他们重新设计了告警分类体系,重建了轮值激励机制,并投入精力进行培训,明确要求参与者抛弃一些根深蒂固的 SRE 本能。以下是这些实践经验的总结。
“模型当时想这么做”并不是根本原因
传统 SRE 的运维前提是:通过严密的调查,每个事件都能找到其根本原因——错误的配置推送、竞态条件或是依赖项性能下降。围绕这一前提建立的复盘文化(五个为什么、因果链、无责备复盘)只有在树的最底层确实存在一个“为什么”时才有效。
随机系统(Stochastic systems)从底层打破了这一前提。在第一次 logit 计算中,仅仅一个比特位的差异就可能改变 token 的选择,而一旦轨迹发生偏移,模型可能在这一分钟给出准确答案,下一分钟就产生言之凿凿的幻觉,而输入完全没有变化。当批处理、缓存和请求调度与浮点非确定性相互作用时,即使在相同模型上以相同的 temperature 重放相同的 prompt,也可能产生不同的输出。树底层的“为什么”往往只是采样过程的联合熵(joint entropy)。
危险的做法是将这一事实引入 on-call 行为,将其作为停止调查的通行证。如果“模型当时想这么做”变成了事故树中被接受的终端节点,那么你已经把 AI 路径上的每一个生产环境 Bug 都定义为了不可分析。抵制这种倾向的团队会采取一种微妙的做法:他们将“随机性”视为分类体系中的一个类别,而不是逃避的 借口。“在当前 N=1 的情况下无法与采样噪声区分”是一个结论,但它会触发不同的工作流——通常是自动请求以更高的 N 值重放追踪(trace)、运行针对性的评估切片(eval slice),或者在特征持续出现时升级处理。轮值产生的结果要么是真正的根本原因,要么是足以说明故障处于预期噪声范围内的统计证据。它永远不会产生一个“耸耸肩表示无奈”的结果。
为非确定性系统构建的告警分类体系
大多数 AI 可观测性堆栈只是将 LLM 指标硬塞进现有的告警基础设施中,这产生了根本性的信号混乱。一名工程师被叫醒,打开仪表盘,看到“质量分数下降了 8%”与“p99 延迟增加了 40ms”以及“错误率 0.3%”并列在一起——这三个指标有着三种完全不同的可复现性保证,却通过同一个寻呼机(pager)路由。
一个能够在生产环境中经受考验的分类体系至少将告警分为四个不同的族群,每个族群都有自己的响应协议。
第一种是确定性基础设施:常见的超时、5xx 错误率、依赖项健康状况、队列深度。沿用你之前的直觉即可。如果 GPU 主机卡死了,那就是卡死了;经典的调试方法依然适用。
第二种是策略和契约违反:安全分类器触发、JSON Schema 校验失败、拒绝工具调用、提示词注入检测。在固定的 trace 下,这些是确定性的,尽管它们发生在随机系统内部。单次复现就具有重要意义;它们属于高优先级的告警。
第三种是
