跳到主要内容

Staging 环境的谎言:为什么预生产阶段对 AI 系统失效了

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的测试环境通过了所有检查。LLM 对每个测试提示词都做出了正确响应。延迟表现良好。质量评分看起来也不错。你发布了。然后,两天后,生产环境开始在你的评估集从未涵盖的一类查询中出现幻觉,你的成本飙升了 3 倍,因为缓存是冷的,而且你的供应商推送的模型更新静默地改变了行为,而你的旧测试套件无法检测到。测试环境显示一切正常,生产环境却给出了截然不同的结果。

这并不是一个可以通过编写更多测试用例来弥补的测试差距。预发布环境对 AI 系统具有结构性的误导,而对传统软件则不然。失败模式是系统性的,解决办法不是更好的测试环境,而是一种不同的架构。

为什么传统测试环境有效(以及为什么 AI 不同)

对于典型的 Web 服务,测试环境的一致性是可以实现的。你运行相同的代码、相同的数据库 Schema、相同的依赖项。如果测试环境通过,生产环境通常也能保持稳定。在输入相同的情况下,系统的行为是确定性的。测试环境可以合理地近似生产环境。

由 LLM 驱动的系统同时在多个层面打破了这一假设。模型的行为取决于供应商的基础设施、缓存状态、流量模式、输入分布和模型版本 —— 而测试环境都无法准确模拟这些因素。你测试的不是一个确定性的函数;你是在从一个分布中采样,而测试环境系统性地偏向于让这个分布看起来比实际情况更好。

测试环境关于 AI 系统的五个结构性谎言

谎言 1:你的延迟和成本在控制范围内。

在生产环境中,提示词缓存(Prompt Caching)可以将输入 Token 成本降低多达 90%,并将延迟降低 80% —— 但前提是缓存是热的。测试环境的流量低且不规律,运行几乎完全依赖冷缓存。一个在测试环境中每次请求花费 0.10 美元的系统,在生产环境中可能只需 0.01 美元,因为用户成千上万次地命中同一个缓存前缀。但如果你的缓存预热策略失效,这种关系就会反转:生产环境的冷启动事件(新部署、缓存剔除、提示词编辑后的缓存键更改)可能会使你的成本飙升 10 倍,延迟增加 5 倍。测试环境永远不会向你展示这两种极端情况。你得到的是一个中间数值,它不对应任何真实的生产状态。

谎言 2:你的评估集涵盖了用户的实际提问。

测试环境运行的是一组精心挑选的测试用例 —— 通常是你团队中某人编写的 50 到 200 个提示词。真实用户表达请求的方式是没人能预料到的。他们使用领域俚语、混合语言、询问复合问题、犯下改变原意的拼写错误,并探究那些事后看来显而易见但在评估列表中并未出现的边缘情况。对生产环境部署的研究发现,传统的发布前测试仅能捕获最终从真实流量中出现的漂移案例的约 25%。你的测试套件并不是在测试长尾场景,它只是在测试你已经知道要测试的内容。

这种分布不匹配会随时间推移而加剧。随着产品的演进,新功能改变了用户的提问方式。具有不同词汇和目标的新用户群体不断涌入。第一季度还算有代表性的评估集,到第三季度就会产生系统性的误导,你的测试通过率依然很高,而生产环境的质量却在悄然下降。

谎言 3:温度为 0 意味着行为可重现。

许多团队为了可重复性在测试环境中将温度(Temperature)设置为 0,或者假设即使在生产环境中,确定性采样也能消除变异性。这两者都不成立。在温度为 0 时,LLM 的输出仍然是非确定性的。GPU 浮点运算并不是严格结合的 —— 批次大小的变化、请求路由的差异以及并行序列处理都会引入不同的舍入误差。研究表明,在温度设置为 0 的情况下,完全相同的提示词也可能出现高达 15% 的准确率波动。测试环境更干净、流量更低,会产生比生产环境更一致的结果,使系统看起来比实际更可靠。

谎言 4:你测试的模型就是你部署的模型。

LLM 供应商会在不发出警告的情况下更新模型。2025 年 2 月,OpenAI 对 GPT-4o 的行为进行了实质性的更改,以至于那些锁定模型 ID 的团队发现他们的输出发生了偏移。2025 年 4 月,OpenAI 回滚了另一个 GPT-4o 更新,该更新曾使模型变得病态地顺从。这些并不是你选择加入的版本升级 —— 它们是供应商应用于共享资源的基础设施级更改。测试环境通常运行在旧快照或单独锁定的版本上,无法捕获这些变化。当更新到达你的测试环境时(如果真的会到达的话),你可能已经将受影响的版本发布给了生产用户。

微调模型加剧了这个问题。即使你的微调权重没有变化,你所针对的微调基座模型也可能在基础设施层面发生漂移。测试环境验证过的模型已不再是生产环境运行的模型。

谎言 5:你的系统能优雅地处理负载。

测试环境无法模拟生产环境的速率限制、重试行为或并发负载下的延迟。LLM API 供应商将容量出售给多个租户 —— 在共享的高峰需求期间,即使你的代码没有任何更改,你的单 Token 延迟也可能飙升。测试环境使用的是专用或低竞争的基础设施;在真实负载下激活的重试逻辑、后备路径(Fallback paths)和队列延迟从未得到锻炼。你只有在某个周二凌晨 2 点主模型被限流时,才会发现你的后备模型生成的输出系统性地更差。

仅在生产规模下出现的故障案例

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