Title: 核心概念 Locale: zh URL: https://sensorswave.com/docs/experiments/core-concepts/ Description: 深入理解 A/B 实验的工作原理和核心概念 深入理解 A/B 实验的核心概念,有助于您设计更科学的实验、正确解读实验结果,并避免常见的陷阱。本文将详细介绍实验的基本组成、分流机制、曝光日志和实验状态。 ## 实验的基本组成 一个完整的 A/B 实验包含以下核心元素: ### 实验标识 **实验 Key**(Experiment Key): - 代码中使用的唯一标识符 - 命名规范:使用下划线连接,例如 `cart_button_color_test` - 一旦创建不可修改,保持稳定性 **显示名称**: - 控制台显示的友好名称,例如"购物车按钮颜色实验" - 可以随时修改,不影响代码 **描述**: - 实验的详细说明,包括背景、目的、预期效果 - 帮助团队成员快速了解实验内容 ### 假设 明确的实验假设是科学实验的基础: **好的假设示例**: - "红色按钮比蓝色按钮能提升 10% 的点击率" - "简化为 3 步的结账流程能将支付转化率从 20% 提升到 25%" - "深度学习推荐算法比协同过滤算法的点击率高 15%" **差的假设示例**: - "红色按钮更好"(缺少量化指标) - "新流程能提升转化率"(没有具体提升幅度) - "用户更喜欢新设计"(难以衡量) ### 变体组 变体是实验中的不同方案,通常包括: **对照组**(Control Group): - 当前使用的方案,作为基准 - 通常命名为 `control` - 用于对比实验组的效果 **实验组**(Treatment Group): - 新的方案,需要验证的版本 - 可以有一个或多个实验组 - 通常命名为 `treatment`、`treatment_v2` 等 **多变体实验示例**: ``` 定价策略实验: - 对照组 (control):¥299 - 实验组 A (treatment_a):¥249 - 实验组 B (treatment_b):¥199 ``` ### 流量分配 流量分配决定每个变体获得多少用户流量: **双变体实验**: ``` 对照组:50% 实验组:50% ``` **多变体实验**: ``` 对照组:34% 实验组 A:33% 实验组 B:33% ``` **保守策略**(新功能风险较高时): ``` 对照组:70% 实验组:30% ``` --- ## 分流机制 分流机制决定了如何将用户分配到不同的变体,这是 A/B 实验的核心。 ### 分流 ID Sensors Wave 支持两种分流 ID: #### Login ID(登录 ID) **定义**:用户登录后的唯一标识符,通常是业务系统中的用户主键。 **特点**: - 跨设备一致:同一用户在不同设备上看到相同的变体 - 长期稳定:用户注销再登录,依然看到相同的变体 - 适用场景:需要用户登录的应用(电商、SaaS、社交等) **示例**: - 用户 ID:`user_12345` - 自定义账号名:`zhangsan` **推荐使用**:对于需要用户登录的产品,优先使用 Login ID 分流,确保用户体验一致。 #### Anonymous ID(匿名 ID) **定义**:标识用户设备或浏览器的唯一 ID,在用户首次访问时由 SDK 自动生成。 **特点**: - 设备级别:标识单个设备或浏览器 - SDK 自动管理:无需手动设置 - 清除数据后重新生成:用户清除 Cookie 或应用数据后,会生成新的匿名 ID **存储方式**: - Web:存储在 Cookie 中 - iOS:存储在 KeyChain 或生成 UUID - Android:使用 Android ID 或生成 UUID **适用场景**: - 未登录用户 - 公开网站或内容平台 - 落地页测试 #### 混合策略 对于既有登录用户又有匿名用户的应用,Sensors Wave 自动采用混合策略: - **已登录用户**:使用 Login ID 分流 - **未登录用户**:使用 Anonymous ID 分流 - **登录前后**:用户登录后,实验分配可能会改变(从基于 Anonymous ID 的分配切换到基于 Login ID 的分配) **注意**:为了避免用户登录前后看到不同的实验变体,建议在重要实验中只对已登录用户进行分流。 ### 分流算法 Sensors Wave 使用稳定哈希算法进行分流: ``` 变体索引 = hash(user_id + experiment_key) % 100 ``` **算法特点**: 1. **稳定性**:同一用户在同一实验中,无论何时访问,都会分配到相同的变体 2. **均匀性**:流量在各变体之间均匀分布 3. **独立性**:不同实验的分流相互独立,同一用户在不同实验中可能分配到不同的变体 **分流示例**: ``` 用户 A (user_001) 在实验 cart_button_color_test 中: hash("user_001" + "cart_button_color_test") % 100 = 23 23 = 50,分配到实验组 ``` ### 流量粘性 **定义**:用户一旦被分配到某个变体,在实验期间会一直保持在该变体中,即使实验配置发生变化。 **重要性**: - 确保用户体验一致,避免混乱 - 保证实验结果的可靠性 - 防止同一用户多次切换变体影响数据 **注意事项**: - 实验运行期间,不要修改流量分配比例 - 如果必须修改,建议停止当前实验,创建新实验 --- ## 曝光日志($ABImpress) 曝光日志记录用户命中实验的信息,是实验分析的基础数据。 ### 自动记录 SDK 在以下情况自动记录 `$ABImpress` 事件: **JavaScript SDK**: ```javascript // 调用 getExperiment 或 checkFeatureGate 时自动记录 const experiment = await SensorsWave.getExperiment('experiment_key'); // SDK 自动记录 $ABImpress 事件 ``` **Go SDK**: ```go // GetExperiment 自动记录曝光日志 result, err := client.GetExperiment(user, "experiment_key") // SDK 会自动记录 $ABImpress 事件 ``` ### 曝光去重 **机制**:同一用户同一实验只记录一次曝光。 **实现方式**: - SDK 在本地缓存已曝光的实验 - 重复调用 `getExperiment` 不会重复记录曝光 **示例**: ```javascript // 第一次调用:记录曝光 const exp1 = await SensorsWave.getExperiment('experiment_key'); // 第二次调用:不记录曝光(已去重) const exp2 = await SensorsWave.getExperiment('experiment_key'); // 用户刷新页面后再次调用:不记录曝光(已去重) const exp3 = await SensorsWave.getExperiment('experiment_key'); ``` ### 曝光属性 `$ABImpress` 事件包含以下属性: ```javascript { event: "$ABImpress", properties: { experiment_key: "cart_button_color_test", // 实验标识 experiment_name: "购物车按钮颜色实验", // 实验显示名称 variant: "treatment", // 分配的变体 // 用户属性快照(实验分流时的用户属性) $os: "iOS", $browser: "Safari", $city: "北京", // ... }, distinct_id: "user_12345", time: "2026-01-29 10:30:00" } ``` ### 曝光 vs 转化 **曝光**:用户被分配到实验变体,看到了实验内容。 **转化**:用户在实验中完成了目标行为(如点击按钮、完成支付)。 **转化率计算**: ``` 转化率 = 转化用户数 / 曝光用户数 ``` --- ## 实验状态 实验在生命周期中会经历以下 6 个状态: ### 草稿(DRAFT) **特点**: - 实验已创建但未发布,可反复修改配置 - 可以调整变体、流量分配等所有设置 - 代码中无法获取实验配置 **操作**: - 修改实验配置 - 进入调试模式 - 发布实验 - 删除实验 ### 调试(DEBUG) **特点**: - 用于测试环境验证,仅特定测试用户可见 - 可以验证实验配置是否正确、变体展示是否符合预期 - 正式用户不受影响 **操作**: - 返回草稿继续修改 - 确认无误后发布实验 ### 运行中(RUNNING) **特点**: - 实验正式上线,正在收集数据并进行分流 - 代码中可以获取实验配置 - SDK 自动记录曝光日志 **操作**: - 查看实验数据 - 发布优胜方案(进入 RELEASED 状态) - 手动结束实验(进入 FINISHED 状态) **注意事项**: - 实验运行期间,尽量不要修改流量分配或变量值 - 如果必须修改,建议停止当前实验,创建新实验 ### 已发布(RELEASED) **特点**: - 实验达到预期目标后,全量应用选定的优胜变体 - 所有用户都将看到优胜方案,不再进行分流 - 保留实验数据供回顾分析 **操作**: - 查看实验结果 - 删除实验 **后续工作**: - 更新代码,将优胜方案固化为默认实现 - 移除实验判断逻辑 ### 已结束(FINISHED) **特点**: - 实验手动结束,不再收集新数据 - 代码中无法获取实验配置(返回默认值) - 保留数据用于回顾 **操作**: - 查看实验结果 - 导出实验报告 - 删除实验 ### 已删除(DELETED) **特点**: - 实验被标记删除,不再显示在活跃列表中 - 实验配置和数据可能仍在系统中保留一段时间 - 代码中无法获取实验配置 --- ## 实验生命周期示意图 ``` 新建实验 ↓ [DRAFT] ←→ [DEBUG] ↓ [RUNNING] ↓ [RELEASED] (应用优胜方案) 或 [FINISHED] (手动结束) ↓ [DELETED] ``` --- ## 常见问题 ### Q:用户每次访问都会分配到不同的变体吗? **A**:不会。Sensors Wave 使用稳定哈希算法,确保同一用户在同一实验中始终分配到相同的变体。这是流量粘性的体现。 ### Q:用户登录前后看到的实验变体会变化吗? **A**:可能会。如果用户登录前使用 Anonymous ID 分流,登录后切换到 Login ID 分流,分配的变体可能会改变。建议在重要实验中只对已登录用户进行分流。 ### Q:同一用户可以同时参与多个实验吗? **A**:可以。不同实验的分流是独立的,同一用户可以在实验 A 中分配到对照组,在实验 B 中分配到实验组。 ### Q:实验运行期间可以修改流量分配吗? **A**:不建议。修改流量分配会影响已分配用户的变体,破坏流量粘性,导致实验结果不可靠。如果必须修改,建议停止当前实验,创建新实验。 ### Q:曝光日志为什么没有记录? **A**:检查以下几点: - SDK 是否开启了 A/B 测试功能(`enableAB: true`) - 实验是否已发布(状态为"运行中") - 用户是否满足实验的定向条件 - 是否已经记录过曝光(曝光去重机制) --- ## 相关文档 - [A/B 实验概述](overview.mdx):了解 A/B 实验的价值和核心能力 - [快速开始](quick-start.mdx):20 分钟完成第一个实验 - [实验设计](experiment-design.mdx):学习如何设计科学严谨的实验 - [分流策略](targeting-and-allocation.mdx):深入理解分流机制 --- **最后更新时间**:2026 年 1 月 29 日