跳到主要内容

评估与生产环境的差距:为什么测试套件的 92% 分数仅意味着 40% 的用户满意度

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的团队花了三周时间构建了一个严谨的评估套件。它涵盖了各种边缘情况,包括对抗性示例。LLM 作为评测员(LLM-as-judge)在所有维度上的得分都达到了 92%。你发布了产品。

接着,客服工单接踵而至。用户反馈 AI “听不懂他们在问什么”。会话放弃率上升了 30%。满意度得分仅为 41%。

这种差距 —— 即评估表现与现实世界结果之间的鸿沟 —— 是当今生产级 AI 系统最常见的失败模式。这不是模型问题,而是衡量标准的问题。

为什么你的评估套件在骗你

根本问题在于,精心挑选的评估集衡量的是你关心的行为的“代理指标”(proxy),而不是行为本身。有两种结构性力量导致了这种偏离。

**分布偏移(Distribution shift)**是第一种。你的评估用例是由开发人员根据他们想象中的用户提问编写的。但真实用户提问的方式与开发人员的想象大相径庭。他们的表述可能很别扭,会在对话中途切换上下文,使用你从未预料到的专业术语。他们还会针对产品中那些你在编写评估用例时甚至还没列入路线图的边缘情况进行提问。

这可以细分为两种类型。**结构性偏差(Structural skew)**是你的测试用例从未体现的格式差异:JSON 变体、意外的大小写、拼写错误、多轮对话的上下文累积。**内容偏差(Content skew)**则是语义上的差距 —— 用户询问的事情根本没有出现在你的测试集中。这两者在暗中复合。一个能完美处理评估用例的 AI 可能会在 30% 的真实查询中失败,而你对此却一无所知。

**代理指标失效(Proxy metric collapse)**是第二种力量。当你针对某个指标进行优化时,它就不再是一个好的指标了。这就是应用在 LLM 评估中的古德哈特定律(Goodhart's Law)。

“大海捞针”(Needle-in-a-Haystack, NIAH)基准测试就是一个典型案例。它最初用于衡量跨上下文窗口的真实召回能力 —— 对于理解长上下文性能非常有用。随后,模型开始针对它进行优化。现在,模型在 NIAH 上的得分近乎完美,但在现实的提取任务中却表现不佳:从临床笔录中提取患者药物的召回率为 80%,从菜单中提取成分的召回率仅为 30%。模型学会了如何通过基准测试,而不是如何解决问题。

N-gram 相似性指标也以同样的方式失效。ROUGE 得分与事实准确性并不相关。高 BERTScore 并不意味着用户会觉得摘要有用。关于摘要评估器的研究发现,“正面和负面实例的相似度分布过于接近”,无法作为生产阈值使用 —— 它们无法足够可靠地将好的输出与坏的输出区分开来。

究竟什么与用户满意度相关

在讨论如何弥补差距之前,明确你应该衡量哪些指标是很有必要的。

与现实世界满意度相关性最强的指标,并不是大多数团队所追踪的那些:

  • 任务完成率(Task completion rate):用户是否达成了他们的目的,而没有中途放弃会话或反复修改查询?这是一种行为信号,而不是模型输出的质量分数。
  • 采纳率与重生成率(Acceptance rate and regeneration rate):对于建议型界面(如代码补全、写作辅助),用户采纳第一个输出的频率是多少?他们重生成的频率是多少?这些隐式信号避开了显式评分中的噪点。
  • 上下文遵循度(Context adherence):模型是否扣题?遵循度差会直接导致对话长度增加,因为用户不得不重新建立上下文。冗长的对话往往是伪装成“参与度”的失败信号。
  • 会话放弃模式(Conversation abandonment patterns):当用户在未完成目标的情况下离开时,AI 说的最后一句话是什么?通过对放弃模式进行聚类,可以暴露聚合指标无法察觉的失败模式。

这些指标的共同点是:它们是根据用户行为衡量的,而不是孤立地对模型输出进行打分。

弥补差距的四项工程实践改进

1. 对真实流量进行影子评估(Shadow Evaluation)

针对分布偏移最直接的修复方法,是在真实的生产流量上运行评估,而不是(或不仅仅是)依靠合成的固定用例。影子评估的工作原理是将实时请求复制到候选模型,并将其输出与你的生产模型进行对比 —— 且不影响用户。

这样做可以暴露用户提问的真实分布。典型的流程是:首先进行影子测试(在零用户风险的情况下捕捉明显的退化),然后对小部分流量进行 A/B 测试(验证质量改进是否真实),最后全量发布。影子评估不会告诉你当前的生产模型是否优秀;它们会告诉你某项改动在真实输入下是变好了还是变坏了。

有一个实现细节至关重要:影子评估的试验需要相互隔离。试验之间的共享状态 —— 如缓存数据、会话上下文 —— 会让模型受益于在真实用户环境中并不存在的上下文,从而人为地推高分数。每个影子试验都应当是独立的。

2. 生产环境追踪记录的结构化错误分析

阅读实际对话是不可替代的。没有任何自动化评估器能发现你尚未预见到的失败模式。对生产环境追踪记录(traces)进行错误分析,是你发现那些你不知道需要测试的模式的方法。

采样策略应该是深思熟虑的,而不是随机的。专门针对以下内容进行筛选:

  • 带有负面用户信号的对话(明确的点踩、纠正、会话放弃)
  • 用户明显感到吃力的长对话
  • 降低了体验的高延迟响应
  • 被生产环境防护栏(guardrails)拦截的响应

然后用随机基准补充这一目标样本,以避免只看到已知的失败模式。

阅读 50–100 条追踪记录。首先应用开放式编码(open coding):记录失败的地方,而不预设类别。然后将其归纳为 5–10 个主题(轴向编码,axial coding)。计算频率。最高频的失败模式就是你构建新评估器的地方。

一个具体的例子:一个用于房产管理的对话式 AI 表现不佳。聚合指标没有显示任何异常。追踪分析显示,66% 的失败涉及与日期相关的短语,如“预约两周后的参观”。该系统没有可靠的机制来根据当前日期解析相对日期。标准的评估固定装置(eval fixtures)从未覆盖这一点,因为开发人员没考虑到要包含它。在围绕日期处理构建了特定的评估器并修复了底层逻辑后,成功率从 33% 提高到了 95%。

如果不先阅读追踪记录,你就无法构建那样的评估。

3. 作为信号的用户反馈循环

显式反馈(点赞/点踩、评分)虽然稀疏,但信号强度高。隐式反馈(重新生成、后续重述、接受、放弃)虽然量大,但需要解释。

两者都比评估套件的分数更诚实,因为它们捕捉的是用户的实际体验,而不是开发人员的想象。

对于显式信号,成对比较(“你更喜欢哪种回答?”)比李克特量表(Likert scales)更稳定——而且每条信号的成本比书面反馈低得多。对于隐式信号,关键的行为指标是查询重述(query rephrasing):当用户使用修改后的措辞重复他们的问题时,他们是在告诉你第一个回答失败了。这是一种强大的隐式负面信号,会随着流量自动扩展。

运营集成点是将这些信号连接回特定的追踪记录。当用户标记某个响应无用时,你会希望该追踪记录自动进入你的错误分析队列。大多数团队拥有反馈 UI,但跳过了追踪链接——因此信号永远无法到达能够采取行动的人手中。

4. 基于切片的评估

聚合指标会掩盖用户细分领域的失败。处理客户支持查询的 AI 可能在整体质量上显示为 88%,但在处理“账单问题查询”时为 62%,而“产品信息查询”为 96%。聚合指标在技术上是准确的,但在实践中却毫无用处。

沿着对应于系统中真实变化的维度定义评估切片(slices):

  • 查询意图类别(账单、技术支持、功能发现)
  • 用户等级或细分(企业、中小企业、新用户、高级用户)
  • 会话深度(第一轮对话 vs. 上下文已累积的第 10 轮以上)
  • 提示词版本或 A/B 测试变体
  • 语言或语言环境(非英语用户经常暴露出英语测试遗漏的失败模式)

按切片运行评估并跟踪随时间变化的趋势。仅影响引导阶段新用户的质量退化(quality regression),与影响长对话中高级用户的退化相比,是不同的问题,需要不同的修复方案。聚合指标瓦解了这种区别。

评估飞轮

这四项仪器化(instrumentation)变更并不是孤立的修复。它们组合成一个反馈循环:

生产流量流入智能采样。对该样本的错误分析浮现出失败模式。每个发现的模式都成为一个有针对性的评估器。这些评估器加入你的 CI 回归测试套件。改进方案发布。循环往复。

构建了这个循环的团队发现它会产生复利效应。每一次迭代都会以更细的粒度暴露出新的失败模式。评估套件随着生产流量的实际分布而演进,而不是僵化在发布时想象的分布上。

瓶颈在于运营,而非技术。限制因素不是使用哪个 LLM 作为裁判,或者如何构建提示词模板。而是你的团队是否拥有运营工作流程,能在发现生产环境失败后的一两天内将其转化为可重现的测试用例。构建最优秀 AI 产品的团队正在不成比例地向这些基础设施投入。

关于 LLM 作为裁判(LLM-as-Judge)的说明

大多数团队倾向于将 LLM 作为裁判(LLM-as-judge)作为其主要的评估机制。它在人工标注无法扩展的地方发挥作用,并且对于许多任务来说效果良好。但值得明确的是,它在哪些方面可靠,在哪些方面会失效。

对于通用文本质量的成对比较,现代前沿模型作为裁判在结构良好的任务上与人类专家的一致性达到了 85% 左右——与人与人之间的一致性相当。对于事实准确性评估和对“不一致”摘要的幻觉检测(这些才是真正重要的案例),召回率会下降到 30–60%。LLM 裁判不擅长捕捉细微的事实错误。

在生产环境中部署 LLM 裁判时,有两种偏见值得校正。位置偏见(Position bias)非常显著:模型会系统性地偏好提示词中首先出现的响应。务必运行双向位置测试并取平均值。冗长偏见(Verbosity bias)普遍存在:模型在 90% 以上的情况下更喜欢较长的回答,而不管质量如何。这需要在评估提示词中明确加以抵消。

实践建议:在人工标注不可行的高量评估中使用 LLM 作为裁判,但要定期根据留存数据的人类标签验证你的裁判。分别跟踪真阳性率(True Positive Rate)和真阴性率(True Negative Rate)——一个整体一致性为 95% 但在你关心的失败案例上 TPR 仅为 40% 的裁判,对于捕获回归测试是没有用的。对于高风险的生产决策,在评估提示词中使用带有结构化推理的多裁判共识,比单裁判评分显著更可靠。

实践结论

评估表现与生产环境满意度之间的差距,本质上是测量差距,而非模型能力差距。你正在以错误的分布测量错误的东西,并且没有将信号关联回改进循环。

当你做到以下几点时,92% 与 40% 之间的分歧就会缩小:

  • 从真实流量中采样,而非虚构流量
  • 在构建评估器之前,先阅读真实的失败轨迹(traces)
  • 将用户行为信号关联回特定的对话
  • 按有意义的分段(segment)追踪性能,而不只是看整体聚合数据

这些都不需要更好的模型或更复杂的评估框架。它需要将测量视为持续的基础设施投资,而不是发布前的清单项目。一个永不改变的静态评估套件意味着你的质量体系已经停滞——你已经停止从生产环境中学习了。

那些能够交付真正好用的 AI 产品的团队都内化了一个看似反直觉的原则:评估套件的更新频率应该比模型更快。每当生产环境暴露出你未预料到的失败模式时,应对措施不应仅仅是修复模型行为,而是添加一个测试,以便永久追踪该失败模式。这就是差距缩小的原因。

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