跳到主要内容

你的评估集里只有你已经解决的问题

· 阅读需 10 分钟
Tian Pan
Software Engineer

在过去一个季度,你的评估分数从 0.81 上升到了 0.87。团队上线了一个路由器 (router),在困难意图上更换了更强大的模型,微调了系统提示词 (system prompt),并从“处理时间超过一天的工单”中提取并添加了 40 个新的测试用例。仪表盘显示系统变得更好了。NPS 持平。活跃用户数下降了 2%。

有一个简洁的故事可以解释这两个数字,但你可能并不想听:你的评估集只包含你已经解决的问题。那些失败得如此彻底,以至于用户从未提交工单、从未回来、甚至从未出现在你 grep 的任何日志中的查询 —— 它们不在你的测试套件中。它们不在任何人的套件中。评估分数的上升不仅与你在可见的事物上做得更好相一致,也与你在可见的事物上做得更好、但在不可见的事物上依然糟糕透顶相一致。

这是披着 MLOps 外衣的幸存者偏差 (survivorship bias)。你根据生产追踪构建评估集,用精心筛选的过往失败案例进行增强,并将权重偏向你发现的最难的 10% 的输入。这个流水线的每一个环节都隐式地过滤掉了那些停留时间不足以留下痕迹的用户。那些没能飞回家的轰炸机飞行员,不在那份写着“加固发动机”的数据集中。

结构性缺失问题

评估集通常构建自三个来源,而这三个来源都经过了生存过滤。

首先是记录的生产流量。根据定义,记录下的查询是用户发送到你系统中的查询。如果产品在“意图 X”上彻底崩坏,用户不会耐心地再发十个“意图 X”的查询供你采样。他们发了一个,得到一堆垃圾,然后离开。你的日志中只包含一个样本 —— 很容易被当作偶然事件忽略 —— 而“意图 X”在非用户群体中的普遍性则是不可见的。

其次是精心筛选的过往失败案例。只有当有人注意到失败时,它才成为“过往案例”:一份支持工单、一次客户投诉、一个 Slack 讨论串、或者一个被标记的“踩” (thumbs-down)。这种失败模型不是“出差错的事物”,而是“出了差错,并且有时间、有词汇量、有动力的人报告了的事物”。预期较低的免费层级用户、不知道支持表单存在的非英语母语者、重试机制掩盖了症状的 Agent 流水线操作员 —— 这些人都没有进入你的筛选渠道。

第三是合成的对抗性示例。红队 (red team) 编写了他们怀疑会失败的提示词。这能产生极佳的覆盖率,覆盖了红队能想象到的失败,但这恰恰是你没有盲点的失败集合。根据定义,你盲点中的失败,正是红队没想起来要写下的那些。

把这些加在一起,评估集的形状就像一个手电筒。它照亮了一个圆锥区域。圆锥之外的领地并非荒芜 —— 只是从你站立的位置看不见而已。

为什么“我们添加了困难案例”是谎言的宽慰版本

我交谈过的每一个评估团队都有一个关于他们如何强化测试套件的故事。故事大同小异:我们挖掘了支持队列,查看了评分较低的追踪,要求值班人员标记本周棘手的案例。我们把它们加进去了。

你添加的是那些存活时间足够长、足以被注意到的困难案例。请注意,这里的生存过滤比记录流量还要严苛,因为要进入“困难”集合,一个查询必须满足:(a) 被记录,(b) 被标记,(c) 可审查,(d) 可复现到足以规范化。这些过滤器中的每一个都会筛掉一代又一代的案例。你的评估集实际包含的困难案例是那些穿过了四道门的案例。最困难的案例从未走到第一道门前,因为本会提出这些问题的用户在得到一个糟糕的答案后,就判定这个产品不适合自己。

这就是为什么基准测试分数在攀升,而用户却毫无察觉。你的确在某些方面做得更好了。你在圆锥区域内的事物上做得更好。圆锥之外的人并不知道你的模型改进了,因为他们对你产品的体验是“试过了,没用,告诉朋友这只是个玩具”。他们再也没回来重新测试,而你的留存率仪表盘默默地将他们记录为“低参与度客群,从未转化”。评估套件和留存曲线观察的是不相交的人群。

你有时可以检测到的暗物质

你无法直接观察到那些从未被提出的查询。但你可以观察它们的脚印,就像天文学家通过观察引力对可见宇宙的影响来发现暗物质 (dark matter) 一样。有三种技术值得深入思考。

将放弃 (Abandonment) 视为信号。追踪会话的轨迹,而不只是最终答案。一个发送了一次查询、阅读了响应、发送零次追问,且在 30 天内从未返回产品的用户,正在向你传达某种信息。基于意图类型的这种流失形态,是衡量“答案到底有多糟”的少数诚实指标之一。留在系统里的用户给出的 4.2/5 评分,对于聊到一半离开的用户来说毫无意义。大多数分析工具将“会话结束”归类为成功,因为会话中没有包含错误。建立一个“查询类别-流失率”矩阵,你会发现有些意图的评估分数是 0.9,而转化率只有 0.05。那个差距就是暗物质。

按查询类型切分的留存率。根据用户尝试的第一个意图对用户进行分组。绘制每步月留存率。如果某个意图的 M3 留存率只有平均水平的一半,那么该意图的首触答案几乎肯定糟糕到足以让用户永久流失 —— 尽管到了 M3 阶段,你的模型可能已经“修复”了三次,该意图的评估分数看起来也很健康。Andreessen-Horowitz 的说法是,AI 产品会看到来自“AI 游客”的大量早期流失,并在 M3 趋于稳定。其推论是,按意图划分的 M3 留存率是少数几个未被幸存者偏差篡改的指标之一。

有意识地对低置信度和高延迟的长尾进行采样。大多数团队在策划评估集时会均匀采样生产流量。如果你试图寻找暗物质,那是能想到的最糟糕的采样分布。采样应偏向于模型置信度的底部分位数(自一致性、对数概率、裁判评分)、高延迟的长尾(高延迟通常是掩盖不稳定的重试),以及在开始一轮内就结束的会话。这些方法都不是完美的,但每一个都与用户懒得报告的那类失败呈正相关。

没人愿意面对的思维重构

这里是对你仪表盘现状的残酷揭示。你的评估分数(eval score)上升意味着两件事之一:要么你在评估集所代表的问题上变得更强了,要么你再也听不到那些从未被这些问题代表过的用户的声音了。这两者在仪表盘上看起来是一模一样的。你无法仅通过查看评估套件(eval suite)来区分它们,因为鉴别器——即那些没有出现的潜在用户——恰恰是评估套件无法捕捉到的。

这种思维重构在于:停止将评估套件视为质量的“基准真相”(ground truth),而开始将其视为覆盖范围的“基准真相”。评估套件告诉你,你在那些留存下来的用户群体中表现如何。要了解这一群体是否代表了你想要的市场,你需要一个正交信号:针对未转化潜在客户的可用性研究、对流失群体的退出访谈、对低参与度会话的定性分析,以及针对新用户转化率(而非仅仅是资深用户满意度)的 A/B 测试。这些方法都不会产生一个可以绘制成图表的简洁数字。但这正是重点所在。

一个将评估套件视为计分板的团队会不断优化,直到分数饱和,然后认为大功告成。一个将评估套件视为覆盖范围估算的团队,在整个季度中都会不断追问:那些我们还没听到的用户在哪里。第一个团队的季度回顾看起来更漂亮。而第二个团队的产品会被第一个团队从未接触过的人群所使用。

周一该做什么

让你的评估套件剖析其自身。对于套件中的每个意图类别(intent class),记录下:(a) 有多少案例来自日志流量,(b) 有多少来自人工筛选的失败案例,(c) 在第一次接触时具有该意图的用户中,有多少比例在单月内回归。最后一个数字是“幸存者偏差修正”。如果这个数字很低,说明你针对该意图的评估集样本存在向上的选择性偏差,你在该意图上的核心分数被高估了。

将工具调用放弃率(tool-call abandonment)和单轮会话视为一级质量信号,而不仅仅是参与度信号。它们是你最接近“用户放弃”的事件。将它们接入评估分数所在的同一个仪表盘,这样下次当评估分数攀升,而特定意图的放弃率也随之攀升时,有人能同时看到这两个数字。

每季度对那些尝试过一次产品就再也没回来的用户进行一次明确的研究。抽取 20 个样本。查看他们的第一次查询。查看回复。对其评分。在没有基准参考的情况下,问问自己:这个回复真的好吗?这少数的观察结果不具备统计学意义。但它偶尔会具备认识论上的力量——那种能告诉你这一年来你一直找错了房间的力量。

评估分数不是底线。它是你目前已知如何衡量的能力的上限。在评估套件中,暗物质比可见宇宙更重,就像在宇宙学中一样。诚实的做法是,别再假装天花板就是天空。

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