把传统网页实验那套”50/50 切流量、跑两周、看转化率”直接套到 AI 应用上,得到的结论大概率会被自己的同事质疑。AI 应用的输出是概率性的、主指标必须同时覆盖业务与模型质量、流量分割要支持模型/提示词维度的快速切换。一个常见反模式是把”新模型准确率高 2 个百分点”当成可上线依据,但忽略了 2-4 周的新奇效应、延迟上升与边缘场景质量塌方。下面给出一份面向 AI 应用的 A/B 测试设计要点清单。
一、传统 A/B 测试与 AI A/B 测试的三层差异
| 维度 | 传统 A/B 测试 | AI A/B 测试 |
|---|---|---|
| 输出性质 | 确定性,同输入同输出 | 概率性,同输入可能得到不同输出 |
| 主指标 | 业务转化率、点击率 | 业务指标 + 模型质量(准确率/召回)+ 延迟 + 单次成本 |
| 护栏指标 | 页面加载、错误率 | 幻觉率、模型置信度、p99 延迟、token 单价 |
| 最小周期 | 1-2 周 | 2-4 周(兼顾新奇效应与学习效应) |
| 样本量 | 标准功效分析 | 更大方差下要做膨胀,常见膨胀幅度明显 |
| 灰度策略 | 特征开关 + 百分比灰度 | dogfood → 闭测 → A/B → 渐进放量 |
| 反馈采集 | 会后问卷、NPS | 行内 thumbs、上下文微调研、会话回放 |
传统实验关心”哪个 UI 更好”,AI 实验关心”哪个模型/提示词/检索配置组合更值得长期承担成本”。主指标的颗粒度不同,决定了样本量、周期、统计方法都要重新设计。
二、AI A/B 测试的五步流程
把测试做成可重复的流水线,按下面五步走。每一步都不是可跳过的工程动作。
- 明确主指标与护栏指标:主指标选 1 个核心业务指标,护栏指标覆盖延迟、成本、幻觉率;
- 设计变体:模型版本、Prompt 模板、检索配置都是合法变体,建议一次只改一个变量;
- 流量分桶:用特征开关(LaunchDarkly / Statsig / Unleash)按用户 ID 哈希分桶,保证同一用户只进一个桶;
- 收集数据:业务事件、模型事件(生成内容、token 消耗、置信度)、质量反馈(thumbs)三类并行采集;
- 评估与决策:主指标显著 + 护栏不破 + 质量反馈无明显恶化,三者同时成立才能放量。
第 3 步里分桶逻辑特别重要。如果分桶基于”实验 ID + 用户 ID”做哈希,可以保证同用户在实验期间不被中途切换桶,避免新奇效应被误读为版本差异。
下面是一段最简的分桶与流量分配伪代码(Python 风格):
import hashlib
def assign_bucket(user_id: str, experiment_id: str, salt: str = "v1") -> str:
"""根据 user_id 哈希到实验桶,避免同用户跨桶漂移。"""
raw = f"{experiment_id}:{user_id}:{salt}".encode()
h = int(hashlib.sha1(raw).hexdigest(), 16)
bucket = h % 100 # 0-99 用于分层切流
if bucket < 50:
return "control"
elif bucket < 90:
return "treatment_a"
else:
return "treatment_b" # 10% 留给快速验证高风险变体
# 用法:服务入口处先分桶,再路由到对应模型/提示词
if assign_bucket(uid, "exp_2025_q4_rewrite") == "treatment_b":
prompt = NEW_PROMPT_TEMPLATE
代码里 experiment_id + user_id 一起哈希是常见做法,盐值用于实验间隔离,重做实验时换 salt 即可避免老用户被旧哈希粘连。
三、指标体系设计
指标体系分三层。下面这张表对照看每层的作用与常见观测项:
| 指标层 | 关注点 | 常见指标 | 数据来源 |
|---|---|---|---|
| 业务层 | 用户是否更愿意用 | 转化率、留存、订阅、人均对话轮次 | 业务埋点 |
| 模型层 | 输出是否够好 | 任务完成率、相关性评分、幻觉率、用户 thumbs | LLM 日志 + 反馈 |
| 系统层 | 是否扛得住 | p50/p99 延迟、错误率、token 成本、缓存命中率 | 可观测平台 |
三层缺一不可。只看业务层会把”用户因延迟上升而流失”误判为”用户不喜欢新模型”;只看模型层会忽略商业上不可承担的成本。经验上的做法是把三层指标做成统一看板,实验评估时三张图并列看。
四、几类常见测试策略对比
| 策略 | 流量分配 | 速度 | 适用场景 | 注意 |
|---|---|---|---|---|
| 传统 A/B | 固定 50/50 | 慢 | 因果推断、上线前评估 | 周期长,新奇效应期易误判 |
| 多臂老虎机 MAB | 动态倾斜 | 快 | 模型频繁迭代、推荐排序 | 难以精确估计效应量 |
| 渐进放量 | 1% → 5% → 25% → 100% | 较慢 | 风险敏感、合规场景 | 需要可靠的回滚开关 |
| Interleaving | 同一会话内混排 | 极快 | 排序类 RAG、推荐 | 仅适合相对排序类场景 |
MAB 在 2024-2025 年被很多团队用得越来越普遍,本质是把”等待赢家”变成”边跑边倾斜流量”。代价是事后难以给出精确置信区间,所以关键决策还是用传统 A/B 兜底。
五、避坑清单
把 AI 当成”加个开关就行”的传统功能是最常见的误区。三个具体坑:忽略新奇效应(用户一开始因新鲜感更愿意点,但 2 周后会回落)、忽略方差膨胀(概率性输出下置信区间要宽得多)、忽略质量崩塌(业务指标微涨,但边缘问题上的幻觉率翻倍)。三者对应的解法分别是把实验周期拉到 2-4 周、用功效分析做样本量膨胀、把模型层指标纳入护栏。
另一个常见错误是把模型版本当成”功能”做 A/B,但又不冻结训练数据或检索快照。结果是新模型上线当周数据已经换了一轮,差异归因变得不可能。工程上的做法是实验期间冻结数据快照,并把所有相关配置(Prompt、检索索引、模型版本)显式记录到实验元数据里。
常见问题(FAQ)
Q1:AI A/B 测试一般要跑多久?
建议 2-4 周,至少覆盖新奇效应与学习效应两个阶段。
Q2:MAB 能完全替代传统 A/B 吗?
MAB 适合快速优化,传统 A/B 仍负责关键决策的因果推断。
Q3:AI 实验一定要看护栏指标吗?
必须。延迟、成本、幻觉率任一恶化都应阻止放量。