你的评估集里只有你已经解决的问题
在过去一个季度,你的评估分数从 0.81 上升到了 0.87。团队上线了一个路由器 (router),在困难意图上更换了更强大的模型,微调了系统提示词 (system prompt),并从“处理时间超过一天的工单”中提取并添加了 40 个新的测试用例。仪表盘显示系统变得更好了。NPS 持平。活跃用户数下降了 2%。
有一个简洁的故事可以解释这两个数字,但你可能并不想听:你的评估集只包含你已经解决的问题。那些失败得如此彻底,以至于用户从未提交工单、从未回来、甚至从未出现在你 grep 的任何日志中的查询 —— 它们不在你的测试套件中。它们不在任何人的套件中。评估分数的上升不仅与你在可见的事物上做得更好相一致,也与你在可见的事物上做得更好、但在不可见的事物上依然糟糕透顶相一致。
这是披着 MLOps 外衣的幸存者偏差 (survivorship bias)。你根据生产追踪构建评估集,用精心筛选的过往失败案例进行增强,并将权重偏向你发现的最难的 10% 的输入。这个流水线的每一个环节都隐式地过滤掉了那些停留时间不足以留下痕迹的用户。那些没能飞回家的轰炸机飞行员,不在那份 写着“加固发动机”的数据集中。
结构性缺失问题
评估集通常构建自三个来源,而这三个来源都经过了生存过滤。
首先是记录的生产流量。根据定义,记录下的查询是用户发送到你系统中的查询。如果产品在“意图 X”上彻底崩坏,用户不会耐心地再发十个“意图 X”的查询供你采样。他们发了一个,得到一堆垃圾,然后离开。你的日志中只包含一个样本 —— 很容易被当作偶然事件忽略 —— 而“意图 X”在非用户群体中的普遍性则是不可见的。
其次是精心筛选的过往失败案例。只有当有人注意到失败时,它才成为“过往案例”:一份支持工单、一次客户投诉、一个 Slack 讨论串、或者一个被标记的“踩” (thumbs-down)。这种失败模型不是“出差错的事物”,而是“出了差错,并且有时间、有词汇量、有动力的人报告了的事物”。预期较低的免费层级用户、不知道支持表单存在的非英语母语者、重试机制掩盖了症状的 Agent 流水线操作员 —— 这些人都没有进入你的筛选渠道。
第三是合成的对抗性示例。红队 (red team) 编写了他们怀疑会失败的提示词。这能产生极佳的覆盖率,覆盖了红队能想象到的失败,但这恰恰是你没有盲点的失败集合。根据定义,你盲点中的失败,正是红队没想起来要写下的那些。
把这些加在一起,评估集的形状就像一个手电筒。它照亮了一个圆锥区域。圆锥之外的领地并非荒芜 —— 只是从你站立的位置看不见而已。
