设计 A/B 测试平台
需求
设计公司级 A/B 测试平台,支持:
- 同时运行 50+ 实验,互不干扰
- 分钟级指标更新
- 自动显著性检验和报告生成
架构设计
核心模块
| 模块 | 功能 | 技术方案 |
|---|---|---|
| 实验管理 | 创建/配置/上下线实验 | Web 管理后台 + 配置中心 |
| 分流引擎 | 用户分桶、流量分配 | hash(user_id + experiment_id) % 100 |
| 数据采集 | 行为埋点、事件收集 | Kafka + 埋点 SDK |
| 指标计算 | 实时/离线指标聚合 | Flink(实时) + Spark(离线) |
| 统计检验 | p 值、置信区间、MDE | Python 统计库 |
| 报告引擎 | 自动生成实验报告 | 模板引擎 + BI |
分流算法
import hashlib
def assign_bucket(user_id: str, experiment_id: str, total_buckets: int = 100) -> int:
"""确定性分流:同一用户在同一实验中始终进入同一桶"""
key = f"{user_id}_{experiment_id}"
hash_value = int(hashlib.md5(key.encode()).hexdigest(), 16)
return hash_value % total_buckets
def get_variant(user_id: str, experiment_config: dict) -> str:
"""根据流量分配返回实验组"""
bucket = assign_bucket(user_id, experiment_config['id'])
cumulative = 0
for variant, traffic_pct in experiment_config['variants'].items():
cumulative += traffic_pct
if bucket < cumulative:
return variant
return 'control'
多层实验
不同层的实验使用不同的 hash seed,实现正交分流,互不影响。
常见面试问题
Q1: 如何保证实验结果可信?
答案:
- SRM 检测(Sample Ratio Mismatch):检验各组样本量比例是否符合预期
- AA 测试:上线前先跑 AA 实验,验证指标无显著差异
- 多重比较矫正:多指标/多变体时用 Bonferroni 校正
- 最小实验周期:至少覆盖一个完整业务周期(通常 7-14 天)
- 新奇效应排除:前 1-2 天的数据可能不稳定,需排除
Q2: 实验指标如何设计?
答案:
| 指标类型 | 说明 | 示例 |
|---|---|---|
| 核心指标 | 实验想要提升的目标指标 | 转化率 |
| 护栏指标 | 不能恶化的底线指标 | 页面加载时间、用户留存 |
| 诊断指标 | 帮助理解原因的辅助指标 | 页面浏览量、按钮点击率 |