一篇读懂 LLM 应用的 A/B 测试:怎么科学地评估一次提示词修改

团队改了一版系统提示词,主观感觉「回答质量好了不少」,于是全量上线。两周后客服投诉上升——新提示词在离线评测集上提升了正确率,却在真实流量里让拒答率翻倍。这是 LLM 应用最典型的评测断裂:离线基准测的是「模型在固定题目上的能力」,而提示词改动改变的是「模型在你真实分布上的行为」,两者之间没有免费桥梁。A/B 测试是把因果推断接到 LLM 应用上的唯一可靠手段,但它有一套自己的纪律:分流怎么设计、样本量要多少、生成随机性怎么处理、什么时候可以看数据。本文把这套纪律拆开讲清楚。

一、为什么离线指标会骗人

三种断裂

第一种是分布断裂:离线评测集是人工构造的「干净」问题,真实流量里有大量模糊、多轮、夹带错误前提的 query,提示词在两类输入上的行为可能相反。第二种是全局断裂:LLM 应用是长链路系统——检索、提示词、生成、解析、前端展示,提示词改动会改变输出格式,下游解析器的失败率随之改变,端到端指标的变化方向与「回答质量」无关。第三种是人格断裂:提示词改动会改变模型的语气、拒答倾向与长度,这些「性格」变化直接作用于用户感知,而感知只能靠真实用户测量。结论:凡是改了系统行为(提示词、模型版本、采样参数、检索策略),都默认需要在线实验验证,离线评测只是第一道筛选。

实验单位与一致性

分流的基本单位要在「能感知改动的最小粒度」与「统计功效」之间权衡。请求级分流(每个请求随机)功效最高,但同一会话的相邻请求可能看到不同版本的行为,多轮对话里会前后矛盾。会话级或用户级分流牺牲一些功效,换来体验一致性,是多轮产品的默认选择。两条铁律:同一用户在同一实验期间必须稳定落在同一版本(用用户 ID 哈希到固定分桶);分流键必须与实验无关(用「实验 ID + 用户 ID」联合哈希,避免多个实验互相污染分桶)。

二、指标体系:北极星、护栏与代理指标陷阱

分层指标

一次提示词实验至少要预注册三类指标。北极星指标回答「这次改动想改善什么」:例如代码助手的采纳率、客服机器人的首次解决率。护栏指标回答「有没有暗中伤害什么」:拒答率、平均延迟、成本、用户点踩率、会话中断率。诊断指标帮助解释结果:平均输出长度、工具调用次数、重试率。上线决策必须同时满足「北极星显著提升、护栏全部不倒退」,只看北极星会漏掉「质量提升但成本翻三倍」这类失败的胜利。

代理指标的陷阱:点赞偏长、偏讨好

LLM 应用的显式反馈(点赞、点踩)是天然的代理指标,但它有系统偏差。首先长度偏差:人类在没有其他线索时倾向给长回答点赞,实证研究反复观察到点赞率与回答长度的正相关——如果你的提示词改动让回答变长,点赞率可能纯粹因为长度上升,与质量无关。其次是讨好偏差:sycophantic 的回答(顺着用户说)获得更多正反馈,哪怕事实是错的。最后是幸存者偏差:愿意点评价的用户本身是偏差样本。缓解办法:把长度放进指标控制变量或分层报告;把点赞率与事实性抽检(人工或 judge 抽查一定样本)联合解读;永远不要把单一代理指标当北极星。

flowchart TD
    C["提示词改动 v1 → v2"] --> D["预注册:北极星 + 护栏 + 诊断指标"]
    D --> E["分流:用户级哈希分桶<br/>同一用户稳定同版本"]
    E --> F["运行期纪律:SRM 校验 / 不 peeking / 盯护栏"]
    F --> G{"样本量达到预设 N?"}
    G -->|"否"| H["继续跑<br/>护栏越线则熔断"]
    G -->|"是"| I["检验:北极星 CI 与护栏 CI"]
    I --> J{"北极星显著↑ 且护栏无损?"}
    J -->|"是"| K["全量上线"]
    J -->|"否"| L["回滚或进入下一轮迭代"]

三、样本量与功效:先算账再开实验

一张纸算清需要多少用户

显著性水平 0.05、功效 0.8 的双比例检验下,每组所需样本量有一个好记的近似:n ≈ 16 × p(1-p) / δ²,p 是基线转化率,δ 是想检测的绝对提升。代入一个典型场景:客服机器人任务解决率基线 60%,你期望提示词改动带来 2 个百分点的提升(0.60 → 0.62),则每组需要 16 × 0.24 / 0.0004 = 9600 个会话,两组共约 1.92 万。如果你的日活会话只有 2000,这个实验要跑十天以上。反过来算账更有用:日活 3000 的产品,跑一周每组约 1 万样本,能可靠分辨的最小提升约 2 个百分点——小于 2 个百分点的改善在统计上就是看不见的,别指望「感觉」能补上。

LLM 特有的噪声与降方差

提示词实验的方差比传统 A/B 大,来源有二。其一是生成随机性:同一用户、同一 query,两次请求输出不同,会话级结局(比如「用户是否采纳」)的噪声随之放大——这属于不可消除的结局方差,只能靠样本量。其二是流量构成的波动:工作日与周末的 query 类型不同,周内效应会淹没真实提升。两个对策:分层随机(按 query 类别或用户分层的预分层,保证各组构成一致);以及 CUPED 类方差缩减——用实验前的历史指标(该用户过去四周的采纳率)作为协变量回归校正,微软的实验平台论文(Deng et al.,2023)报告这一招能把所需样本量压缩三成到一半,对 LLM 应用同样适用,因为「历史行为预测未来行为」在对话产品里尤其强。

新奇效应与放大期

还有一个 LLM 产品特有的效度威胁:新奇效应(novelty effect)。新版本上线的头几天,用户出于好奇会更多地试探新行为,互动指标虚高;等新鲜感消退,「提升」缩水甚至翻转的事故在对话产品里屡见不鲜。对策是把实验的判定窗口避开头几天,或者用 ramp-up 放量(按 10% 到 25% 到 50% 到全量逐级放量,每级停留观察)代替一次性全量分流——逐级放量还顺带控制了新版本存在未知缺陷时的爆炸半径。同理,反向的新奇效应也存在:老用户对新行为的适应成本会短期压低指标,判定周期至少覆盖一个完整的周内循环(七天),让工作日与周末的流量结构在两组内部各自对齐。

四、统计检验与运行期纪律

从卡方到 bootstrap 的实践

import numpy as np

def ab_z_test(c_a, n_a, c_b, n_b):
    """两组转化率的 z 检验;c 为成功数,n 为样本数"""
    p_a, p_b = c_a / n_a, c_b / n_b
    p_pool = (c_a + c_b) / (n_a + n_b)
    se = np.sqrt(p_pool * (1 - p_pool) * (1 / n_a + 1 / n_b))
    z = (p_b - p_a) / se
    from math import erf, sqrt
    p_value = 2 * (1 - 0.5 * (1 + erf(abs(z) / sqrt(2))))
    ci = 1.96 * np.sqrt(p_a*(1-p_a)/n_a + p_b*(1-p_b)/n_b)
    return z, p_value, (p_b - p_a - ci, p_b - p_a + ci)

# 例:A 组 5760/9600=60.0%,B 组 6038/9600=62.9%
print(ab_z_test(5760, 9600, 6038, 9600))
# z ≈ 4.18,p < 0.00001,95% CI ≈ [0.015, 0.042]

跑出来的三个数要一起读:z 值与 p 值回答「差异是否显著」,95% 置信区间回答「提升有多大范围的不确定性」。CI 下界 1.5 个百分点、上界 4.2 个百分点,意味着最保守的估计也超过了你的最小关心差异——这才叫稳赢。

SRM 与 peeking:两个最常见的实验事故

样本比例失配(SRM)是实验平台的「心电图」:设计 50/50 分流,实际跑到 50.7/49.3 且样本过万,几乎必然意味着分桶或上报出了 bug,此时任何指标对比都不可信。每次看板刷新都应先跑 SRM 卡方检验,它比业务指标敏感得多。peeking(边跑边看、显著就提前停)是第二事故源:固定样本量检验假设「只看一次数据」,每次提前决策都会放大假阳性——连续五次 peeking 且显著即停,实际假阳性率可以从 5% 膨胀到 15% 以上。要么严格按预设样本量收尾,要么改用序贯检验(如 mSPRT),它明确为「随时可停」设计,代价是需要更长平均运行时间。LLM 实验还有一条专属纪律:护栏指标(成本、延迟、拒答率)设定熔断线,越线立即降级回滚,不等实验结束——线上事故不配等显著性。

五、判定「质量」:在线 judge 与 side-by-side

转化率指标测的是商业结局,但「回答质量是否变好」本身也需要在线测量。两个成熟做法。其一是在线 LLM judge:对抽样流量(例如每日 2000 条)用中立强模型按评分表给两个版本的回答盲评,统计胜率及其置信区间——judge 同样要做位置交换去偏,这把离线 judge 的偏差管理搬到了在线抽样上。其二是产品内 side-by-side:向一部分用户同时展示两个回答让其选择,Chatbot Arena 式的配对比较统计功效高于绝对分数。注意 judge 抽样本身有成本,把它做成每天固定预算的持续监测,而不是只在实验期测量,这样才能积累「离线指标提升与在线 judge 胜率」的相关性基线——这个基线是判断「离线评测还能不能信」的唯一证据。

六、决策框架:不显著不等于没效果

实验结果有四种,各有标准动作。显著提升且护栏无损:全量上线,并记录「离线指标变化 → 在线变化」的对应关系,沉淀为组织的评测校准数据。显著倒退或护栏失守:回滚,写成复盘(改动内容、失败指标、教训)。不显著但方向为正:不要急着说「无效」——先检查功效(实验功效不足是比「改动无效」更常见的原因),样本不足则延长或加大分层;确认功效充足后仍不显著,再判定为「无实质效果」。方向相反且显著:同样回滚,但重点检查是否触发了代理指标陷阱(比如只是变长了)。最后一条组织纪律:所有实验预注册——改动假设、指标定义、样本量、停止规则在开跑前写成文档,这是防止「跑完再挑指标」这种自我欺骗的唯一手段。

小结

LLM 应用的 A/B 测试与传统互联网实验共享统计骨架——分流、样本量、检验、SRM 监控、反 peeking——但多了三层特有纪律。第一,离线评测与线上行为的断裂是常态,提示词与模型改动默认要做在线验证,离线只当筛选。第二,LLM 的生成随机性与反馈偏差(点赞偏长偏讨好)让代理指标更不可信,指标设计必须控制长度、联合事实性抽检,用 CUPED 与分层把方差压下来。第三,护栏熔断优先于统计显著性:成本、延迟、拒答率的越线回滚不等实验结束。把「16 × p(1-p) / δ²」的算账习惯、预注册的纪律和在线 judge 的持续监测合在一起,你就把「感觉这版提示词更好」升级成了「这版提示词以 95% 置信度带来 1.5 到 4.2 个百分点的解决率提升」——这是工程师和玄学家的分界线。

← 返回资讯列表

读者留言

COMMENTS 暂无
仅本站原创文章开放留言 · 请勿留下手机号、邮箱等个人信息

还没有留言,来说第一句?