日期:2026-07-27
我们自研的 AI 私有化底座,给好几家客户托管推理服务。早期模型或推理框架版本上线,基本是"停旧起新"的硬切换,结果踩过几次坑:有一次新版本算子在某类长文本上精度掉了几个点,业务方两天后才从客诉里发现;还有一次框架升级后 P99 延迟抖了三倍,把上游网关的超时全打爆。问题不在于发布本身,而在于我们没有一个"先看后放"的机制——新版本直接吃全量流量,风险不可控、回滚慢。我们意识到,推理服务和普通 Web 服务一样,需要灰度,而且因为模型输出是非确定的,灰度更要靠"对照验证"而非靠心跳。
我们在推理服务前面加了一层发布控制:新版本先以极小流量(如 1%)接入,主要做"影子流量"——把生产真实请求复制一份发给新版本,新旧版本各自算出结果,但只把旧版本结果返回给业务,新版本的结果默默比对。比对维度包括输出一致性(相似度)、关键指标(延迟、显存、错误率)和抽样人工评测。当影子跑稳、指标无退化、抽样评测通过,再逐步放量到 5%、20%、50%、100%,每一步都有明确的观察窗口和自动回滚阈值。整个过程对业务无感,出问题时秒级切回旧版本。
第一,影子流量的无损复制与隔离。复制请求时不能影响主链路延迟,我们做成异步旁路,新版本结果不参与业务响应,失败也不影响主流程。第二,结果比对的合理性。模型输出非确定,不能做字符串全等,我们用"输出相似度 + 关键事实一致性 + 延迟分布"多维打分,相似度低于阈值或延迟退化超 20% 才告警。第三,灰度放量的节奏与观察窗口。我们按"1%→5%→20%→50%→100%"五档,每档至少观察一个业务高峰周期,避免低峰期看不到问题。第四,秒级回滚。新旧版本在网关侧并存,回滚只是改路由权重,不涉及重启,控制在秒级。
案例片段(已脱敏): 影子流量比对与灰度权重的路由配置(示意):
yaml routes: - model: base-v2 # 新版本,影子+灰度 weight: 1 # 先 1% 灰度 shadow_of: base-v1 # 同时作为 v1 的影子 compare: similarity_min: 0.92 latency_degrade_max: 0.20 - model: base-v1 # 旧版本,承接主流量 weight: 99 rollback: trigger: similarity<0.90 OR error_rate>0.02 action: set_weight(base-v1=100)
这套机制跑了一年多,统计下来:新版本从"上线即全量"变成"影子验证平均 2–3 天后再灰度",期间捕获的精度退化、延迟抖动等坏例,约七成是在影子阶段就被拦下,没进生产;灰度放量阶段靠观察窗口捕获的剩余问题约占三成;因版本问题导致的线上质量事故数量较机制上线前下降约八成。回滚耗时从原来的"改配置+重启约十分钟"降到秒级路由切换。数字为脱敏示意,趋势稳定。
推理服务发布的第一条铁律:先影子验证,再灰度放量,绝不直接全量——模型输出非确定,不看对照就放等于盲飞。第二,影子流量必须走异步旁路,不参与业务响应,否则复制本身会变成新的风险点。第三,比对不能靠字符串全等,要用"相似度+事实一致性+延迟"多维打分,阈值要校准。第四,灰度档位之间留观察窗口,且必须覆盖一个业务高峰,低峰期看着稳不等于真稳。第五,回滚要秒级,靠路由权重而非重启。这套"影子—多维比对—分档灰度—秒级回滚",后来成了我们所有模型服务的标准发布流程。
模型服务发布,和传统的应用发布相比,多了一层"输出非确定"的复杂性,这正是影子流量存在的意义——你没法靠单元测试覆盖模型的随机性,只能靠真实流量去对照。我们这套流程跑了两年,最深的体会是:回滚速度比发布速度更重要。
很多团队追求"秒级发布",但真正救火的是"秒级回滚",因为坏版本一旦放量,每一秒都在产生错误输出,影响的是真实业务。所以我们的设计里,新旧版本长期并存、权重秒切,宁可多占一点算力,也不赌"这次不会出事"。稳,是推理服务的第一优先级。我们也把"影子验证必须覆盖一个业务高峰"写进了发布规范,低峰期看着稳的版本,高峰一来露馅的案例我们见过不止一次。把不确定性关进对照验证的笼子里,模型发布才敢频繁。
再补充一句工程细节:影子流量比对用的相似度,我们对不同任务设了不同阈值。闲聊类任务容忍度高,事实类(如报价、政策)容忍度极低,一旦相似度掉到 0.85 以下就直接告警,不靠人工去翻。这种"按任务分级"的判定,比全局一个阈值更准,也减少了无效告警。发布这件事,阈值设对了,人才信;我们后来把这套分级阈值整理成发布检查清单,新模型上线照着勾,漏判少了很多。
最后再强调工程上的耐心:影子流量和灰度不是一次性的发布动作,而是常态化的能力。我们把它做成推理服务平台的内置模块,任何模型版本上线默认走"影子加灰度",不用团队额外记流程。当这套机制变成默认而非例外,模型迭代的节奏才真正快起来,因为大家不再怕发布,敢发才敢改。很多团队卡在模型迭代慢,根子不是技术,是发布不敢放量。把验证和回滚做成水电一样的基础设施,模型团队的生产力才释放得出来。