LLM 的影子流量、金丝雀发布与渐进式部署

Learn~60 minutesPython (stdlib, toy canary-progression simulator)先修要求: Phase 17 · 13 (Observability), Phase 17 · 21 (A/B Testing)
LLM 发布叠加了软件部署中最难的部分:没有单元测试、失败模式分散、信号滞后。流程依次是:(1) 影子模式——把生产请求复制给候选模型,记录日志,在零用户影响下对比;它能抓住明显的分布问题,但不构成质量保证;(2) 金丝雀发布——渐进切换流量 10% → 25% → 50% → 75% → 100%,每一步设闸门;跟踪延迟分位数、每请求成本、错误/拒答率、输出长度分布、用户反馈率;(3) 稳定性确认后,再对差异明显的备选方案做 A/B 测试。非确定性不可消除——相同输入下多次运行,准确率可相差 15%,原因是 GPU 浮点非结合性加上 batch 大小差异。成本是变量而非常量——准确率高 20% 的模型,每次调用可能贵 3 倍。回滚速度是决定性因素:如果回滚需要重新部署,你就太慢了。策略放在配置/开关里;模型放在注册表里并固定 digest;回滚 = 翻转策略 + 还原阈值 + 固定旧模型,几秒完成。
学习目标
  • 区分影子模式(零影响对比)、金丝雀(真实流量渐进)与 A/B(稳定性确认后的对比)。
  • 列举五项 LLM 专属的金丝雀指标(延迟、每请求成本、错误/拒答、输出长度分布、用户反馈)。
  • 解释 LLM 的非确定性(最高 15%)如何改变发布中「稳定」的含义。
  • 设计一条以秒计(翻转策略)而非以小时计(重新部署)的回滚路径。

问题

你发布了一个新模型。离线评估显示准确率提升 3%。你把它在生产上打开。24 小时内,成本上涨 40%,用户点踩率上升 8%,三张客户工单反馈「回答很奇怪」。你回滚。重新部署花了 3 小时。周末毁了。

其中每一环本都可以避免。影子模式本可以在任何用户看到之前抓住 40% 的成本飙升。金丝雀本可以在点踩率变动时停在 10%。策略开关回滚本可以只花 30 秒。这套纪律填补的,正是「离线评估看起来不错」与「真实用户满意」之间的空隙。

概念

影子模式

候选模型接收与生产相同的请求;输出只记录日志,不返回给用户。用户影响为零。记录:

  • 输出内容(与生产结果做 diff)。
  • token 数量(成本差值)。
  • 延迟。
  • 拒答与错误。

能抓住:成本暴涨、长度回归、明显的拒答变化、硬错误。抓不住:用户能感知到的质量差异。影子模式是冒烟测试,不是质量测试。

金丝雀发布

带闸门的渐进流量切换。典型节奏:1% → 10% → 25% → 50% → 75% → 100%。每一步用 5 项指标把关:

  1. 延迟分位数 —— P50、P95、P99。触发条件:金丝雀的 P99 > 基线的 1.5 倍。
  2. 每请求成本 —— 混合后的美元成本。触发条件:高于基线 20%。
  3. 错误 / 拒答率 —— 5xx 加上显式拒答。触发条件:基线的 2 倍。
  4. 输出长度分布 —— 均值 + P99。触发条件:分布发生偏移。
  5. 用户反馈率 —— 点踩 / 工单。触发条件:基线的 1.5 倍。

非确定性是新的方差

相同输入会产生不完全相同的输出。原因:

  • GPU 浮点非结合性(浮点归约顺序随 batch 变化)。
  • batch 大小差异(同一 prompt 在 batch 128 与 batch 16 中)。
  • 采样(temperature > 0)。

实测:在相同评估集上,逐次运行的准确率差异最高达 15%。发布语境下的「稳定」意味着指标落在预期方差内,而不是与基线完全相同。把闸门设在噪声地板之上。

成本是变量

准确率高 20% 的模型,每次调用可能贵 3 倍。每请求成本是五道闸门之一。发布一个「更好」但破坏单位经济性的模型,属于应回滚的情形。

回滚是武器

  • 策略开关(feature flag 系统):在配置里翻转百分比,几秒完成。
  • 模型固定(注册表 digest):被固定的模型不会自动升级。
  • 回滚 = 还原开关 + 把固定 digest 指回上一版。以秒计,而非以小时计。

如果你的技术栈需要重新部署才能回滚,先修好这一点再发布。

工具

Argo Rollouts / Flagger —— Kubernetes 渐进交付控制器。与 Istio/Linkerd 的加权路由集成。

Istio 加权路由 —— 服务网格层的流量拆分。

KServe / Seldon Core —— 内置金丝雀能力的模型服务。

Feature flag —— LaunchDarkly、Flagsmith、Unleash。策略层翻转,无需重新部署。

指标节奏

金丝雀闸门每 5-15 分钟检查一次,取决于流量规模。1% 流量、每分钟 10 个请求,每个窗口有 50-150 个数据点——对延迟够用,对用户反馈则噪声很大。10% 流量大约多出 10 倍。每个阶段的停留时间应足够积累样本。

A/B 步骤是可选的

如果新模型有本质差异(行为不同、成本曲线不同、语气不同),在金丝雀通过后,于 50% 流量上做 A/B 测试。如果只是一个改进版本,金丝雀闸门通过后直接推到 100%。

应该记住的数字

  • 金丝雀节奏:1% → 10% → 25% → 50% → 75% → 100%。
  • 非确定性上限:相同输入下逐次运行方差最高 15%。
  • 五项金丝雀指标:延迟、成本、错误/拒答、输出长度、用户反馈。
  • 成本闸门:高于基线 20% 即触发。
  • 回滚:以秒计,而非以小时计。
i4-canary-ramp静态版本未包含此交互图

使用它

code/main.py 模拟一次注入了回归的金丝雀发布。它会报告发布停在哪一阶段,以及哪道闸门被触发。

交付它

本节课产出 outputs/skill-rollout-runbook.md。给定候选模型、基线和风险承受能力,设计影子 → 金丝雀 → 100% 的方案。

练习

  1. 运行 code/main.py。注入 25% 的成本回归。金丝雀会停在哪一阶段?
  2. 你的新模型离线准确率高 3%,但每请求成本 +18%。该发布吗?取决于策略——写出两条路径。
  3. 设计一条端到端耗时低于 60 秒的回滚。列出所需基础设施。
  4. 非确定性在你的评估中表现为 ±7%。设置金丝雀闸门以避免误报。你使用什么倍数?
  5. 影子模式在金丝雀之前抓住 40% 的成本飙升。写出在影子阶段触发的告警规则。

关键术语

术语人们怎么说实际含义
Shadow mode「复制到新模型」零影响地把请求发给候选模型用于记录
Canary「渐进流量」带闸门的渐进式用户暴露发布
Gates「发布检查」阻止推进的指标阈值
Non-determinism「LLM 方差」不可消除的逐次运行差异
Policy flag「开关回滚」配置层回滚,以秒计而非以小时计
Model pin「注册表 digest」对某个模型版本的不可变引用
Argo Rollouts「K8s 渐进」Kubernetes 原生的金丝雀/回滚控制器
KServe「推理 K8s」带金丝雀原语的模型服务
Istio weighted「网格拆分」服务网格流量拆分器

延伸阅读

示意图共 1 张

rollout diagram
rollout

“Stay hungry, stay foolish.”

— Steve Jobs

esc
↑↓切换↵打开esc关闭