跳到主要内容

为什么回滚 AI 功能比回滚代码更难

· 阅读需 9 分钟
Tian Pan
Software Engineer

当一次人格更新让一个流行的 AI 助手变得明显更加讨好和客气时,工程团队迅速发现了问题,并在几天内发布了回滚。代码更改很干净。模型切换也很直接。然而,用户还是被激怒了——不是因为回滚出错了,而是因为他们中的一些人已经围绕那个“奉承版”建立了工作流。他们的提示策略、审阅环节、对模型置信度信号的解释——所有这一切都针对一个他们再也无法访问的 AI 进行了调整。

回滚代码只花了几个小时。回滚用户却是不可能的。

这种不对称性是 AI 功能管理的中心挑战,大多数工程团队在吃亏之前都会低估它。传统的回滚思维将“撤销”视为一种纯粹的技术操作。对于 AI 功能来说,这只是故事的一半。

破坏性变更与行为偏移之间的区别

当传统软件 API 发生破坏性变更时,故障是即时且明确的。调用失败。异常传播。日志爆满。错误面定义明确,回滚是一个具有清晰前后对比的机械操作。

AI 行为的变化并非如此。它们在没有错误代码的弥散性行为面上悄无声息地退化。一个开始产生略显啰嗦的输出、或语气略有不同、或推荐置信度稍低的模型——这些都不会抛出异常。用户会进行适应。而这种适应正是真实成本累积的地方。

AI 系统的各个技术层独立进行版本控制,且彼此交互:

  • 模型版本 —— 通常由供应商滚动更新,有时没有明确通知
  • 提示词版本 —— 随着团队迭代而发生偏移的操作指令
  • 工具和 API 版本 —— 模型调用的接口,可能会在不改变签名的情况下改变语义
  • 检索知识 —— 用于支撑回答的文档或数据块,随着语料库的更新而变化

当其他层已经向前推进时,只触及一层的回滚会创建一个既不同于原始状态,也不同于预期的系统。你不是在恢复到一个已知的良好配置;你是在组装一个可能从未经过测试的混合体。

为什么用户是最难回滚的一层

工程化的回滚框架忽略了最重要的层面:用户本身。

当一个 AI 功能发布时,它不仅改变了产品的功能,还改变了用户对产品功能的看法。他们建立了心理模型。他们养成了工作流习惯。他们停止手动执行现在由 AI 处理的任务。他们调整自己的判断,决定何时信任输出,何时进行覆盖。

这种适应发生得很快、很安静,而且对产品和工程团队来说通常是不可见的。当用户围绕 AI 推荐的编辑重组其审阅流程时,你不会收到拉取请求或提交。当有人因为了解到 AI 在某一步骤上总是正确而停止验证时,你不会收到警报。

当你回滚该功能时,你已经移除了用户所适应的 AI 行为。技术系统回到了之前的状态。用户则没有。

几种失效模式加剧了这种情况:

工作流缺口。 用户因为 AI 处理了某个手动步骤而停止了该步骤,现在不得不重新开始做——但相关的知识可能已经萎缩,他们甚至可能直到下游环节出问题才意识到缺口。

错位的信任。 用户针对特定的 AI 行为建立信任校准。回滚改变了行为,但不一定改变了他们的信任水平,从而导致他们的验证程度与应有的验证程度之间出现不匹配。

隐形变通。 对不想要的变化最具破坏性的反应往往既不是投诉也不是流失,而是无声的变通方案。不信任回滚后行为的用户将再次进行适应,而这一次的方式更难观察:冗余检查、手动覆盖、以及与官方工具并存的影子流程。

四种有所帮助的模式

没有办法让 AI 行为的变化变得毫无摩擦。但有一些模式可以降低过渡成本,并保留你在不永久破坏用户信任的情况下行动的能力。

在任何行为更改之前使用影子模式 (Shadow mode)。 在你改变用户看到的内容之前,在影子模式下运行新的模型行为——在真实的生产流量上生成输出,但不展示给用户。这不仅仅是一种 QA 技术,更是一种可观测性策略。影子模式让你能够使用真实的输入而不是合成的评估集,对行为差异进行并排比较。你可以衡量输出差异有多大、差异最大的地方在哪里,以及在影响任何用户之前对业务指标的影响。

影子模式也是回滚计划的安全网。如果你从第一天起就将影子模式与新版本并行部署,你就能保持高信心地即时回滚的操作态势——因为你有一个在并行运行且经过持续验证的基准。

逐步提升自主权,而非二进制开关。 一次性发布 AI 功能或一次性回滚的冲动在操作上很方便,但在战略上代价昂贵。经历突然行为变化的用户没有参考系来了解发生了什么变化或为什么发生变化,这使得信任恢复变得更加困难。

分阶段的方法将新行为暴露给一小部分群体,监控行为信号(不仅是准确性指标,还有编辑率、覆盖频率、会话重启模式),并仅在信号健康时才升级。如果需要回滚,你撤回的是部分暴露,而不是完整部署,并且适应新行为工作流的用户数量是有限的。

功能标志 (Feature flags) 与模型版本解耦。 将模型版本与功能发布混为一谈的团队会让回滚变得异常昂贵。如果更换模型的唯一方法是部署新代码,那么你就将响应时间与发布节奏绑定在了一起。

更整洁的方法是独立于部署进行流量路由的基础设施:一个模型注册表,允许你切换给定功能标志指向的版本,而无需触及应用程序代码。这使得回滚变成了配置更改——值班工程师可以在几分钟内完成的操作——而不是一个需要跨团队协调的部署事件。

弃用胜过移除。 最成功的 AI 功能回滚不会直接移除行为,而是弃用 (deprecate) 它。这种区别很重要,因为弃用在过渡期间保留了用户的自主权。

如果你需要让用户停止使用某种 AI 行为,给他们通知、时间表,并在宽限期内允许访问旧行为,这会将心理体验从“失去”转变为“过渡”。用户可以按照自己的节奏完成适应。他们可以在必须改变之前了解正在发生的变化。旧行为变成了按计划消失的东西,而不是一夜之间消失。

对于有理由相信回滚会不受欢迎的团队,在(新版本发布后)对旧行为使用影子模式可以帮助量化仍有多少用户依赖它——以及回滚是否真的必要,或者仅仅是一种预防措施。

监控需要追踪什么

告知你回滚是否生效的监测手段,与最初告知你功能是否正常的监测手段是不同的。

功能发布指标通常侧重于采用率 —— 用户是否在与 AI 输出进行交互?而回滚指标需要侧重于行为残留 —— 用户的行为是否表现得像旧的 AI 行为依然存在一样?

在回滚期间和之后值得追踪的具体信号:

  • 编辑率的变化。 如果用户之前以某种频率编辑 AI 的输出,而该频率在回滚后发生了偏移,说明用户的行为或预期发生了某些变化。
  • 显式覆盖频率。 在回滚后更频繁地覆盖或忽略 AI 建议的用户,可能是在表达对新行为的不信任或困惑。
  • 会话重启模式。 放弃当前会话并重新开始的用户通常是在应对意外的输出。回滚后出现成簇的会话重启,表明过渡并不平稳。
  • 手动路径采用率。 如果存在完成同一任务的非 AI 路径,而 AI 回滚后该路径的使用量有所增加,则表明用户正在补偿 AI 不再为他们提供的功能。

业务 KPI —— 转化率、留存率、任务完成度 —— 也应该被监控,但它们通常会滞后几天或几周。行为信号更快且更具体。

结构性问题

更深层次的问题在于,AI 功能以代码功能所不具备的方式改变了产品的社会契约。当你向 UI 添加按钮时,用户会感知到按钮的存在并进行调整。当你移除它时,他们会注意到它消失了。这种变化是显性的。

AI 行为改变的是不可见层 —— 即产品中解释用户意图、呈现信息并提供建议的部分。用户不会将这一层体验为 “他们正在使用的功能”。他们将其体验为 “产品的工作方式”。对该层的更改感觉像是对现实的更改,而不是对功能的更改。

这就是为什么将变更描述为修复或改进的回滚沟通往往效果不佳的原因。已经适应了旧行为的用户不会将回滚视为一种纠正 —— 他们会觉得产品变差了。这两种表述可以同时成立,这就是为什么回滚需要变更管理的纪律,而不仅仅是工程执行。

技术回滚是简单的部分。需要计划、监控和深思熟虑的沟通的部分,是已经适应了你试图撤销的行为的人类系统。

在发布之前就为此做好计划,而不是在需要回滚之后才开始。

References:Let's stay in touch and Follow me for more thoughts and updates