跳到主要内容

你的模型已经学会通过可见输入预测的那个功能开关

· 阅读需 11 分钟
Tian Pan
Software Engineer

实验组之所以上线,是因为仪表盘显示“转化率 +4%,p < 0.01,n = 2.3M”。但在全球推行 6 周后,这一增长消失了。由于没有其他合理解释,团队将这次复盘报告归类为“规模效应”。然而,真正的原罪一直潜伏在提示词组装器(prompt assembler)中:决定实验分组的路由哈希(routing hash)派生自一个用户层级(user-tier)属性,而三行代码后,同样的属性被插值到了提示词模板中。模型直接在带内(in band)读取了分组分配。所谓的“实验干预”(treatment)并非提示词的改变,真正的干预是提示词改变后所吸引的用户群体。

这是一种在团队从 Web 时代继承的实验手册中并不存在的失效模式。按钮颜色不会读取用户层级并决定表现不同,但提示词会。一旦你的实验干预是一个由模型解释的字符串,那么任何触及路由决策且同时触及提示词的输入,都会变成实验无法关闭的后门。

模型是参与者,而非结果

在经典的 A/B 测试中,实验干预是渲染页面的一个属性,用户是 passive 的接收者。你更改一个行动召唤(CTA)按钮,衡量点击量,然后结束工作。随机化单元(用户)和实验干预应用单元(页面)被网络边界隔开,除非你选择泄露,否则用户的属性不会泄露到实验干预本身。

LLM 实验瓦解了这一边界。实验干预是一个提示词,而提示词是用户属性的函数。你并不是在渲染一个不同的段落,而是在渲染一个不同的“指令集”,模型随后会结合请求中的其他所有内容对该指令集进行条件化处理。如果你的提示词模板在组装器早期就根据用户层级进行分支——几乎所有生产环境的组装器都会这样做,因为企业级用户拥有更长的推理预算,而免费层级用户则会收到更简洁的拒绝——那么模型就会直接看到分配轴。它不需要知道自己处于哪个实验组,它已经知道自己在和哪种类型的用户交谈,而且由于构造原因,这种知识与实验分组具有共线性。

这就是经典因果推断中实验干预泄露(treatment leakage)在 LLM 领域的对应物:当分配信号与同样影响结果的混杂因素(confounder)相关时,分配的估计效应就会受到混杂因素效应的污染。随机化可以保护你免受未测量的混杂因素的影响,但前提是分配本身必须与实验干预摄取的输入正交。对于 LLM,这种正交性几乎从不是免费的,你必须在设计中考虑这一点。

虚假提升是如何产生的

让我们端到端地梳理一下这个失效模式。你的路由层使用用户 ID 和盐(salt)进行哈希处理以分配组别。到目前为止,一切正常。但这个盐是实验 ID,而哈希桶的键是一个包含用户层级的元组——因为去年有人想“确保每个层级都能获得平衡的曝光”。同一个用户层级值被传递到提示词组装器中,由其选择系统提示词片段(“你是企业客户的高级顾问”对比“你是一个得力的助手”)。现在,模型接收到的提示词结构在子实验组(sub-arm)级别上与群体变量相关。

在对照组中,两个层级都得到旧的提示词。在实验组中,两个层级都得到新的提示词。从理论上讲,这目前仍然没问题:每个层级都以正确的比例看到两个组别。但是,新提示词对层级的敏感度与旧提示词不同。也许新提示词在企业背景下扩展得更激进,因为作者是针对企业级数据进行调优的。也许它对免费层级请求的截断方式不同,因为新格式在长输入上达到了 Token 限制。结果是,作为两个层级边际平均值计算出的实验效应,最终被新提示词所青睐的层级所主导。

在全量上线时,人群构成发生了变化。新提示词现在服务于 100% 的流量,包括实验从未覆盖到的边缘用户:试用账户、路由器默默合并到“免费”类别的已弃用层级、以及根本不经过分配层的地理队列。“转化率 +4%”是分配窗口内层级构成的属性,而不是提示词本身的属性。构成改变,提升消失,复盘报告虚构了一个从未存在过的规模效应。

这与泰曼定律(Twyman's Law)的逻辑一致:实验结果越不寻常,就越有可能源于仪表化误差(instrumentation error)。在 LLM 领域,这种仪表化误差是结构性的而非偶然的——模型被设计为读取决定其分组的输入。

你的实验技术栈所遗漏的征兆

有一些信号表明分配正在泄露,而大多数实验仪表盘并未配置为显示这些信号。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates