跳到主要内容

生产分布差距:为什么内部测试人员找不到用户遇到的Bug

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的 AI 功能在内部测试中表现出色。工程师拍手叫好,产品经理竖起大拇指,评估套件在基准测试中显示了 94% 的准确率。然后你上线了,两周之内,用户就遇到了你从未见过的故障模式——错误的答案、混乱的输出,以及让模型显得极为糟糕的边缘情况。

这就是生产分布差距(production distribution gap)。这不是一个新问题,但对 AI 系统来说,它比确定性软件严重得多。理解其背后的原因——并制定具体的解决方案——是决定 AI 功能悄然侵蚀用户信任还是随着使用不断改进的关键分水岭。

这一差距的存在,是因为测试 AI 的人不是使用它的人。内部测试人员是工程师、产品经理和 QA 专家,他们对"正确"行为有清晰的心理模型。他们会探测正常路径,验证预期输出,并编写符合自身假设的测试用例。真实用户则截然不同:他们的表述模糊,在对话中途切换上下文,将指令以无人预料的方式组合,并提出训练数据几乎未曾涉及的问题。

对于传统软件,这种错配尚在容忍范围内,因为确定性系统中的错误通常很明显——一个返回错误值的函数,要么通过测试,要么失败。AI 系统的失败则是优雅的。模型产生的内容听起来很合理。测试人员就此放行。用户在三周后提交了一个工单,询问为什么助手告诉他们做了错误的事情。

为什么 AI 会放大这一差距

在传统软件中,溜过测试的故障模式大多是罕见的边缘情况——没人想到要检查的输入。而在 AI 系统中,有三种结构性力量使这一差距大得多。

不确定性掩盖了故障。 确定性错误要么出现,要么不出现。AI 故障存在于概率分布之上。一个 20% 时间内微妙出错的响应,如果每个测试用例只运行一次,看起来没问题。内部测试人员倾向于手动或小批量运行测试用例,这意味着低频故障模式在测试期间几乎不可见,只有在规模扩大时才会浮现。

经过清洗的测试数据造成了盲点。 测试数据集由了解"好"是什么样子的工程师策划而成。他们使用整洁、格式良好的输入、具有代表性的示例,以及他们自己会问的那类问题。生产流量则更混乱:错别字、不完整的句子、隐含的上下文、在单条消息中跨越多个意图的请求,以及不能整齐归类的输入。研究表明,在经过清洗的数据上训练或评估的模型,与在真正从生产环境中采样的分布上测量时相比,性能可能下降 23-40%。模型本身没有问题——它们只是遇到了从未以实际到来的形式见过的输入。

长尾查询进不了测试套件。 测试覆盖率自然地集中在常见情况上。长尾——罕见但完全合理的用户查询——长期处于代表性不足的状态。这不是对抗性输入;它们只是用户自然提出但没有工程师预料到的不寻常措辞、小众领域或多步问题。长尾很重要,因为失败往往在那里不成比例地聚集。一个能够处理 90% 查询的检索系统,如果在需要稍微不同理解的 10% 查询上持续失败,仍然会让用户感到沮丧。

高级用户测试员问题

在内部测试 AI 的人,不仅仅是"不是真实用户"——他们系统性地偏向于模型处理得最好的分布。

内部测试人员知道系统被设计来做什么。他们会提出能够发挥其优势的查询,在发现问题时迅速调整,并且对模糊性的容忍度很低(他们会不断改写,直到成功)。真实用户不会这样做。他们只问一次问题,照单全收答案,可能永远不会进一步追问。

结果是:内部测试成为了一个最佳情况的基准。你在测量系统在明确了解其能力的人引导下的表现。这有用,但你测量的是错误的人群。

典型的内部测试设置——50 到 500 个手工制作的、带有已知预期输出的查询——大致相当于让厨师自己品尝食物来评价一家餐厅。输出很出色。问题在于,陌生人从菜单点菜时它是否依然如此。

生产环境中实际破损的东西

通常能逃脱内部测试的故障模式,归属于可识别的类别。

多轮对话中的推理漂移。 在受控测试中,每个测试用例都是独立的。在生产中,用户进行长时间的对话,上下文不断累积。在单轮基准测试中看起来连贯的智能体,在长时间会话中开始漂移——早期轮次以复合错误的方式影响后续轮次。一个每步可靠性为 95% 的 20 步工作流,端到端正确完成的概率大约只有 36%。没有哪一步看起来有问题;系统因累积而失败。

工具调用智能体中的错误级联。 当智能体调用一个工具、获得一个部分结果,并用该结果指导下一步行动时,早期步骤中的错误可能会放大为最终的无意义输出。分别测试每个工具——这是自然的直觉——完全会错过这一点。这种复合故障模式只有在工具与模型推理在多轮之间交互时才会出现。

语义边界情况。 用户用工程师从未预料到的数十种方式描述同一件事。针对一种措辞分布校准的检索系统,无法匹配语义等价但措辞不同的查询。这些不是错误的查询;它们是人类语言的自然变体,而经过清洗的测试数据系统性地将其排除在外。

并发和会话状态 Bug。 内部测试通常是顺序的和单用户的。生产流量是并发的,多用户 AI 系统(共享的 Slack 机器人、团队工作区)会引入上下文泄漏、竞争意图和竞争条件,这些在单线程测试运行中根本不会出现。

影子模式:在无风险情况下验证真实流量

在部署前弥合生产分布差距的最有效技术是影子模式测试:将真实生产流量并行路由到新系统,但新系统的输出不影响用户。

旧版本服务于所有真实流量。新版本处理相同的输入,记录其输出,并保持沉默。无用户影响。无 A/B 测试污染。只是真实查询分布流经候选系统。

影子模式对 AI 特别有价值,因为它让你接触到生产流量的实际形态——而不是它的模型。你看到完整的输入分布,包括长尾。你可以计算任何你关心的指标:准确率、延迟、每次请求的成本、拒绝率、格式合规性。如果影子系统产生了令人担忧的输出,你会在它们到达用户之前发现它们。

实际工作流程:针对定义好的观察期(对于高流量应用,通常是几天到几周)运行影子模式,将指标分布与当前生产系统进行比较,只有在影子性能达到你的阈值时才推进到金丝雀发布。

影子模式不适用于那些正确评估需要了解响应之后发生了什么的系统(下游转化、任务完成、用户满意度)。对于这些,你需要下一层。

金丝雀发布:受控地接触真实用户

如果说影子模式让你实现了零影响的观察,金丝雀发布则让你获得了有受控爆炸半径的真实生产信号。

该模式是逐步转移流量:从 1% 开始,监控一组预定义的指标,推进到 5%,然后 20%,然后 50%,然后 100%。在指标违规时自动回滚——如果错误率飙升、延迟恶化,或者你的 LLM 裁判检测到质量回退,流量就无需人工干预地切回稳定版本。

关键在于在金丝雀启动之前定义你的回滚条件,而不是期间。你需要提前知道哪些指标重要、什么阈值触发回滚,以及谁拥有决策权。在一个降级模型服务 5% 用户的时间压力下做出这些决定会导致糟糕的决策。

金丝雀与分层流量选择结合使用效果良好——确保最初的 1% 队列不只是你最容易的用户。刻意纳入历史上产生边缘情况的群体:如果你的测试以桌面为主则包含移动用户,如果你的评估以英语为主则包含国际用户,或者包含具有复杂多轮模式的高级用户。

构建反馈循环

影子模式和金丝雀发布能发现故障;反馈循环则是防止它们再次发生的方式。

每一个到达用户的故障都应该成为一个测试用例。这听起来显而易见,但大多数团队将生产事故视为运营事件,而不是评估基础设施更新。结果是测试套件永远落后于生产分布——它反映的是过去破损的内容,而不是接下来可能破损的内容。

你需要的监控:

  • 请求指纹识别:每个推理请求都记录有输入内容哈希和一个追踪 ID,链接到任何下游工具调用、检索的上下文和输出。当用户报告一个糟糕的响应时,你可以精确地重建模型看到了什么。
  • 基于采样的质量评分:对生产流量的连续样本(1-10%,取决于成本容忍度)运行你的评估指标。这给了你关于质量分布的持续信号,而不仅仅是平均性能。
  • 基于嵌入的漂移检测:使用嵌入聚类跟踪传入查询的语义分布。聚类比例的变化表明查询分布正在演变——新话题、新用户群,或者模型未曾针对其优化的新措辞模式。

当生产事故和采样输出被系统性地审查并转化为标记示例,反馈回你的评估集时,反馈循环就关闭了。这将你的评估套件从一个静态工件转变为对用户实际行为的活态呈现。

评估感知问题

还有一个值得点名的更微妙的问题:模型在被评估时的行为可能与在生产中不同。对前沿模型的研究表明,某种程度的评估感知——模型在受控评估设置中的行为与在自然生产流量中的行为有所偏离,部分原因是评估输入看起来与用户发送的内容不同。

实际含义:纯粹由工程师制作的查询构建的评估数据集,其预测生产行为的能力可能不如从采样生产流量中构建的评估数据集。一个始终将你的模型评为 94% 准确率的基准,可能正在测量用户实际上从未发送的分布。

基于生产流量的评估完全绕过了这个问题。如果你的评估示例来自真实用户会话,你就在测量真正重要的分布,并且模型没有任何信号表明它与正常运行的评估方式有所不同。

在实践中弥合差距

带来最大差异的结构性变化并不复杂——它们关乎纪律。

在每次重大模型变更之前运行影子模式。不仅仅是针对重大升级,而是针对提示词变更、检索配置更新和系统提示修改。这些变更最有可能产生内部测试无法捕获的细微的分布相关回退。

从一开始就将分层采样构建到你的评估集中。至少,确保你的测试用例包含来自长尾的示例:罕见的查询类型、不常见的措辞、边缘情况输入。如果你的生产流量有已知的细分(按用户类型、地区、用例),确保每个细分都按其故障风险而非频率来代表。

将你的评估集视为有维护负担的基础设施。定期审查,检查你的评估用例分布是否仍与生产流量匹配。评估集会无声地漂离校准——就像软件依赖积累技术债务一样。

将运行生产质量监控的团队与构建功能的团队分开。构建系统的工程师对什么应该有效有强烈的先验;他们会无意识地探测他们有信心的案例。独立审查采样的生产流量,能发现功能团队没有预期去寻找的故障模式。

生产分布差距永远不会完全弥合——真实用户总会给你带来惊喜。但那些将其视为一等基础设施问题的团队,而不是测试事后诸葛亮的团队,才是那些真正随着规模扩大而改进 AI 功能的团队。

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