假设你是城市交通指挥中心的总指挥,面前的大屏上,密密麻麻的车辆在城市路网中流动。为了验证一条新修的立交桥匝道是否真的能缓解拥堵,你不会全体车辆直接试用,而是会做一个聪明又理性的动作:让一部分车辆继续走老路,另一部分车辆驶入新匝道,然后在同一段时间里比较两条路的平均通行时长。这个动作,就是一次在线实验;而支撑你完成这个动作的整套系统,就是在线实验平台。 不过,真实城市远比这个比喻复杂:同一辆车可能同时被多个改造项目选中,老路、新路、辅道的车流可能互相干扰。你必须建立统一导流岗亭、立交分层、稳定车牌识别等机制,才能让实验结论可信。这正是本篇文章要讲的核心——大型互联网公司如何为“同时进行的上千个实验”设计一套科学的流量分配架构,让每个实验都拿到干净、独立的样本,从而在数据治理与 MLOps 的链条上做出可靠决策。

岗位关联

学完本文,你将掌握在线实验平台的架构设计与流量分配方法论,理解分层正交、一致性哈希、样本量评估与 CUPED 等核心机制,能结合 MLOps 与数据治理场景评估实验设计,为算法决策提供可信依据。

目录
  1. 可视化演示
  2. 平台架构总览
  3. 流量分配原理
  4. 一致性哈希
  5. 分层与正交
  6. 实验单元划分
  7. 样本量评估
  8. 方差削减与护栏
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示在线实验平台架构设计的核心机制,通过基础/核心/应用/扩展四种模式展示关键概念与交互流程。

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

在线实验平台架构设计:在线实验 在线实验平台整体架构与核心模块 流量分配引擎与一致哈希分流机制 核心机制可视化 在线实验平台架构设计整体架构与关键组件

平台架构总览

城市交通指挥中心里,大屏上无数车辆汇成流动的车河。指挥员眼前的每一个道路改造,都像一次“道路手术”:为了让新铺的柏油路被客观评价,他就把车辆分成两股,一股继续走老路、一股走新路,最后对比两股车流的平均耗时。这个动作,就叫一个在线实验。

互联网平台的“新路”可能是首页改版、推荐算法换新、价格策略调整。科学验证需要实验,而实验需要先回答三个问题:让哪些用户进来?进来后分到哪个组?最后怎么算结果?对应到系统里,就是接入、分流、分析三件事。而承载这三件事的系统,就是在线实验平台。

在线实验平台通常由四层组成。接入层负责接收用户请求并把 user_id 传给分流器;分流器按实验配置把用户切进不同实验组;实验层承载具体业务逻辑;数据层通过埋点把行为事件落到数仓,再交给分析引擎计算显著性。这层“从埋点到报表”的数据链路,正是数据可信层的职责——保证流量标签和行为数据可信,分析结果才敢用于决策。

指挥中心要先画好“哪些车走哪条路”的流量地图,实验平台则用配置中心定义这个地图。地图下发后,导流岗亭(分流器)才开始工作——下一节,我们看看它怎么认车。

Q桶=Q全量×traffic_ratio×treat_ratio\displaystyle Q_{\text{桶}} = Q_{\text{全量}} \times \text{traffic\_ratio} \times \text{treat\_ratio}
一句话:最终进入实验桶的用户数,等于全量流量乘以实验流量占比,再乘以实验组占比。
  1. 全量流量平台在某段时间内进入实验分流的全部用户,相当于所有被观察的车辆。
    Q全量Q_{\text{全量}}
  2. 实验流量比例实验配置的 traffic_ratio,表示只有这么多比例的用户会进入本实验。
    traffic_ratio\text{traffic\_ratio}
  3. 实验组比例实验内部再把流量按 treat_ratio 分出一部分作为实验组,通常是一半。
    treat_ratio\text{treat\_ratio}
  4. 结果三项相乘得到最终进入实验桶的用户数,控制台按这个数去划桶。
    Q桶=Q实验×treat_ratioQ_{\text{桶}} = Q_{\text{实验}} \times \text{treat\_ratio}

流量分配原理

立交桥入口处,岗亭里有一面巨大的分格墙,墙上有一万个小格子。每来一辆车,收费员盯着车牌号心算几秒,就把车引向“实验车道”或“常规车道”。奇怪的是:同一辆车,今天来、明天来,都被引去同一个格子。收费员不是抽签,也不是看心情,他靠的是一套固定的心算规则。

这个“心算”在系统里叫哈希函数(hash)。它把 user_id 这样的长标识,映射成一个落在 0~9999 之间的整数。这一万个整数就是一万个桶(bucket)。配置实验时,实验管理员说“给我 20% 流量”,分流器就把 0~1999 号桶划给这个实验,其余 2000~9999 号桶里的用户与本次实验无关。

实际分流时会引入 salt(盐值)。同一个 user_id 在不同实验使用不同 salt,得到的桶号看起来完全不同,这正是不同实验能互不干扰使用同一批用户的前提。流量分配的核心运算可以概括为“桶比较”:先算出用户命中的桶号,再和配置阈值比较,决定他进入实验组还是对照组。

岗亭的“心算规则”是死的、稳定的,管理员改的只是“划多少桶给实验”,所以流量调整就像在分格墙上挪一道栅栏,简单又可解释。不过,要理解为什么不同实验互不打架,还需要看盐值背后的“一致性”秘密。

桶号=hash(user_id, salt) mod 10000,进入实验  ⟺  桶号<r×10000\displaystyle \text{桶号} = \text{hash}(\text{user\_id},\ \text{salt}) \bmod 10000, \qquad \text{进入实验} \iff \text{桶号} < r \times 10000
一句话:把用户哈希成 0~9999 的桶号,再拿桶号与流量阈值比一比,就能稳定决定他进入哪个组。
  1. 哈希函数把任意长度的 user_id 压缩成一个“看起来随机”的整数,这是分桶的第一步。
    hash(user_id, salt)\text{hash}(\text{user\_id},\ \text{salt})
  2. 取模对 10000 取余,保证桶号永远落在 0 到 9999,对应墙上一万个格子。
     mod  10000\bmod\ 10000
  3. 阈值比较流量比例 r 映射成阈值 r×10000,例如 20% 对应 2000。
    r×10000r \times 10000
  4. 分组判定若桶号小于阈值,用户进入实验组;否则进入对照组。
    桶号<r×10000\text{桶号} < r \times 10000

一致性哈希

高架桥上有一个枢纽站,车辆在此进入不同匝道。枢纽站从不抓阄,它用的规则是:车牌号加上当天的计划编号,通过固定算法算出出口。同一天内,车牌号不变,出口就永远不变。哪怕车辆来回跑十趟,都在同一条匝道进、同一条匝道出。

实验平台里的“固定算法”就是一致性哈希。一致性不是指“均匀映射”这么简单,而是指:当同一个用户反复请求时,只要实验配置没有变化,他每次都会被分到同一个实验组。这一特性对追踪用户长期转化至关重要——如果用户第一次请求在实验组、第二次请求跑到对照组,实验组里积累的点击、购买行为就不完整,指标计算必然失真。

生产的实现会在哈希前把 user_id 与 salt 拼接,salt 是实验或层级的唯一编号。一致性哈希有三个关键性质:确定性(相同输入必然相同输出)、均匀性(输出近似均匀分布)、盐变性(换一个 salt,输出彻底改变)。第三个性质直接支撑了分层正交的可行性——让不同层共享同一个用户时,分配结果互不相关。

枢纽站的规则让同一辆车的路径永远可预测,实验平台的一致性哈希则让同一个用户永远待在同一实验组。有了这个基础,多个实验才能“叠”在同一个用户身上互不干扰——这正是下一节分层正交的出发点。

分组(user_id, t1)=分组(user_id, t2),∀ t1≠t2\displaystyle \text{分组}(\text{user\_id},\ t_1) = \text{分组}(\text{user\_id},\ t_2), \quad \forall\, t_1 \neq t_2
一句话:同一用户无论何时来,只要配置不变,组别就不变——这就是“稳定命中”。
  1. 分组函数分流器内部把 user_id 与 salt 拼接后执行哈希,得到该次请求的组别。
    分组(user_id, t)\text{分组}(\text{user\_id},\ t)
  2. 两个时刻t₁ 与 t₂ 代表同一个用户的任意两次访问,标识本身没有改变。
    t1≠t2t_1 \neq t_2
  3. 稳定命中等式成立意味着多次请求结果恒定,这是长期转化指标可计算的前提。
    分组(user_id, t1)=分组(user_id, t2)\text{分组}(\text{user\_id},\ t_1) = \text{分组}(\text{user\_id},\ t_2)

分层与正交

立交桥把两条方向的车流叠在不同高度:上层跑快速路,下层跑辅道。一辆出租车同时出现在两层并不奇怪,因为“被上层摄像头识别”和“行驶在下层道路”是两件事。聪明的立交设计,让这两件事互不干扰、同时发生。

实验平台把流量按业务方向切分成若干层(Layer)。推荐方向一层、搜索方向一层、定价方向一层。同一个用户可以同时进入推荐层的某个实验和搜索层的某个实验,因为在两层中,他得到的“待遇”由各自独立的随机化决定。两层之间互不挤占流量、互不影响结论,这个性质叫做正交。

正交靠“每层独立随机化”实现:每一层使用独立 salt,用户在该层内的哈希结果均匀分布。由于层与层之间的哈希近似独立,用户进入推荐层实验 A 的概率与进入搜索层实验 B 的概率相乘,就得到同时进入两个实验的概率。更重要的是,每层都能拥有全量流量,实现了流量复用——不同业务不用互相抢 10% 的流量名额,而是各自在整条道路上做自己的实验。

立交桥之所以高效,是因为每一层都拥有全量车流且互不占用。工程上也要严格控制:同一层内不能并行多个未互斥的实验,否则同一用户可能被两个实验同时“改造”,造成干扰。接下来要回答一个问题:既然同一个用户能参与多个实验,那“一个用户”到底该怎么定义?

P(A∩B)=P(A)×P(B)\displaystyle P(A \cap B) = P(A) \times P(B)
一句话:两件独立的事同时发生的概率,等于各自概率的乘积。
  1. 单层概率P(A) 表示用户进入推荐层实验 A 的概率,它等于该实验分配的流量比例。
    P(A)P(A)
  2. 另一层概率P(B) 表示用户进入搜索层实验 B 的概率,它同样由该层配置决定。
    P(B)P(B)
  3. 独立乘积两层正交时,同时命中两实验的概率等于两个概率的乘积;若实测明显不等,说明两层存在干扰。
    P(A∩B)=P(A)×P(B)P(A \cap B) = P(A) \times P(B)

实验单元划分

统计路口通行时间时,如果一辆车的前轮和后轮被分别计时,同一个人的转弯时间会被拆成两半,数据必然乱成一团。所以指挥中心的规则是“一辆车只记一次”。实验平台也有同样的规则:一个随机单元只能属于一个组。

随机单元(randomization unit)是流量分配的原子单位。最常见的单元是用户(user_id)。以 user_id 为单元,意味着同一个用户无论访问多少次、换几个设备,永远落在同一个实验组里。这在分析转化率、留存率等身份级指标时尤为重要,因为用户的行为必须被完整归属于某一个组,不能被拆开。

有的场景会考虑 device_id 或 session_id 作为单元,例如纯客户端 UI 实验。但单元越细,越容易把同一个真实用户的多次行为分散到两侧,导致实验组被“稀释”——效果被污染。业界经验是优先选用户级单元;若必须使用设备级,就要在分析时做身份归因,并警惕同一用户多设备造成的交叉影响。每个用户都是独立的“车”,不要让他变成两个“车轮”。

“一辆车只记一次”保证了每个单元的行为数据完整。单元的大小决定了实验能观测到的灵敏度——用户太少看不清楚差异,用户太多又浪费流量。那么,多少用户才够?这就到了样本量评估的地盘。

Yi∼{实验组,概率 p对照组,概率 1−p,i=1,…,N\displaystyle Y_i \sim \begin{cases} \text{实验组}, & \text{概率}\ p \\ \text{对照组}, & \text{概率}\ 1-p \end{cases}, \quad i = 1,\dots,N
一句话:每个用户是一个独立随机单元,按概率 p 进入实验组,剩余概率进入对照组。
  1. 随机单元Yᵢ 代表第 i 个用户(或设备)最终被分配到的组别。
    YiY_i
  2. 实验组概率进入实验组的概率等于流量比例 p,例如 10% 流量则 p=0.1。
    pp
  3. 对照组概率其余 1-p 概率的用户自然落在对照组。
    1−p1-p

样本量评估

修一座新桥前,工程师要算清楚:要观测到早晚高峰平均车速提升 5%,需要统计多少辆车才不会被随机波动骗到?如果只记录十辆车,一辆车踩个刹车就可能让均值完全变样。观测的车太少,真实的提升会被淹没在噪声里。

这个“观测多少车”对应实验中的样本量。样本量不足,跑完一周也得不到显著结论;样本量过大,则浪费宝贵流量、拖长实验周期。行业用功效分析(power analysis)在实验上线前估算最小样本量,确保实验有足够的灵敏度捕获目标效果。

样本量由四个关键量决定:显著性水平 α(通常 0.05)、统计功效 1-β(通常 0.8)、指标方差 σ²、最小可检测提升 δ(也叫 MDE)。公式右侧每一项都对应一个直觉:要求越严格、噪声越大、想捕捉的效果越小,需要的样本就越多。

就像修桥要预留安全富余,样本量评估为实验准备了“能看清差异的观测长度”。不过,即使样本量算够了,指标本身的波动仍然可能太大。有没有办法不增加流量,就让实验更灵敏?CUPED 提供了一种借历史数据的巧劲。

n每组=2σ2(z1−α/2+z1−β)2δ2\displaystyle n_{\text{每组}} = \frac{2\sigma^{2}\left(z_{1-\alpha/2}+z_{1-\beta}\right)^{2}}{\delta^{2}}
一句话:所需样本量随方差和显著性要求变大,随可检测效应平方反比缩小。
  1. 显著性分位点z_{1-α/2} 与假阳性上限有关,α=0.05 时约为 1.96,对应 95% 置信度。
    z1−α/2z_{1-\alpha/2}
  2. 功效分位点z_{1-β} 与检验灵敏度有关,功效 0.8 时约为 0.84。
    z1−βz_{1-\beta}
  3. 方差合计2σ² 是实验组与对照组两组波动之和,波动越大越难看清楚差异。
    2σ22\sigma^{2}
  4. 最小提升δ² 是希望捕捉到的最小效果的平方;提升越小,需要样本越多。
    δ2\delta^{2}

方差削减与护栏

早高峰测速时,指挥中心发现当天恰好有半程马拉松占道,数据乱跳。聪明的做法是:用过去两周同一时段的平均车速做基准线,把今天的实测值减去“预测偏差”,剩下的波动就小多了。这个思路,正是 CUPED 的核心。

CUPED(Controlled-experiment Using Pre-Experiment Data,使用实验前数据的对照实验)是业界最常用的方差削减技术。它在实验上线前,用用户的历史指标(如历史点击率)作为协变量 X,对实验期的指标 Y 做线性校正,把与 X 相关的噪声剥掉,从而让实验组与对照组的差异更容易被检测出来。

CUPED 的估计量由两部分组成:实验期指标均值减去“历史偏差的加权”。权重 θ 是协变量 X 与结果 Y 的协方差除以 X 的方差,它刻画了历史表现与当前表现的关联强度。关联越强,削减的噪声越多,实验灵敏度越高;如果 X 与 Y 几乎不相关,则 θ 接近 0,CUPED 也就没什么效果。

实验平台还需要“防护罩”机制:指标抖动阈值、实时监控看板、自动熔断回滚。这些类比交通护栏与限速带——实验不是放开跑就完事,而是边跑边守着安全线。方差削减让实验更灵敏,护栏让推全更安全,两者一起支撑可靠的在线决策。

Y^cuped=Yˉ−θ(Xˉ−E[X]),θ=Cov(X,Y)Var(X)\displaystyle \hat{Y}_{\text{cuped}} = \bar{Y} - \theta\left(\bar{X} - E[X]\right), \qquad \theta = \frac{\mathrm{Cov}(X,Y)}{\mathrm{Var}(X)}
一句话:用历史表现校正当前均值,把与历史水平有关的噪声提前剥掉。
  1. 当前估计\bar{Y} 是实验期指标样本均值,例如实验组的平均点击率。
    Yˉ\bar{Y}
  2. 历史偏差\bar{X}-E[X] 表示这批用户历史表现与整体均值的差距。
    Xˉ−E[X]\bar{X} - E[X]
  3. 回归系数θ 是协方差与方差之比,衡量 X 对 Y 的预测能力。
    θ=Cov(X,Y)Var(X)\theta = \frac{\mathrm{Cov}(X,Y)}{\mathrm{Var}(X)}
  4. 校正结果从当前均值中减去加权历史偏差,得到方差更小的估计量。
    Y^cuped=Yˉ−θ(Xˉ−E[X])\hat{Y}_{\text{cuped}} = \bar{Y} - \theta\left(\bar{X} - E[X]\right)

AI 应用场景

推荐算法灰度上线

阶段:模型上线与评估(MLOps 生命周期)

解决的问题:新推荐模型直接全量上线风险极高,一旦效果劣化会影响所有用户。传统做法是离线评测一通过就上线,无法捕捉线上真实交互变化。实验平台通过分层流量分配,把新模型仅暴露给一小部分用户,线上 A/B 对照出真实效果后再决定是否推全。

具体案例:某内容平台准备将推荐模型 v2 上线,通过统一分流器把 20% 流量分配给实验组,对照组保留 v1,观察点击率、人均时长、留存率三个核心指标。两周后实验组点击率提升 1.2%,且无显著负向指标,平台才逐步把流量扩大到 50% 直至全量。

跨部门实验流量治理

阶段:数据治理与数据可信层

解决的问题:营销、推荐、搜索多个团队各自发实验,如果都从同一个流量池里随意切分,用户会被多个实验重复命中,结论互相污染。统一分流器配合分层正交架构,让每个业务拥有自己的层,各层独立随机化、互不挤占,从源头治理实验流量。

具体案例:某电商平台原来每个业务各切 10% 流量,结果营销实验和推荐实验在 1% 的用户身上重叠,两边的效果指标都出现异常。改造为八层正交架构后,每个业务在各自层内使用全量 100% 流量,重叠问题消失,实验评审效率提升三倍。

实验风险熔断与监控

阶段:实验上线监控与异常处理

解决的问题:实验上线后若出现严重负面指标(如投诉率飙升、核心转化骤降),人工发现往往滞后。通过防护罩机制设定护栏阈值,实时监控核心指标,一旦越过红线立即自动暂停实验并回滚配置。

具体案例:某金融 App 测试新的弹窗策略,实验上线两小时后投诉率超过护栏阈值 2 倍,平台自动暂停实验组流量,并把 70% 用户立刻切回对照组,避免负面体验扩散。故障复盘后,团队将弹窗样式调整,重新以小流量验证。

Python 演示

python80 行
import mathimport random  def consistent_hash(user_id, salt, buckets=10000):    # 模拟一致性哈希: 相同输入永远得到相同桶号    h = 7    s = "{}:{}".format(user_id, salt)    for ch in s:        h = (h * 31 + ord(ch)) % 100003    return h % buckets  class Experiment:    # 在线实验平台的单个实验, 负责流量分配与统计    def __init__(self, name, traffic_ratio, treat_ratio,                 control_conv, treat_conv):        self.name = name        self.traffic_ratio = traffic_ratio        self.treat_ratio = treat_ratio        self.control_conv = control_conv        self.treat_conv = treat_conv        self.control_cnt = 0        self.treat_cnt = 0        self.control_ok = 0        self.treat_ok = 0     def assign(self, user_id):        # 先判断用户是否进入本实验流量池        hit = consistent_hash(user_id, self.name + ":traffic")        if hit >= self.traffic_ratio * 10000:            return        # 再在实验内部按 treat_ratio 分到实验组或对照组        g = consistent_hash(user_id, self.name + ":group")        if g < self.treat_ratio * 10000:            self.treat_cnt += 1            if random.random() < self.treat_conv:                self.treat_ok += 1        else:            self.control_cnt += 1            if random.random() < self.control_conv:                self.control_ok += 1     def summary(self):        pa = self.control_ok / self.control_cnt if self.control_cnt else 0        pb = self.treat_ok / self.treat_cnt if self.treat_cnt else 0        se = math.sqrt(pa * (1 - pa) / self.control_cnt +                       pb * (1 - pb) / self.treat_cnt) if self.control_cnt and self.treat_cnt else 0        z = (pb - pa) / se if se else 0        return {            "control_conv": pa,            "treat_conv": pb,            "uplift": (pb - pa) / pa if pa else 0,            "z": z,            "n": self.control_cnt + self.treat_cnt,        }  def main():    random.seed(42)    exp = Experiment(        name="首页改版实验",        traffic_ratio=0.8,        treat_ratio=0.5,        control_conv=0.050,        treat_conv=0.055,    )    for uid in range(1, 20001):        exp.assign(uid)    r = exp.summary()    print("进入实验的用户数: {:,}".format(r["n"]))    print("对照组转化率: {:.4f}".format(r["control_conv"]))    print("实验组转化率: {:.4f}".format(r["treat_conv"]))    print("相对提升: {:.2f}%".format(r["uplift"] * 100))    print("z 统计量: {:.3f}".format(r["z"]))    print("结论:", "差异显著, 可推全" if abs(r["z"]) > 1.96 else "差异不显著, 继续观察")  if __name__ == "__main__":    main()
目的:模拟一个在线实验从流量分配到结论输出的完整流程,展示一致性哈希、流量比例控制与显著性检验。
  1. def consistent_hash(user_id, salt, buckets=10000):一致性哈希函数,相同 user_id + salt 永远返回同一个桶号。
  2. s = "{}:{}".format(user_id, salt)把用户标识与盐值拼接,保证不同实验使用不同随机序列。
  3. if hit >= self.traffic_ratio * 10000:流量占比由阈值决定,超过阈值的用户不进入实验。
  4. g = consistent_hash(user_id, self.name + ":group")实验内部再次哈希,完成实验组与对照组的正交划分。
  5. if random.random() < self.treat_conv:模拟实验组用户的真实转化行为,转化率由配置决定。
  6. z = (pb - pa) / se if se else 0计算 z 统计量,判断两组差异是否显著。

常见误区

误区用户一进平台就随机打标,想给哪个实验用就抽多少,感觉很方便。既然都是随机分组,为什么还要分层?

正解大量实验同时在跑,如果不分层,实验 A 和实验 B 会把同一个用户拉扯到不同组里,结论互相污染。平台必须用“分层 + 独立盐值”让不同实验各取所需,而不是把流量池搅成一锅粥。

为何常见:小团队实验少时看不到冲突,确实能运转;实验一多,层内互斥和跨层正交的问题立刻暴露。

误区多跑几天、多进点用户,结果肯定更可信,没必要做功效分析。反正实验时长都是产品定的。

正解样本量直接影响实验周期与流量成本;实验一直不显著,就一直占着流量,拖慢其他实验。提前计算最小样本量,才能确定最短可用的实验时长,快速做出推全或弃用的决策。

为何常见:直觉上 n 越大越好,忽略了“时间成本”和“流量成本”这两只看不见的手。

误区CUPED 用实验前的数据替换实验中的数据,这样就不用等新数据了,实验当天就能出结论。

正解CUPED 的估计量是 \bar{Y} - θ(\bar{X}-E[X]),只是用历史数据当协变量来“去噪”,最终还是以实验期数据为主体。如果 X 与 Y 相关性低,削减效果很有限,并不能缩短实验周期。

为何常见:名字里有“pre-experiment data”,容易让人误以为是直接用旧数据代替新数据。

误区用 device_id 做随机单元,样本切得更碎,单元数量更多,统计功效应该更强,结果也更精细。

正解若同一用户拥有手机、平板、网页三个设备,三个设备各自独立随机后可能落在不同组,用户被“切成两半”,转化、留存等身份级指标都会被污染。实验单元必须与分析单元保持一致,用户级指标必须用 user_id。

为何常见:只看到“粒度小 = 样本多”,忽视了“单元一致性”这一隐藏前提。

面试题

Q1. 在线实验中最常用的流量分配随机单元是哪一项?

单选题 · easy

  • A.后端服务节点
  • B.用户ID编号← 正确答案
  • C.数据库记录行
  • D.前端组件对象

答案:B。实验平台以“人头”为单位开展流量分配,因为转化、留存等指标都跟着用户走。后端节点、数据库记录、前端组件都不能代表真实的人,只有 user_id 能跨设备关联同一用户。就像立交桥只给“整车”发通行证,不让车轮单独过桥。

Q2. 统一分流器在实验平台中的核心职责是什么?

单选题 · easy

  • A.按实验配置分流用户到各实验组← 正确答案
  • B.把流量平分给所有后端服务实例
  • C.实时生成实验效果分析报表
  • D.自动修复线上系统运行故障

答案:A。分流器相当于交通指挥中心的导流岗亭,它根据 user_id、salt 和实验配置计算用户进入哪个实验的哪个组。负载均衡属于基础设施调度,报表是分析引擎的职责,故障修复更与实验分流无关。

Q3. 实验平台中“salt(盐值)”的主要作用是什么?

单选题 · easy

  • A.让不同实验使用互不干扰的随机序列← 正确答案
  • B.加密用户的登录密码和敏感信息
  • C.给每次用户请求打上时间戳标记
  • D.压缩实验日志的存储占用空间

答案:A。盐值拼接进哈希计算,使同一 user_id 在不同实验得到不同桶号,从而让两个实验分别随机化、互不干扰。这是分层正交的底层实现,与密码加密、时间戳、压缩存储都没有关系。它就像立交桥上不同层的路线编码,让同一辆车在每一层走完全不同的道。

Q4. 一致性哈希保证的核心性质是哪一项?

单选题 · mid

  • A.同一用户反复请求稳定进入同一实验组← 正确答案
  • B.不同用户必定进入完全不同的实验组
  • C.实验流量比例可以超过百分之一百
  • D.所有实验共享同一个分层流量池

答案:A。一致性哈希强调“确定性”:相同 user_id 加相同 salt,每次请求算出的桶号都一致,所以同一用户稳定在同一组。B 不成立,不同用户可能落入同一组;C 违反流量约束;D 分层共享没问题,但如果共享同一层又互斥,需要额外保护。

Q5. 分层正交实验中,同一用户进入推荐层实验 A 与搜索层实验 B 的概率应满足哪种关系?

单选题 · mid

  • A.P(A∩B)=P(A)+P(B)
  • B.P(A∩B)=P(A)×P(B)← 正确答案
  • C.P(A∩B)=P(A)-P(B)
  • D.P(A∩B)=P(A)÷P(B)

答案:B。两层独立随机化时,同时进入两个实验的概率等于各自概率的乘积。加法是“互斥事件”的关系,减法和除法没有概率含义。就像立交桥上、下层同时通车,两件事同时发生的概率就是各自发生率的乘积。

Q6. CUPED 方差削减最终是用什么指标进行实验判断的?

单选题 · mid

  • A.直接使用实验前的历史数据平均值
  • B.经协变量偏差校正后的实验期估计值← 正确答案
  • C.对照组指标直接外推到全量总体的结果
  • D.用户对实验版本的主观评分结果

答案:B。CUPED 的估计量是实验期均值减去加权历史偏差,它没有直接替换数据,而是借助历史协变量降低噪声。历史数据平均值本身不包含实验效果,外推和主观评分更不是 CUPED 的做法。

Q7. 功效分析中,其他条件不变,只把最小可检测提升 δ 从 2% 改到 1%,所需样本量会怎样变化?

单选题 · hard

  • A.大小保持不变
  • B.变为原来的两倍
  • C.变为原来的四倍← 正确答案
  • D.变为原来的一半

答案:C。样本量公式中 δ 以平方形式出现在分母,δ 减半后 δ² 变为原来的四分之一,所需样本量因此变为原来的四倍。这就像要用游标卡尺测更细的差异,就必须测量更多物件才能稳定分辨。

Q8. 哪些情况容易造成在线实验间互相污染?

多选题 · mid

  • A.两个实验共用同一层且未做互斥保护← 正确答案
  • B.不同层使用不同盐值分别做哈希分配
  • C.同一用户的多个设备被不同设备ID分到不同组← 正确答案
  • D.实验单元统一采用 user_id 进行稳定分配

答案:AC。A 中同层未互斥时,用户可能同时进入两个实验,效果无法归因;C 中用户跨设备被切分,身份级指标被污染。B 和 D 都是防止污染的正确做法,相当于立交桥的分层隔离与车牌统一识别。

Q9. 在线实验平台中,以下哪些属于核心组件?

多选题 · mid

  • A.实验配置中心← 正确答案
  • B.统一分流器← 正确答案
  • C.埋点与数据管道← 正确答案
  • D.数据库索引优化器

答案:ABC。配置中心声明实验与参数,分流器执行用户分桶,埋点与数据管道把行为事件送到数仓,三者构成实验闭环的骨架。数据库索引优化器与实验平台无关,它属于底层存储性能调优范畴。

Q10. 关于样本量评估公式,以下说法正确的有哪些?

多选题 · hard

  • A.指标方差越大,所需样本量越大← 正确答案
  • B.想捕捉的提升效果越小,所需样本量越大← 正确答案
  • C.显著性水平要求越高,所需样本量越大← 正确答案
  • D.统计功效要求越高,所需样本量越大← 正确答案

答案:ABCD。公式 n=2σ²(z₁₋α/₂+z₁₋β)²/δ² 中,σ² 位于分子,δ² 位于分母,z 分位数随显著性提高与功效提高而增大,所以四项全部正确。这就像把测量精度的每个旋钮都拧得更严,需要的观测自然更多。