Skip to content
返回分析与实验

变体创建

构建处理变体和分配机制,使用户见一致体验且实验与其他变更隔离

为什么

用户导航时在对照和处理间闪烁的变体摧毁实验。若用户在落地页见新 CTA 在结账页见旧 CTA,其行为是两条件混合,结果不可解。分配机—用户如何被放对照或处—正防此。它须粘(同用户每次页浏览得同变体)、一致(分配会话中不变)、隔离(变体代码在开关后故不影响不在实验的用户)。弄错此是微妙的:经共享组件漏入对照桶的变体、每次请求重随的分配、开关服务宕时默认处理的开—每个都静腐实验并产看似显著但测的—bug 的结果

何时使用

设计登记后、流量暴露前。变体代码和分配机制先在 staging 构建并测试

如何做

1. 把变更放功能开关后:if (flagService.get("cta-color-blue", userId)) { 渲染" } else { 渲染" }
2. 分配实现为确定性哈希:bucket = hash(userId + experimentId) % 100;treatment = bucket < 50。此粘(同用—-> 同桶)且可复—3. 用真功能开关服务(LaunchDarkly、Statsig、GrowthBook)或共享内部 —勿滚每实验分配逻辑,因跨实验不一—4. 确保变体代码隔离:处理分支不应与对照分支共享可变状态,处理用户永不应见对照 UI(无"先灰后蓝—5. —staging 测分配:验已—userId 映预期桶、桶跨请求稳、禁开关返所有用户对—6. 加回退:开关服务不可达时默认对照(非处理)—因开关服务宕而上功能是最糟事—7. 埋暴露:首次页浏览记 "experiment_exposure" 事件—experiment_id、variant、user_id —此为所有实验指标分—8. —staging QA 变体:人点过处理流验变更在、一致、不破他页(回归检查)

示例

// assignment.ts —共享实验分配
import { hash } from "./hash";

export function getVariant(
  experimentId: string,
  userId: string,
  trafficSplit: number = 0.5,
): "control" | "treatment" {
  const bucket = hash(userId + experimentId) % 100;
  return bucket < trafficSplit * 100 ? "treatment" : "control";
}

// cta.tsx —开关后变体
import { getVariant } from "./assignment";
import { flagService } from "./flags";

export function CheckoutCta({ userId }: { userId: string }) {
  // 开关服务宕时回退对照
  const flagOn = flagService.get("cta-color-blue", userId, false);
  if (!flagOn) return <GreyCta />;
  const variant = getVariant("cta-color-blue-447", userId);
  return variant === "treatment" ? <BlueCta /> : <GreyCta />;
}

// 暴露事件(每用户每实验记一次)
useEffect(() => {
  if (!exposureLogged) {
    analytics.track("experiment_exposure", {
      experiment_id: "cta-color-blue-447",
      variant: getVariant("cta-color-blue-447", userId),
      user_id: userId,
    });
    setExposureLogged(true);
  }
}, []);

// Staging QA 清单—// [x] user_001 -> —23 -> 处理(蓝 CTA—// [x] user_002 -> —67 -> 对照(灰 CTA—// [x] user_001 —5 —-> 仍处理(粘)
// [x] 开关禁 -> 所有用户见灰(回退—// [x] 开关服务杀 -> 所有用户见灰(回退—// [x] 任何页无先灰后蓝闪

常见问题

  • ⚠每次请求重随而非粘分—用户—1 见对照页 2 见处理,行为混合,结果测无物;此为最常见分配 bug 且仪表盘不可见
  • ⚠开关服务宕时默认处—开关服务宕把功能上—100% 用户无对照桶,实验毁且无另部署无法回滚
  • ⚠变体代码漏入共享组件 —处理变在共享 Button 组件故对照用户在—Button 的页也见,对照桶被污
  • ⚠每次页浏览记暴露而非每用户一—分母膨胀、指标错、测试显比实际更—power,导致假显著

最佳实践

  • ✓—userId + experimentId 的确定性哈希分—此粘、可复现、无需数据库查故快且跨服务一致
  • ✓任一开关服务失败默认对—处理用户几分钟见对照的成本是测试略欠功效;所有用户见处理的成本是毁实验且潜在事故
  • ✓每用户每实验恰记一次暴露(实验范围首次页浏览)—此为每指标分母,错则测试每数错
  • ✓—staging 带清—QA 变体:刷跨粘、已知用户桶对、开关服务杀时回退工作、无视觉—清单 10 分钟且捕将腐 2 周测试的分配 bug