你在实验中上线了一个模型替换。两周过去了,控制面板只变动了 0.1%,读数显示“无显著差异”。你得出结论,新模型与旧模型基本相同,然后继续进行其他工作。
它们并不相同。你的指标从未敏感到足以区分它们。
这是 AI 功能 A/B 测试中一种悄无声息的失败模式。统计机制完全按照设计运作。随机化很干净。样本量足够大。p-value 是诚实的。然而,实验仍然无法区分一个用户深爱的模型和一个他们仅仅是容忍的模型,因为实验唯一衡量的是他们是否点击了。
AI 的 A/B 测试首先是一个测量问题,其次才是统计问题。大多数团队直接跳到了统计环节。
即使人类评价差异巨大,点击率在不同模型间也几乎持平
将两个模型的输出交给一组用户,问他们更喜欢哪一个。你会得到一个明显的赢家,而且通常差距巨大。现在,通过你的参与度仪表盘进行同样的对比。点击率 (Click-through rate)、任务完成率、会话时长——它们几乎没有任何变动。
原因是点击率所衡量的东西位于模型质量的上游。用户点击是因为他们有问题,而不是因为答案好。他们完成任务是因为他们带着完成任务的意图而来。他们留在会话中是因为接下来的 30 秒内他们无处可去。参与行为发生在模型产生任何内容之前;参与度指标是意图的函数,而不是输出的函数。
坏答案和好答案都可以产生点击。它们的区别在于“接下来发生了什么”,而“接下来发生了什么”恰恰是大多数产品分析工具套件没有监测的部分。你看到了点击和下一个会话,它们被一个包含用户对模型实际体验的鸿沟隔开了——而你对这个鸿沟的任何一端都没有进行足够分辨率的测量,从而无法捕捉到信号。
这与传统产品实验在内容质量变更时遇到的陷阱是一样的。重新设计的文章页面不会对跳出率产生太大影响,因为跳出率衡量的是读者是否到达,而不是他们是否得到了想要的东西。AI 功能位于该鸿沟的更深处。你运行实验所用的指标,与你真正想要改变的东西之间的距离甚至更远。
劣质答案与导致流失之间的延迟
当模型变差时,用户不会在那天离开。他们离开是在三周后,直到累积的体验达到了每个用户个体对“这对我没用”的忍耐阈值。损害是真实的,金钱损失也是真实的,但它们被平摊到了一个足够长的时间窗口内,以至于任何为期两周的 A/B 测试都无法察觉。
这是滞后指标 (lagging-indicator) 问题最刻薄的表现形式。你最信任的指标——留存用户、付费用户、回访用户——恰恰是记录变化所需时间最长的指标。等它发生变动时,实验已经结束一个月了,新模型已经推送给所有人,剩下的唯一信号就是曲线正在向下弯曲,而没有人能证明原因。
反向的情况也同样糟糕。你发布了一个更好的模型,运行了实验,却没看到任何变动,于是得出结论:没有改进。三个月后,留存率上升了两个百分点。没有人将其归功于模型替换,因为实验报告说它毫无作用。
这不是通过增加流量就能解决的统计功效 (statistical-power) 问题。信号并没有被掩埋在噪声中。在你查看仪表盘的那一刻,信号确实还不存在。延长实验时间只有在延迟短于你的耐心时才有用,而对于大多数 B2C 产品来说,事实并非如此。
比留存率变动更快的代理信号
解决办法不是放弃实验。解决办法是停止使用衡量意图的指标进行实验,开始使用衡量不满的指标。不满是模型直接导致的内容,用户会立即察觉,通常就在同一个会话中。
一份在模型变更时确实会发生变化的信号简表:
重新生成 (Regenerations)。 用户再次请求答案。他们不是好奇,而是不满意。这是 AI 产品中最被忽视的信号。记录它的成本几乎为零,且与其他所有指标高度相关。
后续修正。 “不,我的意思是……”,“实际上……”,“我问的不是这个。”这些是用户用清晰的语言告诉你,上一步操作失败了。在下一条消息上运行分类器,你就能获得每轮更新的质量信号。
中途放弃。 用户在答案完成前停止阅读,或者在生成时关闭了标签页。流式传输 (Streaming) 使得这一点比批处理响应更容易测量。
人工介入。 在任何存在人工交接的产品中,人工介入率是能找到的最干净的质量指标。这是用户用他们能采取的最昂贵行动进行的投票。
重新表述问题。 用户以不同的方式再次询问同一件事。这是留存率最终会在三周后捕捉到的隐性反馈信号。
这些信号具有留存率所不具备的一个特性:它们是由模型输出且仅由模型输出引起的。用户点击是因为他们的意图;用户重新生成是因为你的答案。因果链更短,噪声底噪更低,且延迟是以秒而非周为单位的。
监测成本很小。解读成本也很小。阻碍大多数团队的是政治成本——这些指标不在高管的仪表盘上,而要说服领导层,重新生成率下降 0.4% 正是他们想要的实验结果,这比指着一个没变动的留存数字要难得多。
在信任实验之前,先验证指标 这里有一个几乎无人执行的规范。在你信任 A/B 测试能检测到真实的模型改进之前,先证明它能检测到一个刻意破坏的模型。
将候选槽位中的模型进行降级。缩减上下文窗口(context window)。切换到同系列中更小的变体。注入 20% 的“假装听不懂”率。将它发布到你用于真实候选模型的相同实验框架中,分发给一小部分流量,然后观察你的指标变化。
如果你的仪表盘无法在合理的时间窗口内以高置信度检测到这个被刻意破坏的模型,那么它也无法检测到比这更细微的任何变化。无论你在那个位置放入什么模型,你计划运行的实验都将产生一个看起来很可信的空结果(null result)。正确的做法不是运行那个实验,而是修复指标。
大多数团队从未这样做过。他们假设自己的指标是灵敏的,因为这些指标在另一个时代、针对另一种产品变更时曾经灵敏过。这种假设是可以随意套用的,但验证却不行。
这项规范的一个近亲是 A/A 测试 —— 将两组流量分配给同一个模型,并确认你的指标显示没有差异。如果显示有差异,说明你的随机化过程或指标管线出了问题,实验在开始前就失去了意义。而“刻意破坏模型测试”是其自然的补充:A/A 测试证明了在没有差异时你看不见差异;降级测试则证明了在有差异时你能看见差异。你两者都需要,但人们往往会跳过后者。
还有一个值得增加的层面。刻意破坏的模型是一个已知的底线 —— 如果你连它都检测不到,那么任何更细微的变化也都无法检测。请审慎地选择降级的幅度。注入一些足够微小的改动,使其成为你在生产环境中仍然希望捕捉到的最小变化。如果你的指标能检测到这一点,那么对于你基于它所做的决策来说,这个指标就是值得信赖的。
这对决策意味着什么 AI 功能的 A/B 测试空结果与按钮颜色的 A/B 测试空结果并不是同一种证据。它是两个焊接在一起的断言:“新模型没有改进这个指标”以及“如果真的有任何改进,这个指标本该会变动”。第二个断言是无人验证且通常会悄无声息地失效的那个。
所以,当仪表盘显示结果平平,而有人说“新模型和旧模型没区别”时,请提出质疑。询问该指标经过校准后能检测到什么样的模型。询问最小可检测变化量是多少。询问上一次 A/A 测试是什么时候运行的,以及是否有人曾通过这个管线发布过一个刻意变差的模型,以确认仪表盘察觉到了。
如果答案是“我们不知道”,那么你得到的就不是一个实验结果。你得到的是一个只会不断告诉你一切正常的仪表盘,直到留存曲线开始弯折,而到那时再想知道是哪个决策导致了这一切就太晚了。
这个教训比 AI 出现得更早,只是在这里更加令人痛苦,因为指标衡量的内容与用户体验之间的鸿沟从未像现在这样巨大。选择那些在“用户不满”的时间尺度上产生波动的指标,而不是在“用户流失”的时间尺度上。在信任指标能检测未知信号之前,先用已知信号对其进行验证。对待模型切换中出现的 A/B 测试空结果,要像对待一个从未有人见过它变红的绿色测试套件一样,保持同样的怀疑态度。
会员专享
余下内容仅对会员开放。 会员可读完整内容 —— 每一个公开发布的观点背后,那些框架、决策与推理的全貌。
— 完整文章,包含未公开存档的部分 — 可落地的工作框架,附带权衡与决策依据 — 新文章抢先看,先于公开发布 登录以继续阅读→ 随时取消 · 一次订阅,畅读全部