想象一下,你是一家面馆的老板,最近研发了一款新配方的高汤。你想知道老顾客们更喜欢老汤底还是新汤底,但不能直接问——因为人的嘴会说谎,肠胃不会。最靠谱的办法是:连续一周,让一半客人喝老汤,一半客人喝新汤,然后悄悄记录他们喝完后的“再来一碗”比例、碗底剩汤量、甚至打嗝次数。这就是AB实验的本质——不靠嘴争,靠数据说话。 推荐系统的世界里,算法工程师就像这位面馆老板。他们每天都在琢磨:把推荐列表从“按热度排序”改成“按个性化排序”,用户真的会更满意吗?把首页的图片从矩形改成圆形,点击率会上升吗?这些问题无法靠拍脑袋回答,因为用户的偏好复杂多变,昨天的结论今天可能就失效。于是,AB实验成了推荐系统领域的“金标准”——把用户随机分成两组,一组看到旧策略(对照组),一组看到新策略(实验组),然后对比两组的行为指标,用统计学的尺子量一量:这点差异,到底是真本事,还是运气好? 本文会用面馆实验的比喻,带你走完AB实验从设计、实施到分析的完整旅程:如何公平分组、如何选指标、如何判断差异是否显著、如何避免实验之间互相打架、如何防止实验被污染,以及如何从一次性实验走向可持续优化的系统工程。

岗位关联

对AI从业者的价值:AB实验是将“我觉得有效”升级为“数据证明有效”的核心技能,是大规模推荐系统迭代的护航舰,也是算法工程师与产品经理、数据分析师对话的通用语言。

目录
  1. 可视化演示
  2. 实验分组随机化
  3. 指标体系设计
  4. 显著性检验
  5. 实验互斥设计
  6. 实验污染防护
  7. 生产落地实践
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示用户随机分组与流量分割、显著性检验判定,以及辛普森悖论的分层分析,可切换三种模式观察。

本节配有交互动效(进入视口后自动加载,约 3KB)。

流量分割 用户随机分为对照组与实验组 量化策略改动的真实收益 随机分组 + 流量分割 AB实验是效果验证的金标准。

实验分组随机化

面馆老板深知,想让味觉评比公平,就不能让客人自己选窗口——年轻食客偏向浓香新汤,老食客钟情清淡老汤,若是客人自由选择,最后无论哪个窗口胜出,你都分不清是汤的功劳还是客群偏好的功劳。于是,老板规定:顾客进门后,单号进左门,双号进右门,互不串门。这就是AB实验的第一块基石——分组随机化。

在推荐系统中,分组随机化意味着把每个到达的用户,通过一个不可预测但又可复现的规则,均匀地分配到对照组(A组,体验旧策略)或实验组(B组,体验新策略)。随机化的魔力在于:当样本量足够大时,两组用户的年龄、性别、活跃度、历史偏好等所有已知和未知的特征,在统计意义上都会趋于一致。这样,实验结束时两组指标的差异,就只能归因于策略改动本身。

实际工程中,常用哈希分流算法实现随机化:取用户的唯一标识(如 user_id),对其做哈希运算后取模,根据模值落入不同的实验组。这保证了同一个用户始终进入同一组,避免反复横跳。

样本量估算是另一门学问。如果实验组只有10个用户,哪怕新策略真的有效,统计上也看不出来——就像拿一勺汤去判断整锅汤的咸淡。实践中用“最小可检测效应”来推算所需样本量:你想捕捉的最小提升幅度越小,需要的样本量就越大。

回到面馆:随机化保证了两拨客人的“底子”一样,之后无论哪碗汤卖得更好,你都可以安心地归功于汤本身。这就是随机化的价值——把“人的差异”这件麻烦事,用概率的魔法抹平了。

组别=hash(user_id) mod N\text{组别} = \text{hash}(\text{user\_id}) \bmod N
哈希取模让每个用户被“掷骰子”式地固定分到某个组,骰子虽然随机,但结果可复现,保证实验公平且可审计。
  1. 哈希函数把任意长度的用户ID压缩成固定长度的数字串,相同输入永远得到相同输出
    hash(user_id)\text{hash}(\text{user\_id})
  2. 取模运算用哈希值除以分组总数N,取余数,把用户映射到 0 到 N-1 的某个组号
     mod N\bmod N
  3. 组别判定余数为 0 进对照组,余数为 1 进实验组(N=2时),实现五五开
    组别∈{0,1}\text{组别} \in \{0, 1\}

指标体系设计

面馆老板开始记录数据,但他很快发现“营业额”这个指标不够用。新汤虽然卖得多,但客人剩碗底的比例也高了——销量上涨靠的是猎奇尝鲜,回头客可能并没有变多。他需要一套更精细的指标层级:主指标看“是否值得做”,护栏指标看“做了有没有副作用”,辅助指标解释“为什么有效”。

推荐系统的指标体系同样讲究分层设计。主指标是全村的希望,通常选择与业务核心目标直接对齐的指标,比如电商场景的“成交转化率”、短视频场景的“人均观看时长”、广告场景的“千次曝光收益”。主指标只有一个,避免多头决策。

护栏指标是安全气囊。策略改动不能让主指标涨了、体验却崩了。例如:推荐算法改版后点击率升了,但用户退货率也飙升——这是典型的“饮鸩止渴”。所以必须设置护栏指标,如“人均退货率”“投诉率”“次日留存率”,一旦护栏指标显著变差,实验立即叫停。

辅助指标则负责解释“为什么”。当主指标上涨时,辅助指标能告诉你上涨来自哪里:是年轻用户贡献的?是推荐位第2到第5位的点击率提升了?这些信息帮助团队理解策略的作用机制,积累可复用的经验。

面馆老板最终确定了三重指标:卖掉碗数(主)、回头客比例(护栏)、年轻客人占比变化(辅助)。有了这套体系,他就不会因为“今天卖得多”而高兴得太早——也许那只是隔壁商场搞活动带来的虚假繁荣。

指标权重=w主×主指标+w护×护栏指标+w辅×辅助指标\text{指标权重} = w_{\text{主}} \times \text{主指标} + w_{\text{护}} \times \text{护栏指标} + w_{\text{辅}} \times \text{辅助指标}
加权组合让团队在决策时既看收益又看风险,避免“一俊遮百丑”。
  1. 主指标权重赋予最高权重的核心业务指标,是实验成败的第一判据
    w主×主指标w_{\text{主}} \times \text{主指标}
  2. 护栏指标权重赋予负权重或硬性阈值,一旦触发即否决实验
    w护×护栏指标w_{\text{护}} \times \text{护栏指标}
  3. 辅助指标权重小权重但不可缺,帮助解释实验因果链路
    w辅×辅助指标w_{\text{辅}} \times \text{辅助指标}

显著性检验

实验跑了一周,老板发现新汤窗口的“碗底朝天率”是 62%,老汤窗口是 55%。表面上看新汤赢了 7 个百分点,但老板不敢轻举妄动:万一是这一周来吃面的客人恰好偏重口味呢?万一是下雨天影响了客人的味觉呢?统计学给他提供了一把尺子——显著性检验。

显著性检验的核心思想是反证法:先假设“新汤和老汤其实没有差别”(原假设 H₀),然后计算在 H₀ 成立的条件下,观察到当前差异(或更极端差异)的概率——这个概率就是 p 值。如果 p 值很小(通常小于 0.05),说明“假设没差别”这件事本身就站不住脚,于是拒绝 H₀,认为新汤确实更好。

其中 \hat{p}_A 和 \hat{p}_B 分别是两组观测到的点率,\hat{p} 是两组合并的点率。这个 z 分数衡量的是“差异相对于随机波动的倍数”。

只盯着 p 值还不够,专业人士还看置信区间——它告诉你真实差异大概落在哪个范围。比如 95% 置信区间是 [1.2%, 6.8%],说明新汤的优势至少有 1.2 个百分点,最多 6.8 个百分点,下限大于 0 才真正稳了。

老板看着 p = 0.03 的报告,心里踏实了:这把尺子告诉他,如果新汤和老汤其实一样好,那么仅仅靠运气观察到这么大差异的概率只有 3%,还不到 5% 的阈值。他决定:换汤!

z=p^B−p^Ap^(1−p^)(1nA+1nB)z = \frac{\hat{p}_B - \hat{p}_A}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_A} + \frac{1}{n_B}\right)}}
  1. 差异分子实验组与对照组的点率之差,是我们要评估的“表面差异”
    p^B−p^A\hat{p}_B - \hat{p}_A
  2. 合并点率两组数据合并计算的总点率,作为“无差异”假设下的基准
    p^=xA+xBnA+nB\hat{p} = \frac{x_A + x_B}{n_A + n_B}
  3. 标准误分母衡量“如果真没差别,差异会随机波动多大”的尺子
    p^(1−p^)(1nA+1nB)\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_A} + \frac{1}{n_B}\right)}
  4. z分数差异是标准误的多少倍,超过 1.96 即代表 p < 0.05
    z>1.96z > 1.96

实验互斥设计

面馆生意越做越大,老板开始同时试验多项改进:新汤底、新面条、新桌布、新音乐。问题来了——如果新汤底和新桌布同时在跑,到了评定时,你如何知道客人满意度上升是汤的功劳还是桌布的功劳?两个实验的流量互相交叉,结论就成了一笔糊涂账。

这就是实验互斥与正交要解决的问题。互斥实验是指两个实验不共享用户——用户参加了实验A,就不能参加实验B。正交实验则相反:两个实验可以共享用户,但通过分层设计确保两个实验的流量分配互不干扰。

成熟的推荐系统实验平台采用“层”(Layer)与“域”(Domain)的概念。整个用户流量被复制成多个“域”,每个域拥有 100% 的流量,域与域之间是正交的。每个域内部又划分为多个“层”,同一层内的实验必须互斥,不同层的实验可以正交。比如:一个用户在“推荐排序层”参与实验A,同时还可以在“首页样式层”参与实验B——两个实验各看各的指标,互不污染。

老板的解决方案:把食客分为“口味测试组”和“环境测试组”,老汤/新汤的对比只在口味组里进行,老桌布/新桌布的对比只在环境组里进行。两拨人互相看不见,实验结论互不干扰。他甚至在同一个食客身上同时测口味和环境——通过精妙的安排,一份客流量出了两份实验结论。

流量分配=⋃i=1LLayeri,Layeri∩Layerj=∅ (i≠j)\text{流量分配} = \bigcup_{i=1}^{L} \text{Layer}_i, \quad \text{Layer}_i \cap \text{Layer}_j = \emptyset \ (i \neq j)
层与层之间是“平行世界”,同一层内是“独木桥”——这就是互斥与正交的优雅平衡。
  1. 层内互斥同一层内的实验瓜分该层流量,任何用户最多进入该层的一个实验
    Layeri∩Layerj=∅\text{Layer}_i \cap \text{Layer}_j = \emptyset
  2. 层间正交不同层的实验流量互不干扰,用户可同时参与多个层
    Orthogonal(Layeri,Layerj)\text{Orthogonal}(\text{Layer}_i, \text{Layer}_j)
  3. 全量覆盖所有层的并集等于全量流量,确保流量不浪费
    ⋃i=1LLayeri=All Users\bigcup_{i=1}^{L} \text{Layer}_i = \text{All Users}

实验污染防护

面馆的评比刚进行到第三天,老板发现了一个诡异现象:有几位客人今天在左门吃新汤,明天又出现在右门吃老汤。一问才知道,这几位客人是隔壁公司的程序员,午休时间多,喜欢两边的面都尝一遍。老板心想:这批“穿越用户”的数据混在实验里,岂不是把新汤的真实效果给稀释了?

这就是实验污染中的用户穿越问题:用户在不同实验组之间流动,导致对照组用户实际上体验过新策略,实验组用户也体验过旧策略,组间差异被抹平。在推荐系统中,用户穿越的典型场景是:同一个用户在不同设备上登录,有的设备被分到A组,有的被分到B组,造成了策略的交叉暴露。

另一种常见的污染是新奇效应:用户刚看到新界面时,出于好奇会多点击几下,造成实验组指标虚高。但这种新鲜感消退后,指标可能回落到与对照组无异甚至更低。如果不设“预跑期”(预热期),在前几天就下结论,很容易被虚假繁荣欺骗。

最阴险的污染当属辛普森悖论——分组数据各说各话,汇总数据却得出完全相反的结论。比如新策略对高活跃用户和低活跃用户分别都更优,但因为实验组里低活跃用户占比更高(随机化出了偏差),汇总后反而显示新策略更差。这不是策略的问题,是分组比例失调的幻觉。

老板把“穿越客人”的数据单独标记出来,在分析时剔除;把新汤实验的前两天设为“蜜月观察期”不做决策;还把客人按年龄分层,分别看年轻人和老年人的反馈,避免辛普森悖论。有了这三重防护,他的味觉评比才算真正“干净”。

ab<cd,ef<gh,但a+eb+f>c+gd+h\frac{a}{b} < \frac{c}{d}, \quad \frac{e}{f} < \frac{g}{h}, \quad \text{但} \quad \frac{a+e}{b+f} > \frac{c+g}{d+h}
各组都赢、汇总却输,悖论的根源是分组不均衡,必须分层分析和做样本清洗。
  1. 各子组比较在用户分层(如高活跃/低活跃)下,实验组指标各自占优
    ab<cd,ef<gh\frac{a}{b} < \frac{c}{d}, \quad \frac{e}{f} < \frac{g}{h}
  2. 汇总比较合并所有用户后,对照组反而领先,产生与直觉相反的结论
    a+eb+f>c+gd+h\frac{a+e}{b+f} > \frac{c+g}{d+h}
  3. 归因问题出在实验组与对照组中子群体的占比不均匀,需用分层加权校正
    真实效果=∑iwi×(p^B,i−p^A,i)\text{真实效果} = \sum_{i} w_i \times (\hat{p}_{B,i} - \hat{p}_{A,i})

生产落地实践

面馆老板的实验方法论逐渐成熟,但他很快意识到:每次实验都要手动分组、手动记录、手动算显著性,效率太低不说,还容易出错。他开始把整套流程平台化:进门的取号机自动完成分流,每碗面的销售数据自动上传,后台程序自动算 p 值并发送实验报告。这就是实验平台的雏形。

一个成熟的实验平台至少包含四大模块:分流模块负责哈希分桶与参数下发,保证实验参数能实时配置到推荐服务;数据模块负责埋点采集与指标计算,打通“用户行为 → 实验日志 → 指标报表”的全链路;分析模块内置显著性检验、置信区间计算、分层分析等统计工具;决策模块则负责实验的启动、停止、上线与回滚,并支持设置止损条件。

工程实践中有几个关键经验。一是实验参数的动态配置:新的策略往往涉及复杂的模型或规则,需要将实验参数化并通过配置中心下发给线上服务,而不是改代码发版。二是数据的“预跑期”机制:实验启动后先观察 24-48 小时的“分流均匀性”,确认两组用户的关键特征分布大致相同后,再正式启用实验数据。三是统一的实验报告模板:让每个实验的结论都以相同的格式呈现,方便横向对比和归档。

面馆老板的实验平台上线后,他不再需要每次亲自盯着收银台。他给每项改进设定了自动停机的止损阈值,一旦护栏指标跌破红线,系统自动回滚到旧汤配方。他陆续验证了“新汤底有效”“细面条受欢迎”“轻音乐提高翻台率”,每一项决策都有数据背书。他恍然大悟:AB实验不仅是一次性的评测工具,更是一种可复制、可积累的工程能力——每一次实验都在为下一次实验铺路。

实验ROI=实验带来的增量收益实验工程成本+风险损失\text{实验ROI} = \frac{\text{实验带来的增量收益}}{\text{实验工程成本} + \text{风险损失}}
平台化的目的是让实验的成本足够低、速度足够快,让“试试看”成为团队的日常习惯,而非昂贵的大工程。
  1. 增量收益实验组相比对照组的指标提升换算成的业务价值
    实验带来的增量收益=(p^B−p^A)×流量×单用户价值\text{实验带来的增量收益} = (\hat{p}_B - \hat{p}_A) \times \text{流量} \times \text{单用户价值}
  2. 工程成本开发、部署、监控实验所耗费的工程师时间与机器资源
    实验工程成本\text{实验工程成本}
  3. 风险损失实验失败可能带来的用户体验下降与口碑损失
    风险损失\text{风险损失}

AI 应用场景

推荐排序策略迭代验证

阶段:模型评估与上线决策

解决的问题:传统方式中,推荐排序模型的改动靠 offline 指标(如 AUC)决定是否上线,但离线指标与线上真实用户行为时常脱节——线下涨了,线上可能跌了。AB实验通过让一小部分真实用户先体验新模型,用线上指标检验效果,避免了全量发布带来的风险。

具体案例:某短视频平台要验证“基于用户兴趣向量的粗排模型”是否优于“基于热度统计的粗排模型”。平台开放 10% 流量进行 AB实验,实验组使用新模型,对照组保持旧模型,观察“人均播放时长”和“次均播放完成率”两个指标。实验运行一周后,实验组时长达标但完成率下降,平台通过护栏指标(“用户举报率”)发现新模型推荐了少量低俗内容,及时回滚并改进模型后重新实验。

首页UI改版升降级评估

阶段:产品迭代评估

解决的问题:产品经理凭直觉判断“新版UI更好看”,但“好看”无法量化。AB实验用“点击率”“转化率”等行为指标,将主观审美判断转化为客观数据对比,让UI改动从“我认为”变为“数据证明”。

具体案例:某电商平台将首页推荐模块从“双列瀑布流”改为“单列大图”模式。通过AB实验对比了两版UI在“首屏点击率”“人均浏览深度”“加购转化率”上的差异,实验组(单列大图)虽然首屏点击率略低,但人均浏览深度和加购转化率显著更高,最终决策全量上线单列模式。

大规模模型A/B平台集成

阶段:MLOps 持续交付

解决的问题:大厂中每天有几十个实验在同时运行,如果每个实验都独立搭建分流和分析环境,既浪费资源又容易出乱子。实验平台的统一分流、统一指标、统一分析能力,让团队可以安全地并行开展实验。

具体案例:某头部互联网公司的推荐团队在实验平台上同时运行 20 余个实验:三个排序模型实验(互斥)、两个UI样式实验(正交)、一个推送文案实验(分层)。平台自动确保实验之间的流量隔离,并在每周实验报告中汇总指标显著性和置信区间。团队据此快速迭代,每周至少有一个模型改进通过实验验证并全量上线。

Python 演示

python41 行
"""模拟AB实验:比较两组点击率是否有显著差异功能:生成对照组和实验组的模拟点击数据,计算z分数与p值"""import numpy as npfrom math import sqrt, erfc def simulate_ab(n_control=10000, n_treat=10000, p_control=0.20, p_treat=0.24, seed=42):    """模拟AB实验数据并计算显著性"""    rng = np.random.default_rng(seed)    # 生成二项分布点击数据: 1表示点击, 0表示未点击    clicks_control = rng.binomial(1, p_control, n_control)    clicks_treat = rng.binomial(1, p_treat, n_treat)    # 计算两组点击率    p_hat_control = clicks_control.mean()    p_hat_treat = clicks_treat.mean()    print(f"对照组点击率: {p_hat_control:.4f} (n={n_control})")    print(f"实验组点击率: {p_hat_treat:.4f} (n={n_treat})")    diff = p_hat_treat - p_hat_control    # 合并点击率, 用于计算标准误    total_clicks = clicks_control.sum() + clicks_treat.sum()    total_users = n_control + n_treat    p_pool = total_clicks / total_users    # 计算标准误: sqrt(p_pool*(1-p_pool)*(1/n1+1/n2))    se = sqrt(p_pool * (1 - p_pool) * (1 / n_control + 1 / n_treat))    z_score = diff / se    # 双侧p值: erfc(|z|/sqrt(2)) 为标准正态分布的尾概率    p_value = erfc(abs(z_score) / sqrt(2))    print(f"差异: {diff:.4f}, z分数: {z_score:.3f}")    print(f"p值: {p_value:.6f}")    alpha = 0.05    if p_value < alpha:        print("结论: 差异显著, 拒绝原假设, 新策略有效!")    else:        print("结论: 差异不显著, 无法证明新策略有效")    return p_value, z_score if __name__ == "__main__":    # 参数说明: 对照组1万人基准点击率20%, 实验组1万人点击率24%    simulate_ab(n_control=10000, n_treat=10000,                p_control=0.20, p_treat=0.24, seed=42)
目的:模拟一次完整的AB实验数据分析流程,从生成模拟点击数据到计算 z 分数与 p 值,最终做出统计决策。你可以调整参数,观察不同点击率差异和样本量如何影响显著性结论。
  1. rng.binomial(1, p_control, n_control)模拟每个用户是否点击,这是伯努利试验,返回 0/1 数组
  2. clicks_control.mean()计算对照组点击率,就是点击人数除以总人数
  3. p_pool = total_clicks / total_users合并点击率,它是“如果两组其实没差别”时的基准估值
  4. se = sqrt(p_pool*(1-p_pool)*(1/n_control+1/n_treat))标准误,衡量差异的随机波动幅度
  5. z_score = diff / sez分数,差异是波动的多少倍
  6. erfc(abs(z_score)/sqrt(2))用互补误差函数算标准正态分布尾概率,即 p 值
  7. if p_value < alpha:显著性判断,p 值小于 0.05 就认为差异不是运气

常见误区

误区“实验必须跑满两周,一天都不能少,否则结果不可信。”我习惯性地把实验时长当作硬性指标,哪怕实验效果非常明显,也要硬等两周才敢看结果。

正解实验时长不是拍脑袋定的,而是由样本量和效应大小决定的。统计学上有个概念叫“最小可检测效应”——当你期望检测到的最小提升幅度是一定的,就可以算出需要多少样本量,进而推算出需要多少天。如果新策略效果显著且样本量已经足够,提前下结论是合理的。反过来,如果效果不明显,跑再久也可能不显著。科学的做法是:设定好“期望检测到的最小效应”,用功效分析确定所需样本量,再结合日均流量估算实验天数。

为何常见:人们倾向于把“时间”当作确定性的锚点,觉得跑得越久越可靠。但实际上,样本量才是决定统计功效的根因,时间只是样本量的一个间接变量。

误区“实验组点击率比对照组高了 10%,涨幅这么明显,肯定要全量上线!”我只看点击率这一个指标,忽略了其他维度。

正解点击率只是过程指标,不是结果指标。实验组点击率上升,可能是标题党吸引了误点,用户进来后马上跳出(跳出率上升、停留时长下降);也可能是推荐内容更吸引人,用户点击后深度阅读(停留时长上升)。判断实验成败要看业务核心指标(如成交额、人均消费时长),更要用护栏指标排除副作用。点击率涨但退货率暴涨,这是典型的“寅吃卯粮”。一次可信的实验至少要考察主指标+护栏指标+辅助指标三个层次。

为何常见:点击率是最直观、最容易获得的指标,人天生倾向用简单指标替代复杂判断。但推荐系统的目标从来不是点击本身,而是长期的用户价值和平台健康度。

误区“p = 0.049,小过 0.05,太好了,新策略肯定有效!”我把 p 值的门槛当作生死线,过了线就觉得结果绝对可靠。

正解p 值只是“在原假设为真的情况下,观察到当前数据或更极端数据的概率”,它不代表“新策略有效的概率”。p = 0.049 和 p = 0.051 的差别其实微乎其微,不应该因为踩在门槛两侧就做出截然不同的决策。更稳健的做法是同时报告置信区间:如果 95% 置信区间 [0.1%, 2.3%] 下限大于 0,才说明效果“实际上”也显著。还要警惕多重比较问题——如果你同时看了 20 个指标,纯靠运气就会出现一个 p < 0.05 的“假阳性”。

为何常见:教育体系中二分法的思维惯性(及格/不及格、通过/不通过)让人习惯性地把 p=0.05 当作一堵墙。但统计学是连续的,阈值只是人为约定的参考线,不是物理定律。

面试题

Q1. 在AB实验中,为什么需要对用户进行随机分组?

单选题 · mid

  • A.为了确保两组用户数量完全相等
  • B.为了让两组用户在各项特征上统计等价← 正确答案
  • C.为了让实验组用户获得更好的体验
  • D.为了减少实验所需的样本总量

答案:B。随机分组的目的是让两组用户在已知和未知的所有特征上,通过大数定律实现统计等价。这样实验结束时两组指标的差异才能归因于策略改动(内在效度),而不是用户组成的差异。A选项“数量相等”是表象,随机化追求的是特征分布均衡;C和D都不符合随机化的初衷。

Q2. 哈希分流算法(取模分组)相比完全随机分组的最大优势是什么?

单选题 · mid

  • A.使分组真正不可预测
  • B.保证同一用户始终进入同组← 正确答案
  • C.让实验组和对照组样本量绝对相等
  • D.免去计算样本量的步骤

答案:B。哈希分流的核心价值是“确定性”——同一 user_id 哈希后取模的结果永远不变,用户不会在多次访问中反复横跳,避免用户穿越导致的效果稀释。完全随机分流每次请求都独立掷骰子,用户可能这次在A组下次在B组,实验就被污染了。哈希不追求组间绝对相等(样本量是大致均衡),也不能省去样本量计算。

Q3. 关于AB实验中的护栏指标,下列说法正确的是?

单选题 · easy

  • A.护栏指标是实验成功的第一判据
  • B.护栏指标用于监控实验是否带来副作用← 正确答案
  • C.护栏指标越多越好
  • D.护栏指标超过10个才算完善

答案:B。护栏指标是安全气囊,用来监控策略改动是否带来用户体验、生态健康等方面的副作用(如退出率激增、投诉率上升)。主指标才是第一判据,护栏指标起否决作用。护栏指标并非越多越好,要选择与业务风险强相关的少数关键指标,否则会陷入“指标森林”中无法决策。

Q4. 某实验的 p 值为 0.03,置信区间为 [0.2%, 3.8%],以下解读最合理的是?

单选题 · mid

  • A.新策略有 97% 的概率优于旧策略
  • B.新策略效果一定在 0.2% 到 3.8% 之间
  • C.在 95% 置信水平下,新策略效果显著为正← 正确答案
  • D.实验至少能带来 3.8% 的提升

答案:C。p=0.03<0.05 且置信区间下限 0.2% 大于 0,说明在 95% 置信水平下可以拒绝“无差异”的原假设,认为新策略带来的提升显著为正。A选项混淆了 p 值的含义——p 值不是“策略有效的概率”;B选项过度确定,95% 置信区间是“有 95% 的把握真实值落在这个区间”,不是绝对保证;D选项说的是区间上限而非保底值。

Q5. 以下哪些情况可能导致AB实验结论被污染?

多选题 · hard

  • A.实验期间系统进行了一次大规模推荐模型升级← 正确答案
  • B.用户在手机和电脑两个端登录,被分到不同实验组← 正确答案
  • C.实验组用户对新产品产生新奇感,短期内点击率虚高← 正确答案
  • D.实验组和对照组的样本量不相同

答案:ABC。A选项是“共时性干扰”——实验期间其他策略也在变,无法把指标变化唯一归因于本实验;B选项是“用户穿越”——同一用户在两端落入不同组,策略被混合暴露;C选项是“新奇效应”,虚高的指标会在新鲜感消退后回落。D选项样本量不相同本身不会污染实验——随机化本来就不保证绝对相等,统计检验方法(如z检验)已经能处理不等的样本量。

Q6. 关于辛普森悖论,下列说法不正确的是?

单选题 · mid

  • A.分组内部都占优,汇总后可能反而落后
  • B.产生的原因是分组样本比例失衡
  • C.只能通过增大样本量来消除← 正确答案
  • D.处理方式之一是分层分析

答案:C。辛普森悖论的根源是各组(如高活跃/低活跃用户)在对照组和实验组中的占比不一致,导致汇总数据失真。增大样本量不会让比例失衡自动消失——随机化失败或样本偏差需要靠分层分析(分别看各子群的指标)、加权校正等方法来处理。C选项不正确,因为样本量增大只是让估计更精确,并不会修复分组比例的结构性失衡。

Q7. AB实验的“预跑期”(A/A实验期)主要目的是什么?

单选题 · easy

  • A.让实验组用户提前适应新策略
  • B.验证分流系统的分组是否均匀无偏← 正确答案
  • C.让新策略的效果充分显现
  • D.收集对照组数据作为历史基准

答案:B。预跑期通常指实验启动初期的一段观察期,此时实验组和对照组都使用相同的旧策略(A/A状态),数据用于验证分流是否均匀——比如检查两组用户的点击率基线是否差异较大。如果 A/A 期就出现显著性差异,说明分流系统存在偏置,需要排查哈希算法或流量分配逻辑。B就是核心目的。A错在预跑期没有让用户适应新策略;C和D不是预跑期的目的。

Q8. 关于实验互斥与正交设计,下列说法正确的有?

多选题 · mid

  • A.同一层内的实验必须互斥,不同层的实验可以正交← 正确答案
  • B.正交设计允许两个实验共享同一批用户流量← 正确答案
  • C.互斥设计的目的是避免策略叠加导致效果无法归因← 正确答案
  • D.正交实验会减少每个实验可用的样本量

答案:ABC。层内互斥保证一个用户在一个层内最多参与一个实验,避免策略叠加;层间正交让用户同时参与多个层的实验但效果评估互不干扰;正交设计通过“复制流量”(把全量用户复制成多个域)实现,两个正交实验各自拥有“完整”的 100% 流量,而不是各分 50%,所以 D 选项错误。互斥实验则是在同一层内瓜分流量,确实会减少每个实验的样本量。

Q9. 实验功效(Power)的含义是?

单选题 · hard

  • A.在原假设为真时,正确接受原假设的概率
  • B.在备择假设为真时,正确拒绝原假设的概率← 正确答案
  • C.实验组的点击率与对照组之差
  • D.实验可以检测到的最小效应值

答案:B。统计功效是“当策略确实有效时,实验能检测出这种效果的概率”。功效 = 1 - β,其中 β 是第二类错误(假阴性)概率。通常要求功效不低于 80%,即如果新策略真的能带来最小可检测效应对应的收益,实验有 80% 的把握发现它。A选项是第一类错误的反面(1-α),C是效应大小,D是最小可检测效应(MDE),三者都不是功效的定义。

Q10. 关于AB实验在推荐系统中的作用,最准确的描述是?

单选题 · easy

  • A.AB实验可以解释策略为什么有效
  • B.AB实验是验证策略改动因果效果的黄金标准← 正确答案
  • C.AB实验可以完全替代离线评估
  • D.AB实验适用于所有推荐策略的验证

答案:B。AB实验通过随机分组控制混淆变量,使得两组指标差异可以因果性地归因于策略改动,因此被称为“黄金标准”。但它主要回答“是否有效”,不能解释“为什么有效”(那是辅助指标和归因分析的工作);它也不能完全替代离线评估——离线评估成本低速度快,适合做初筛;某些场景(如全局性系统改动无法分流)AB实验并不适用,需要准实验设计。