跳到主要内容

发布顺序问题:为什么同时部署模型与基础设施变更会破坏可观测性

· 阅读需 10 分钟
Tian Pan
Software Engineer

季度开始三周后,生产告警触发了。核心任务的准确率下降了八个百分点。你打开仪表盘,立即注意到同一个发布窗口内落地了三件事:上下文长度从 8k 增加到 32k token、模型版本从 gpt-4-turbo-preview 升级到 gpt-4o,以及基础设施团队为提升吞吐量推送的批处理大小变更。三项变更中没有一项单独被认为是高风险的。合在一起,它们制造了一个无法干净解决的调试难题。

欢迎来到发布顺序问题。

确定哪项变更导致了回归本应是直接的——你只需逐一回滚,然后测量。但这些变更并不独立。模型版本影响系统处理更大上下文窗口的方式。批处理大小影响延迟,延迟影响哪些用户会遇到超时,超时影响你的准确率指标。你在一个只有一个数据点的实验中纠缠了三个变量。你的事后复盘将像往常一样以"多种因素共同作用"这句话收尾。

这并非边缘情况。对大规模 LLM 生产部署的分析表明,这是导致无法归因事故的最常见原因之一。而且后果会叠加:没有归因,你无法修复根本原因,只能回滚所有内容重新开始,在此过程中丢失了与问题变更捆绑在一起的合法改进。

为什么 AI 部署的活动部件比你想象的更多

在传统软件中,一次发布捆绑了应用代码。调试回归意味着阅读 diff。爆炸半径只有一层。

在重度 AI 系统中,单次"发布"往往分散在多个独立层中:

  • 基础设施配置:批处理大小、并发限制、超时阈值、缓存策略、GPU 分配
  • 模型选择:提供商、版本、量化级别(全精度 vs. INT8 vs. INT4)
  • 模型参数:temperature、top-p、最大 token 数、presence/frequency penalty
  • 上下文配置:上下文窗口长度、检索块大小、检索文档数量
  • 提示词和系统指令:措辞、结构、角色设定、few-shot 示例
  • 工具和检索定义:schema 变更、嵌入模型更新、索引重建

每一层都会影响其他层。改变上下文窗口影响内存成本和检索质量。改变模型版本影响模型如何权衡系统指令与用户消息。改变提示词影响模型如何处理检索到的上下文。这些不是独立的旋钮——它们是一个耦合系统。

当你同时调动多个旋钮时,你就失去了读取系统的能力。

归因崩溃

这种故障模式在传统部署工程中有个名字:大爆炸发布 (big bang release)。你积累变更,将它们打包发布以减少部署开销,然后在出现问题且无法判断原因时付出代价。

AI 系统遭受的是这种问题的放大版,因为信号本身就更弱。LLM 是概率性的。输出质量在不同运行中会有显著差异。你跟踪的指标(准确率分数、用户评分、错误率)有噪声下限,可能在数天内掩盖小幅回归。等到回归大到足以触发告警时,你可能已经在问题发布上叠加了两三个更多的发布窗口。

一个具体例子:调试生产事故的团队经常发现自己在问——回归是由上周的提示词调整、用户查询分布的渐进偏移、模型提供商的细微行为变化,还是多个组件之间的交互引起的?没有干净的顺序,根因分析就变成了有依据的猜测。相同的事故会反复出现。

回归归因问题不仅仅是工程上的不便。它决定了你的系统是随时间改善还是震荡。能够隔离原因的团队会持续交付改进。不能的团队则花时间不断回滚和再回滚相同的变更。

"同时"在实践中真正意味着什么

大多数团队并不是故意将变更打包在一起的。顺序问题源于三种结构性模式:

独立团队,共享发布窗口。 你的基础设施团队有自己的迭代节奏,ML 团队有自己的,应用团队有自己的。所有人都向同一个部署流水线发布,而发布节奏制造了人为的捆绑。基础设施团队的上下文窗口扩大和 ML 团队的模型版本升级落在同一个周二部署中,并非因为有人决定将它们捆绑——只是恰好发生了。

看似独立的隐式依赖。 模型版本升级通常需要基础设施变更(不同的 API 端点、不同的 token 限制、影响批处理大小决策的不同定价层)。这些会一起发布,因为它们在逻辑上是耦合的。但它们仍然应该顺序化:先基础设施,再模型,每步都进行测量。

快速发布的压力。 当更好的模型版本可用且工程团队想要获取改进时,同时也更新上下文窗口并修复一些提示词问题的动力就会产生。这种逻辑感觉很高效。实际上不是——这是在用部署速度换取调试速度,而调试速度是凌晨两点出问题时你需要的那个。

顺序化纪律

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates