系列 《生产化与运营:让 AI 应用可靠、可控、可持续地跑》 第 6 / 6 篇 进阶
系列总览 — 为什么这样组织、读它需要什么、读完能做什么
学习地图 — AI 应用工程师学习地图 第 6 / 7 个系列
- 模型网关——所有调用经过的一层
- 成本工程——从账单到每任务成本
- 延迟工程——从 TTFT 到 agent 的多步
- 安全——注入、供应链与数据泄漏
- 治理与合规——审计、保留、AI Act 与内容标识
- 发布工程——开关、钉版本、runbook 与 SLO
事故先说:周五下午一位工程师在控制台改了一句 system prompt 上线;周一发现一类用例的拒答率翻倍——但没有版本记录,不知道改了什么,也没法一键回滚;同时供应商在周末把浮动别名指向了新快照,两个变化叠在一起,分不清谁造成的。另一个:模型供应商宕机 40 分钟,AI 功能全部报错,没有 fallback、没有降级、没有 runbook,值班的人不知道该做什么。
这一篇把 《Prompt 与上下文工程(06):prompt 当代码管——版本、评测、A/B,以及上下文 vs 检索》(prompt 当代码管)与 《评测、可观测与可追溯(04):回归与门禁——CI、供应商静默升级、A/B 与在线评测》(门禁、影子、灰度)合成一个发布体系:什么算发布、特性开关与 kill switch、钉版本、依赖变更的纳入、五本 runbook、质量与成本 SLO、值班。
本篇要回答的核心问题是:
AI 功能的发布体系由什么组成,什么算发布?1 kill switch、钉版本、依赖变更怎么做?2 五本 runbook 各写什么,质量与成本 SLO 怎么定,谁值班?3
一、总览
1. 发布体系
%%{init: {"flowchart": {"wrappingWidth": 270}}}%%
%% 图:改动 = 发布:版本 → 门禁 → 灰度 → 生产 / 回滚,钉快照与 kill switch
flowchart TB
C["<b>任何会改变模型行为的改动</b><br/>prompt · 模型快照 · effort · schema · 工具集 · 检索配置 · harness 版本"] -- "改动 = 发布" --> V["<b>不可变版本 + 标签</b><br/>staging / canary / production"]
V --> G["门禁:评测集(《[评测、可观测与可追溯(04):回归与门禁——CI、供应商静默升级、A/B 与在线评测](/regression-gates-silent-model-updates-ab-and-online-evaluation.html)》)"]
G -- "过" --> CN["灰度:特性开关按租户 / 比例放量"]
CN -- "在线指标正常" --> PR["production"]
CN -- "回归" --> RB["一键回滚到上一个版本"]
PR -. "供应商别名指向新快照:钉住快照 + 依赖变更单独发布,<br/>两个变化不叠在一起" .-> V
K["kill switch:供应商宕机 40 分钟 → 关掉 AI 功能走降级路径<br/>runbook 写清谁在什么信号下按"] -.-> PR
- 什么算发布
- → 版本化(不可变 + 六元组 + 批准人)
- → 门禁(《评测、可观测与可追溯(04):回归与门禁——CI、供应商静默升级、A/B 与在线评测》)
- → 影子(高风险改动)
- → 灰度(开关按比例)
- → 全量
- → 监控(四指标 SLO)→ 告警 → runbook → 回滚 / kill switch
- 供应商 / MCP 的变更 = 别人替你做的发布
- → 探针 + 通知 + 评估 → 进同一流程
2. 本文的章节安排
第二章什么算发布与版本化;第三章特性开关与 kill switch;第四章钉版本与依赖变更;第五章回滚;第六章五本 runbook;第七章 SLO 与值班;第八章实践建议。
二、什么算发布
1. 清单
任何会改变模型行为或系统对模型输出的处理的东西:
| 类 | 例 |
|---|---|
| prompt | 系统提示文本与结构、few-shot、模板变量、分区标记 |
| 模型 | 模型 id / 快照、effort、temperature、max_tokens |
| 输出契约 | schema、解析与校验逻辑、出口定义 |
| 工具 | 工具集、工具描述、参数 schema、MCP server 及其版本 / 描述 |
| 检索 | 分块、embedding 模型、混合权重、rerank、k、过滤规则、索引重建 |
| 上下文管理 | 卸载 / 清理 / 压缩阈值、压缩 prompt、复述机制 |
| 权限与安全 | 权限档、执行策略、沙箱配置、guardrails 规则 |
| harness | 运行时版本、卫士阈值、预算 |
| 评测 | judge 模型 / rubric、评测集版本(改尺子要重量基线) |
| 路由 | 网关的路由表、fallback 链、级联分流器 |
原则:改动 = 发布,全部版本化、全部过门禁(《评测、可观测与可追溯(04):回归与门禁——CI、供应商静默升级、A/B 与在线评测》)、全部可回滚。”在控制台改一句”必须变成”提一个版本”。
2. 版本化
《Prompt 与上下文工程(06):prompt 当代码管——版本、评测、A/B,以及上下文 vs 检索》:不可变版本 + 标签(staging / canary / production);每次发布记六元组(评测集 × prompt × 模型快照 × 工具集 × 检索配置 × judge)+ 门禁结果 + 批准人(第五篇的责任矩阵)+ 时间。配置即代码(《评测、可观测与可追溯(06):可追溯——录制回放、决策点日志、失败分类与反馈绑定》):版本库或注册表,不在某人的控制台点击里。
三、特性开关与 kill switch
1. 每个 AI 功能一个开关
三种状态:开(正常)、降级(走非模型路径——规则回答、缓存答案、”稍后再试”、转人工;或走更便宜 / 更保守的配置)、关(功能不可用,有提示)。开关按租户 / 用户比例 / 环境生效——灰度就是把开关对 1% 用户打开新版本。
2. kill switch
秒级把一个功能切到降级或关——不经发布流程、不改代码、有权限的人(值班)能操作。用途:供应商宕机(切降级)、成本暴涨(关非核心)、注入 / 越权事件(关涉事功能)、质量骤降(切回旧版本或降级)。它是 《评测、可观测与可追溯(07):运行时可靠性与物理世界的仿真》 fallback 的最后一级、第二篇降级梯子的第五级——必须在上线前就存在并演练过。
3. 开关的层次
功能级(整个 AI 功能)、能力级(agent 的某个工具、检索的某路、judge 抽样)、版本级(prompt / 模型的 canary 与 production 标签)。层次让降级可以精细:关掉多查询检索省成本而不关功能,关掉某个 MCP server 而不关 agent。
%% 图:开关的三个层次与三种状态——功能级(整个 AI 功能:开 / 降级 / 关,按租户与比例),能力级(agent 的某个工具、检索的某一路、judge 抽样各自可关),版本级(prompt / 模型的 canary 与 production 标签);kill switch 是值班在秒级把任一层切到降级或关的权限,不经发布流程,上线前就要存在并演练过
flowchart TB
subgraph F["功能级:「AI 客服」"]
direction LR
F1["开:正常"] --> F2["降级:规则回答 · 缓存答案 · 转人工<br/>或更便宜 / 保守的配置"] --> F3["关:不可用,有提示"]
end
subgraph C["能力级:功能内部各自可关"]
direction LR
C1["多查询检索"] ~~~ C2["某个 MCP server"] ~~~ C3["judge 抽样"] ~~~ C4["agent 的 shell 工具"]
end
subgraph V["版本级:标签"]
direction LR
V1["canary → prompt v13 · 1%"] ~~~ V2["production → prompt v12 · 99%"]
end
F ~~~ C ~~~ V
KS["kill switch:值班秒级操作,不改代码不经发布<br/>供应商宕机 → 降级 · 成本暴涨 → 关非核心 · 注入事件 → 关涉事工具 · 质量骤降 → 标签回旧版"] -.-> F
KS -.-> C
KS -.-> V
classDef ok fill:#eefaf0,stroke:#4d9a5c,color:#222
classDef warn fill:#fff3e0,stroke:#c98a00,color:#222
classDef bad fill:#fdecea,stroke:#c0392b,color:#222
classDef n fill:#fff7e0,stroke:#c98a00,color:#222
classDef ks fill:#eef6ff,stroke:#5b8fd6,color:#222
class F1,V2 ok
class F2,V1 warn
class F3 bad
class C1,C2,C3,C4 n
class KS ks
四、钉版本与依赖变更
1. 钉一切
| 依赖 | 钉法 | 不钉的后果 |
|---|---|---|
| 模型 | 带日期的快照 id,不用浮动别名 | 供应商静默升级(《评测、可观测与可追溯(04):回归与门禁——CI、供应商静默升级、A/B 与在线评测》) |
| prompt | 版本号 / 哈希 | 不知道线上跑的是哪版 |
| 工具集 | 版本号;MCP server 的版本 + 描述 / schema 哈希 | 描述投毒、行为漂移(第四篇) |
| 检索 | embedding 模型版本(换了要全量重建——《检索与知识接入(04):索引、混合检索与 rerank》)、索引版本 | 新旧向量不可比 |
| harness | 运行时版本(两个开源 harness 都在快速迭代——《工具、Agent 与 harness(06):源码级对照——Codex、DeepSeek Harness、Claude Code 与 OpenHarness》) | 行为变、日志格式变 |
| judge | 模型快照 + rubric 版本 | 尺子变了 |
| 价目表 | 带日期 | 成本算错 |
2. 依赖变更是别人替你做的发布
供应商的模型更新、弃用(《模型作为组件(05):选型——榜单的失真、自己的评测集与供应商的弃用周期》的周期表)、价格变化、条款变化(第五篇)、API 变更(《模型作为组件(02):API 契约(一)——消息、工具调用、结构化输出与流式,四家 API 的共同骨架》的 2026 年变更清单)、MCP server 更新——都会改变系统行为,但不经你的流程。纳入的做法:探针集每日跑(《评测、可观测与可追溯(04):回归与门禁——CI、供应商静默升级、A/B 与在线评测》——模型指纹)、订阅通知(changelog、弃用邮件、状态页、MCP server 的 release)、登记与评估(第五篇的供应商变更治理)、决定(跟进 / 钉旧版 / 迁移 / 换 fallback 顺序),走同一套门禁与灰度。弃用是有截止日期的发布:日历上标出来,提前一个周期迁移。
%% 图:两种发布走同一条流程——你自己的改动(十类之一)提版本、过门禁、灰度、全量、监控;别人替你做的发布(供应商模型更新、弃用、价格、条款、API 变更、MCP server 更新)从探针漂移或通知进来,登记、影响评估后,同样决定跟进 / 钉旧版 / 迁移 / 换 fallback,走同一套门禁与灰度;弃用有截止日,日历上标出来提前一个周期迁移
flowchart TB
subgraph MINE["你的发布:十类改动"]
direction LR
M1["提版本(不可变 + 标签)"] --> M2["门禁:评测集 × k · 逐条 diff · 成本 · 红队"]
end
subgraph THEIRS["别人替你做的发布"]
direction LR
T1["探针集每日:模型指纹漂移"] & T2["通知:changelog · 弃用邮件 · 条款 · MCP release"] --> T3["登记 + 影响评估(评测 · 成本 · 合规)"] --> T4["决定:跟进 / 钉旧版 / 迁移 / 换 fallback 顺序"]
end
M2 --> G["影子(高风险)→ 灰度 → 全量 → 监控(四类 SLO)→ 告警 → runbook → 回滚 / kill switch"]
T4 --> M1
CAL["弃用日历:关闭日前一个周期完成迁移"] -.-> T2
classDef mine fill:#eefaf0,stroke:#4d9a5c,color:#222
classDef theirs fill:#fff7e0,stroke:#c98a00,color:#222
classDef g fill:#eef6ff,stroke:#5b8fd6,color:#222
classDef cal fill:#fdecea,stroke:#c0392b,color:#222
class M1,M2 mine
class T1,T2,T3,T4 theirs
class G g
class CAL cal
3. 版本矩阵
线上同时存在的版本组合要可枚举:哪些租户在哪版 prompt × 哪个模型 × 哪版工具集。多租户 SaaS 里”给 A 客户钉旧模型”是常态,矩阵要能查、每个组合都在评测覆盖内。
五、回滚
1. 秒级
标签指回旧版本(prompt、路由表)或 kill switch 切降级——不重新部署代码。
2. 回滚前确认
- 旧模型快照还在(弃用了就回不去——要有 fallback 而不是回滚)
- 旧 prompt 与当前工具集 / schema 兼容
- 会话状态可读:加密的服务端压缩 item 不能跨模型(《工具、Agent 与 harness(06):源码级对照——Codex、DeepSeek Harness、Claude Code 与 OpenHarness》);新版本写的会话日志格式旧版本能读(《工具、Agent 与 harness(03):agent 运行时——会话、持久化与 durable execution》的格式版本)
- 索引:换了 embedding 的新索引与旧 prompt 兼容吗(通常无关,但检索配置的回滚要与索引版本对齐)
- 回滚也是一次发布:记录、通知、事后分析(《评测、可观测与可追溯(06):可追溯——录制回放、决策点日志、失败分类与反馈绑定》)
3. 前向修复
有时回滚比修复更危险(回到有安全漏洞的旧版本)——用 kill switch 降级 + 前向修复。runbook 里写清每类事故回滚还是前向。
%% 图:回滚前的确认清单——标签指回旧版本是秒级的,但先确认:旧模型快照还在(弃用了就回不去,要走 fallback)、旧 prompt 与当前工具集 / schema 兼容、会话状态可读(加密压缩 item 不能跨模型、日志格式版本旧版能读)、检索配置与索引版本对齐;旧版本有安全漏洞时不回滚,用 kill switch 降级 + 前向修复;回滚本身也是一次发布要记录
flowchart TB
E["事故:要回到上一版本"] --> Q1{"旧模型快照还在?"}
Q1 -->|"已弃用"| FB["走 fallback,不是回滚"]
Q1 -->|"在"| Q2{"旧 prompt 与当前工具集 / schema 兼容?"}
Q2 -->|"否"| FIX["前向修复"]
Q2 -->|"是"| Q3{"会话状态可读?<br/>加密压缩 item 跨模型?日志格式版本?"}
Q3 -->|"否:会话中途的用户会断"| FIX
Q3 -->|"是"| Q4{"旧版本有安全漏洞?"}
Q4 -->|"是"| KS["kill switch 降级 + 前向修复"]
Q4 -->|"否"| RB["回滚:标签指回(秒级)"]
RB --> REC["记录 · 通知 · 事后分析(回滚也是发布)"]
classDef dec fill:#eef6ff,stroke:#5b8fd6,color:#222
classDef ok fill:#eefaf0,stroke:#4d9a5c,color:#222
classDef alt fill:#fff7e0,stroke:#c98a00,color:#222
classDef bad fill:#fdecea,stroke:#c0392b,color:#222
class Q1,Q2,Q3,Q4 dec
class RB,REC ok
class FB,FIX alt
class KS bad
class E bad
六、五本 runbook
每本:触发条件(告警)、第一步(止损)、诊断(看什么)、处置(做什么)、恢复条件、事后(《评测、可观测与可追溯(06):可追溯——录制回放、决策点日志、失败分类与反馈绑定》的五段事后分析)、联系人。
1. 模型供应商宕机 / 严重降级
触发:错误率 / 超时率骤升、供应商状态页。止损:fallback 链自动切(《模型作为组件(06):客户端工程——重试、超时、幂等、限流与流式解析》的方向性——有状态会话降档不跨供应商);不够则 kill switch 切降级路径;用户提示”AI 功能暂时降级”。诊断:是全供应商还是某区域 / 某模型;网关的熔断状态。处置:调整路由表;监控 fallback 模型的质量与成本(它们不同)。恢复:供应商恢复且探针通过 → 逐步切回。事后:fallback 覆盖率与质量差距。
2. 成本暴涨
触发:每小时消耗 > 3× 基线(第二篇)。止损:降级梯子(切便宜模型 → 关增强 → 限流 → 收紧 agent 预算 → kill switch)。诊断:自动归因到功能 / 租户 / 版本;版本 diff 看刚发布了什么;长尾画像(是 agent 跑飞还是流量涨);缓存命中率(前缀被破坏?)。处置:回滚肇事版本或修卫士;异常租户限流。恢复:消耗回落 → 逐级恢复。
3. 注入 / 数据外传事件
触发:异常动作检测(陌生域名外联、敏感文件读取 + 外发)、用户报告、红队发现。止损:kill switch 关涉事功能或关涉事工具 / MCP server;撤销相关凭据。诊断:从 trace 找注入来源(哪个文档 / 邮件 / server)、影响范围(哪些会话读到了它、外传了什么)、哪一层没拦住(第四篇的五层)。处置:补防御层(输出脱敏、数据流规则、deny)、把攻击样本进红队集与评测集、按第五篇的责任矩阵通知法务与客户。恢复:防御到位 + 红队用例通过。
4. 越权 / 误操作事件
触发:沙箱拒绝骤升、用户报告数据被改 / 删、审计发现。止损:kill switch;停止相关 agent 会话;回滚数据(备份、git、提案机制——《工具、Agent 与 harness(08):memory 与 human-in-the-loop》)。诊断:审计链——哪个会话、哪步、什么权限判定放行了、为什么(决策点日志);PocketOS 五环自检(《工具、Agent 与 harness(05):权限、沙箱与安全边界》)。处置:执行策略加规则(prompt / forbidden)、权限档收紧、Guardian 审查 prompt 加模式、确认门。事后:五段分析,产出评测用例。
5. 质量骤降
触发:在线 judge / 拒答率 / 格式失败率 / 负反馈率超 SLO 错误预算,或探针漂移。止损:回滚到上一版本(若有本地发布)或切旧快照(若是供应商变更)。诊断:版本 diff 时间线——有本地变更吗?没有 → 探针确认供应商变更;三个数字定位(《检索与知识接入(07):检索评测与运营》 / 《评测、可观测与可追溯(04):回归与门禁——CI、供应商静默升级、A/B 与在线评测》);失败分类分布哪类涨了。处置:修 + 门禁 + 灰度;供应商变更则钉旧快照或跟进评测。
七、SLO 与值班
1. 四类 SLO
| 类 | 指标 | 例 |
|---|---|---|
| 可用性 | 成功率(含 fallback 后的) | 99.9% |
| 延迟 | TTFT p95、总时长 p95(第三篇) | TTFT ≤ 1.5 s |
| 质量 | 评测集分数、在线 judge 分、拒答率、格式失败率、负反馈率 | 在线 judge ≥ 4.0 / 5、格式失败 ≤ 0.5%、点踩率 ≤ 3% |
| 成本 | 每任务成本 p95、每功能日消耗 | p95 ≤ $0.50 |
质量与成本 SLO 是 AI 功能新增的两类;各有错误预算——预算耗尽时冻结非紧急发布、先修(SRE 的老规则)。
%% 图:四类 SLO 与错误预算——可用性(成功率含 fallback 后 99.9%)、延迟(TTFT p95 ≤ 1.5 s)、质量(在线 judge ≥ 4.0、格式失败 ≤ 0.5%、点踩率 ≤ 3%)、成本(每任务 p95 ≤ 0.50 美元);每类一个月度错误预算,消耗到 100% 就冻结非紧急发布先修;质量与成本是 AI 功能新增的两类,前两类是传统 SRE 的
flowchart LR
subgraph SLO["四类 SLO(月度)"]
direction TB
A["<b>可用性:成功率 ≥ 99.9%</b><br/>(含 fallback 后)"] ~~~ L["延迟:TTFT p95 ≤ 1.5 s · 总时长 p95"] ~~~ Q["<b>质量:在线 judge ≥ 4.0 / 5</b><br/>格式失败 ≤ 0.5% · 点踩率 ≤ 3%"] ~~~ C["<b>成本:每任务 p95 ≤ 0.50 美元</b><br/>每功能日消耗"]
end
SLO --> EB["错误预算:每类允许的月度违约量"]
EB -->|"消耗 < 100%"| GO["正常发布节奏"]
EB -->|"耗尽"| FREEZE["<b>冻结非紧急发布 · 先修</b><br/>(SRE 的老规则)"]
A -.- N1["传统 SRE 已有"]
L -.- N1
Q -.- N2["AI 功能新增"]
C -.- N2
classDef old fill:#eefaf0,stroke:#4d9a5c,color:#222
classDef new fill:#fff7e0,stroke:#c98a00,color:#222
classDef eb fill:#eef6ff,stroke:#5b8fd6,color:#222
classDef bad fill:#fdecea,stroke:#c0392b,color:#222
class A,L,N1 old
class Q,C,N2 new
class EB,GO eb
class FREEZE bad
2. 告警
分级:页人的(可用性、安全事件、成本 > 3×、质量骤降)与看面板的(趋势、命中率、分流比)。告警带上下文:肇事的功能 / 租户 / 版本、最近的发布、对应的 runbook 链接。
3. 值班
AI 功能进值班轮转;值班手册 = 五本 runbook + kill switch 的操作权限与位置 + 联系人(安全、法务、供应商支持);定期演练(关一次 kill switch、切一次 fallback、回滚一次版本——在灰度环境)。
八、实践建议
- 列发布清单:第二章的十类全部版本化、过门禁;控制台改动禁止。
- 每个 AI 功能一个开关(开 / 降级 / 关,按租户与比例),kill switch 上线前存在并演练。
- 钉一切:模型快照、prompt、工具集与 MCP 哈希、embedding 版本、harness、judge、价目表;版本矩阵可查。
- 依赖变更纳入:探针每日、通知订阅、登记评估、弃用上日历。
- 回滚前确认清单;每类事故定回滚还是前向。
- 写五本 runbook,每本七段。
- 定四类 SLO 与错误预算;告警分级带上下文;AI 功能进值班;季度演练。
九、本文小结
- 发布体系:什么算发布(十类,改动 = 发布)→ 版本化(不可变 + 六元组 + 批准人)→ 门禁 → 影子 → 灰度(开关按比例)→ 全量 → 监控 → runbook → 回滚 / kill switch;供应商与 MCP 变更是别人替你做的发布,经探针与通知进同一流程。
- 开关三态(开 / 降级 / 关)按租户与比例;kill switch 秒级、上线前存在并演练;层次分功能 / 能力 / 版本。
- 钉一切(模型快照、prompt、工具集与 MCP 哈希、embedding、harness、judge、价目表);版本矩阵可枚举;弃用是有截止日的发布。
- 回滚秒级(移标签 / kill switch),前确认旧快照在、兼容、会话状态可读、索引对齐;有时前向修复更安全。
- 五本 runbook(供应商宕机、成本暴涨、注入 / 外传、越权 / 误操作、质量骤降),每本七段。
- 四类 SLO(可用性、延迟、质量、成本)与错误预算;告警分级带上下文;AI 功能进值班;演练。
十、自测
-
周五控制台改 prompt、周末供应商换快照、周一拒答率翻倍——按本文,哪几项缺失让它变成事故?
-
kill switch 与回滚各在什么情形用?为什么 kill switch 必须在上线前就存在?
-
供应商宣布某模型 90 天后弃用。按本文这是什么?要做什么?
答案
一次有截止日期的、别人替你做的发布。登记 → 评估(新模型在评测集上的表现、成本、tokenizer 与 API 差异——《模型作为组件(05):选型——榜单的失真、自己的评测集与供应商的弃用周期》)→ 排计划(提前一个周期,上日历)→ 新版本过门禁 → 影子 → 灰度 → 全量 → 更新 fallback 链与版本矩阵(给钉旧模型的租户单独迁移);弃用日前确认没有租户还在旧模型上。详见第四章。
-
一个越权事件:agent 删了客户数据。按第四本 runbook 写出前四步。
答案
(1)止损:kill switch 关涉事功能、停止相关 agent 会话、撤销该会话使用的凭据;(2)回滚数据:从备份 / git / 提案记录恢复;(3)诊断:审计链定位会话与步骤,决策点日志看哪条规则放行了、模型为什么决定删(是否”绕过障碍”)、PocketOS 五环自检哪环缺;(4)处置:执行策略加
forbidden/prompt、权限档收紧、Guardian 加模式、确认门;按责任矩阵通知法务与客户;五段事后分析产出评测用例。详见第六章。 -
质量 SLO 的错误预算耗尽了,团队有一个紧急的功能要发。怎么办?
答案
SRE 的老规则:错误预算耗尽冻结非紧急发布,先修质量(找失败分类里涨的那类、版本 diff、探针)直到预算恢复;真正紧急的功能走重流程(额外审批、影子 + 更小的灰度、更严的门禁)并记录例外。预算的意义就是让”质量”与”上新功能”有一个明确的取舍机制。详见第七章。
-
什么算发布:任何改变模型行为或对模型输出处理的东西——prompt(文本、结构、few-shot、模板)、模型(快照、effort、参数)、输出契约(schema、解析、出口)、工具(工具集、描述、schema、MCP server 版本与描述)、检索(分块、embedding、混合、rerank、k、过滤、索引)、上下文管理(阈值、压缩 prompt、复述)、权限与安全(权限档、执行策略、沙箱、guardrails)、harness(运行时版本、卫士、预算)、评测(judge、rubric、评测集——改尺子重量基线)、路由(路由表、fallback 链、分流器);改动 = 发布,控制台改动禁止。体系:版本化(不可变 + 标签 + 六元组 + 批准人 + 配置即代码)→ 门禁 → 影子(高风险)→ 灰度(开关按比例)→ 全量 → 监控四类 SLO → 告警 → runbook → 回滚 / kill switch;供应商与 MCP 的变更经探针与通知进同一流程。详见第一章、第二章。 ↩
-
开关:每个 AI 功能一个,三态(开 / 降级到非模型路径或保守配置 / 关有提示),按租户、用户比例、环境生效,灰度即对 1% 开新版本;层次分功能级、能力级(某工具、某检索路、judge 抽样)、版本级(标签)。kill switch:秒级切降级或关,不经发布流程、有权限的值班能操作,用于供应商宕机、成本暴涨、安全事件、质量骤降,是 fallback 与降级梯子的最后一级,上线前必须存在并演练。钉版本:模型用带日期快照不用浮动别名、prompt 版本 / 哈希、工具集版本与 MCP server 版本 + 描述 / schema 哈希、embedding 与索引版本、harness 版本、judge 快照 + rubric 版本、带日期价目表;版本矩阵(租户 × prompt × 模型 × 工具集)可枚举且在评测覆盖内。依赖变更是别人替你做的发布:探针集每日(模型指纹)、订阅 changelog / 弃用 / 状态页 / MCP release、登记与评估、决定(跟进 / 钉旧版 / 迁移 / 改 fallback),走同一门禁与灰度;弃用是有截止日的发布,上日历提前一周期迁。详见第三章、第四章。 ↩
-
五本 runbook 各七段(触发、止损、诊断、处置、恢复、事后、联系人):供应商宕机(fallback 链自动切、方向性、kill switch 降级、用户提示;诊断范围与熔断;恢复后逐步切回);成本暴涨(> 3× 基线;降级梯子;自动归因 + 版本 diff + 长尾画像 + 命中率;回滚或修卫士;逐级恢复);注入 / 外传(异常动作检测;kill switch 关涉事功能或 server + 撤销凭据;trace 找来源与影响范围与哪层没拦;补层、样本进红队集、按矩阵通知法务客户);越权 / 误操作(沙箱拒绝骤升或报告;kill switch + 停会话 + 回滚数据;审计链与决策点定位、五环自检;执行策略 / 权限档 / Guardian / 确认门);质量骤降(在线 judge / 拒答 / 格式 / 负反馈超预算或探针漂移;回滚或切旧快照;版本 diff、三个数字、失败分类;修 + 门禁 + 灰度)。SLO 四类:可用性(含 fallback 后成功率)、延迟(TTFT / 总时长 p95)、质量(评测分、在线 judge、拒答率、格式失败率、负反馈率)、成本(每任务 p95、每功能日消耗);各有错误预算,耗尽冻结非紧急发布。告警分页人 / 看面板,带功能 / 租户 / 版本 / 最近发布 / runbook 链接。AI 功能进值班轮转,值班手册 = runbook + kill switch 权限位置 + 联系人,季度演练(关开关、切 fallback、回滚)。详见第六章、第七章。 ↩
系列 《生产化与运营:让 AI 应用可靠、可控、可持续地跑》 第 6 / 6 篇 进阶
系列总览 — 为什么这样组织、读它需要什么、读完能做什么
学习地图 — AI 应用工程师学习地图 第 6 / 7 个系列
- 模型网关——所有调用经过的一层
- 成本工程——从账单到每任务成本
- 延迟工程——从 TTFT 到 agent 的多步
- 安全——注入、供应链与数据泄漏
- 治理与合规——审计、保留、AI Act 与内容标识
- 发布工程——开关、钉版本、runbook 与 SLO
去 Series 挑下一个系列
本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/release-engineering-for-ai-features-switches-pinning-runbooks-and-slos.html)的前提下,欢迎各种形式的转载、翻译或商业引用。
COMMENTS
评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。