得物AB实验平台数据驱动决策实践

一、前言

随着互联网的普及和移动互联网的爆发式增长,在经历了多年的高速发展后,增长速度逐渐放缓,偶尔出现的新互联网红利也逐渐消失。企业在进入平稳期后,竞争模式逐渐转变为存量竞争,往往难以通过功能迭代产生明显的收益。因此,小步快走的模式越来越受到欢迎。当产品的用户量级达到较高水平,如上千万或上亿,即使对每个用户的收益微乎其微,由于边际成本较低,仍然能够带来可观的总收益。

由于客观世界的复杂性,在进行产品改动或策略调整后,很难将指标的增长或下降归因于这些改动。ABTest通过随机化的方式将线上用户划分为两组流量,分别对这两组同质流量应用对照策略(control)和实验策略(treatment),收集用户的行为数据并生成指标,然后通过统计分析方法对比分析实验组相对于对照组是否存在收益,并对其进行量化。

在得物,实验文化非常浓厚,渗透到了几乎所有业务域,通过AB实验来验证策略的有效性和收益已经像吃饭睡觉一样自然。每个月有成百上千个实验被创建或者完成决策结束或推全。

在支撑实验能够规模化运行的过程中,得物实验平台也面临了多方面包括稳定性、性能、准确性的挑战,本文将为你带来得物AB实验平台数据驱动决策的实践。

二、读者收益

了解AB实验平台的基本概念

了解得物AB实验平台的技术原理和实践

了解得物AB实验平台中的数据科学原理和实践

三、实验平台简介

实验是什么

01.jpg

AB实验的本质:先圈定一部分用户,将其随机分配到不同分组中,并为这些分组提供不同的方案,例如这张图中,一个组是黑色播放按钮,另一个组是橘色播放按钮。对线上用户应用不同策略后,收集这些用户最终的数据结果,例如转化率的差异。通过对比不同方案的数据结果,确定选用哪种最优方案。

实验有什么用

了解了实验是什么后,我们来探讨一下为什么要做实验。

让我们来看一个例子,小A是一名资深产品经理,有一天他突发奇想,设计了一个天才的优化方案,并已启动开发和测试。一个月后,搜索点击量暴跌,老板质问道:“你在做什么?”

没有AB实验
小A:一定是因为大学生开学了。
老板:?

有AB实验
小A:我将用户分为旧样式和新样式两部分,在开学季,新样式的用户搜索点击率始终比旧样式高出5个点。
老板:做的不错。

从这里可以看出,AB实验有两个关键用途,且呈递进关系,即归因和量化。通过归因,我们可以确认预期效果是否由我们的改动导致,这是定性评估;通过量化,我们可以确定这个改动究竟提升了多少效果,这是定量评估。

做一个实验的步骤

02.jpg

接下来,将简要介绍目前平台的实验流程:

确定目标:第一步需要确定目标,根据业务团队的不同定位,目标也有所区别。例如,交易团队可能更关注UV价值、AOV和购买转化率,而社区团队可能更关注社区使用时长和留存率等。

提出假设:在确定目标之后,针对想要优化的目标,我们需要提出一个假设,即要做什么事情才能达成预设的目标。在提出假设之后,我们要基于该假设去设计实验,包括实验的对照组策略、对照组标题字体大小、实验组标题字体大小、实验覆盖的用户范围、实验的调用时机等。设计完成后,需要在AB平台上创建实验。

设计实验:创建完成后,进入实验开发阶段。实验开发和测试完成后,即可上线。

收集数据:实验上线后,进行灰度发布,并收集一段时间的数据。同时,我们还需要收集实验组和对照组的使用数据,以便最终对比指标差异。

结果分析:数据收集完成后,我们对实验组和对照组之间的数据差异进行分析,判断差异是正向还是负向,是统计显著还是不显著。结合不同指标的结果,我们进行实验决策,判断实验是结束、下线还是重新迭代。

四、得物实验平台技术原理和实践

在介绍了实验平台的基本概念和流程之后,接下来将介绍得物AB实验平台的技术原理和实践。

我们首先介绍平台的整体架构,以便大家对其有个大致的了解,然后介绍目前的实验接入和使用方式。接下来,我们将介绍实验平台中两个非常核心的模块:分流引擎和数据引擎,包括所面临的挑战、解决方案以及后续的规划。

整体架构

03.jpg

整体架构分为四个模块,自上而下分别为实验中台、分流引擎、数据处理和数据分析展示。

实验中台是公司内部员工使用的交互页面,用于创建、配置、查看和分析实验。中台左下角的分流引擎是实验平台的核心基础设置,其作用是根据用户特征将其划分到不同分组,并确定每个分组的值。

分流引擎为客户端、服务端和H5等不同流量来源提供服务。客户端的实验命中上报会通过网关统一收集到日志平台,然后再由日志平台将数据传输到Kafka进行处理。而服务端和H5来源的实验上报则会直接同步到Kafka。

在完成线上用户分流后,为了分析实验结果,需要对用户数据进行采集、加工和处理,主要包括流式数据处理和批量日志处理。处理完成后,将数据导入OLAP数据库。

在数据收集完成后,用户可以在实验平台上选择指标和时间范围进行数据分析。提交请求后,数据引擎将执行数据查询。数据查询可以基于明细数据进行异步查询,也可以基于预计算的数据进行同步查询。查询结果将由统计引擎负责计算p值、显著性、涨跌幅和指标值等统计指标。最终,将统计结果进行数据可视化,以实验报告或Excel的形式展示出来。

接入方式

04.jpg

从流量来源上区分,主要存在四种实验类型:客户端实验、服务端实验、普通H5实验、落地页链接实验。

05.jpg

确定流量来源后,可根据具体需求选择合适的实验模式:是常规的正交流量实验,还是需要圈定人群进行实验,或者是否有上级的父实验。

通常,选择普通的正交实验即可。若存在与现有实验流量互斥的情况,可将其放在同一流量层中。对于黑白盒实验或者holdout实验,建议采用父子实验的模式。例如,营销黑白盒实验中的黑盒为无营销策略,白盒则为有营销策略。在此基础上,针对不同场景和用户,进行策略优化及迭代。此时,父实验即为黑白盒实验,子实验则继承白盒实验组。

06.jpg

接下来介绍实验数据分析的接入方式:

  • 平台指标分析

适用于官方标准指标,如留存率、DAU等需要在不同业务线统一口径和标准的指标。这类指标需向AB平台产品提需求进行独立建设。

  • 数据集分析

在业务发展过程中,北极星指标变化不频繁,但过程指标因组织架构、发展阶段、应用场景不同而多变且数量众多。为确保平台指标的权威性和标准,支持业务快速迭代,这类长尾指标将提给业务域对应分析师。分析师制作数据集并在AB平台配置数据集和指标定义,即可接入AB的数据分析进行即席查询和分析。
介绍完得物实验平台的接入方式后,我们来深入了解一下这个过程中的技术挑战和实验。

分流引擎实践

分流引擎是AB实验平台中最为重要的基础模块。分流作为AB系统的基石,只有进行分流之后,用户才能拥有不同的策略,进而进行后续的数据回收和分析。

从行业内公司的情况来看,部分公司的实验平台集成了分流能力和分析能力,而有些公司的实验平台则仅具备分流能力,分析工作由业务分析师自主完成。

毋庸置疑,保证实验分流的高效准确是实验平台的核心目标之一。

技术挑战

  • 高并发
    如何支撑下游60+服务的在线调用

  • 低RT
    如何保障足够低的RT,避免下游超时

  • 统计均匀性
    如何划分出用户数量均匀的分组

接下来,我将为大家介绍在分流引擎建设过程中遇到的挑战。分流引擎的作用是确定用户属于哪个实验分组,并尽量保证分出的两部分用户能够同质。在这个过程中,我们主要面临三方面的挑战:

  • 在线调用的并发量很高,如何避免上游调用导致服务过载?

  • 如何保障下游服务的低延时调用?

  • 如何在分流过程中保证统计均匀性?

解决方案

07.jpg

  • 配置分发:配置数据双写到MySQL和Zookeeper中,基于MQ提供配置变更通知

  • 配置加载:进行配置的订阅和解析,并缓存到内存中,方便直接在本地进行分流命中的计算

  • 规则计算:读取内存中的实验配置,进行实验相关的计算逻辑

  • 接入层:提供AB SDK作为0RT的实验分流解决方案,提供服务接口支持便捷接入和多语言应用

  • 保障体系:通过配置校验、均匀性、正交性检测,保障分流的正确性和均匀性

先来看一下整体分流引擎的架构。用户首先在AB的管理平台创建和配置实验,包括实验的基础信息、流量层的信息、具体的流量分配(分组数量、流量分配等),以及分组的参数值设置。

创建并上线后,这些配置会双写到对应的MySQL和Zookeeper中,然后通过MQ提供实验流量调整后的变更通知机制。

在初始化或接收变更通知时,分流引擎会从配置分发层读取数据,获取配置后进行解析并更新本地内存缓存。

在线分流调用过程中,基于用户信息和配置缓存进行实验规则的计算,包括客户端版本筛选、人群判定、分组命中计算、白名单计算、用户上报等。

在核心分流逻辑之上,提供了接入层,可以选择不同的接入方式,包括服务端、客户端、客户端SDK和服务端SDK。

为了保障分流系统的可用性和正确性,有监控告警的可观测体系,会对系统的成功率、RT进行监控,并检测配置内容的有效性。在可观测的基础上,还有应急降级手段,系统高负载时针对指定接口降级。此外,还会进行一些统计特性检测以确保Hash算法的均匀性和正交性。

接着我们再来看一下目前得物AB平台分流引擎的效果:

  • 14w+:日常的分流QPS峰值在10w+,大促期间峰值在14w+

  • 0ms:基于AB SDK,进行分流计算的耗时为微秒级,时延几乎可以忽略不计

  • 130us:基于AB Dubbo SDK,进行分流计算的耗时为130us

  • 30ms:对全量2000+客户端实验进行配置下发,耗时在30ms左右

分流过程示意图:

08.jpg

从上到下的过程即App流量的流入,具体用户的分流过程如下:首先进行第一次Hash,根据该用户对应的流量层来决定其命中的流量层中的哪个桶。实验在层中对应的桶范围是在实验配置流量时确定的,例如在本例中,实验配置了5%的流量,层分配给了实验0-4这五个桶。在确定具体命中的实验之后,会执行第二次Hash。第二次Hash的过程会使用相同的算法,但这两次的目的不同。第一次是确认用户是否命中实验,第二次则是确认该用户真正命中的分组,即命中了实验的哪个分组。

在这个过程中有如下三个保证统计均匀性的要点:

  • MurmurHash算法:基于Google MurmurHash3,单线程千万级QPS计算

  • 二次Hash过程:第一次Hash保证层间正交,第二次Hash保证层内前后实验正交

  • 统计特性检测:通过卡法拟合优度检验方法对Hash算法的均匀性和正交性进行检测

得物AB平台统计特性检测过程:

09.jpg

得物AB平台对实验进行了正交性的检测,我们对1000个线上真实实验进行了正交检测。真实使用的盐值是进行模拟分流,去看这1000个实验是否能够分的均匀,以及正交性的检测,正交性检测选取了200个的层,对层和层之间的真实盐值进行模拟分流,看每一层的实验是否能够均匀的被分配到另外一层的实验组和对照组中。

结果如下图所示:Hash分流的均匀性和正交性的检验结果p值分布和理想p值分布相差不大,可以认为得物AB平台的随机分流是均匀且正交的。

10.jpg

理想p值分布

11.jpg

均匀性检测结果

12.jpg

正交性检测结果

后续规划

稳定

  • 提升SDK配置稳定性:使用http长轮训配置服务替代ZooKeeper

  • 保障体系完善:进一步完善限流、熔断策略

效率

  • 问题排查效率提升:分流排查工具完善,快速分析分流结果和链路

  • 分流agent建设:提供sidecar形式的分流,降低SDK的升级成本

  • 流量控制能力增强:实验多参数、支持参数复用

场景化

  • 特征分流:基于用户特征进行实时分流,让用户分布尽可能均匀,适用于小样本下的实验分流

  • Holdout/Combo:团队化视角评估周期收益,探索业务之间的交互影响

智能化

  • MAB:流量自动调节

  • 自适应分流

数据引擎实践

技术挑战

复杂的实验分析体系
3种指标类型,3种分析方法,3种分析模式(常规/维度下钻/占比),2种实验周期,3种数据源

性能
支撑1000+指标,400+数据集,亿级别表关联、TB级数据查询分析

得物的实验分析体系较为复杂。由于历史原因,数据源分为三种,分别应用于同步和异步的查询场景,指标也分为四种类型,用于不同的口径。分析方法上支持Delta+t-test和t-test两种。分析模式上支持常规不带维度的普通查询、选择不同维度进行的下钻分析、选择维度之后进行的占比分析、在搜索场景下适用的类目均摊逻辑。根据分析的实验周期不同,AB平台支持实验开始前的preaa分析和常规的AB期分析。最后,在提供给用户的展现层上,有指标列表&趋势图、实验报告文档、Excel下载几类不同的功能形态。

除了分析体系的复杂性,数据规模本身也极具挑战,得物AB平台承载了上千的平台指标、数百的数据集,以及在做指标的非用户维度下转时,涉及到的左表和右表都是亿级别的表,数据量将近TB。保证常用查询条件能够秒级返回,并且复杂下钻分析要在几分钟之内完成分析结果的返回,在性能上是一个相当大的挑战。

13.jpg

解决方案

14.jpg

实验分析功能:为用户提供多种数据处理方式,如实验报告、Excel数据下载、实验指标列表、preaa分析等,以满足用户在实验结果汇报和深入分析等不同场景的需求。

统计分析引擎:在数据引擎查询的基础上,采用Delta方法、user+pt或用户去重等方式计算指标。在后续的实验科学部分,我们将重点介绍分析引擎的功能和应用。

在复杂的实验分析体系中,数据引擎负责处理各类复杂的数据查询。总体而言,数据引擎由数据生成、指标管理和数据查询引擎三部分组成。

数据生产:目前支持三种存储介质:ODPS、Starrocks和CK。其中,CK用于存储预计算指标数据,用户在页面上看到的数据大多来自于CK。Starrocks适用于复杂分析方法,能够实时计算并获取用户的明细数据,并在明细数据的基础上进行分析方法所需的数据聚合,其时效性为秒级到分钟级。ODPS适用于底表量级较大的特殊情况,对于无法在Starrocks上执行的查询会自动降级到ODPS,其时效性一般在10分钟到1小时。

指标管理:基于统一的指标管理,定义了各个指标的口径以及底表和数据集信息。

数据查询引擎:负责执行具体的查询任务,通过输入的指标和分析类型进行动态SQL模板适配,包括选择不同指标类型和分析场景的模板,拼接成完整的数据查询SQL。根据指标和场景的属性确定使用的数据源,在查询过程中会进行并发限制,以避免影响OLAP集群的稳定性。查询结果出来后,进行后置处理,并缓存到Redis上。

后续规划

稳定

  • 提升可观测性:查询耗时、成功率告警

  • 提升止血能力:限流、熔断、降级措施完善

  • 提升数据质量:SLA&DQC完善

性能

  • Colocate Join优化

  • SQL逻辑优化

  • count distinct优化

  • 联邦集群查询

效率

  • ClickHouse下云迁移到Starrocks,减少多技术栈维护成本

  • 自助指标生产流程:分析师或者数仓自助进行

成本

  • 业务域资源独立,成本拆分可衡量(想要更快?加钱就行)

得物实验平台中的数据科学

为什么需要做实验

我们在日常工作中,往往都是希望去做一些事情,比如说一些策略优化、产品优化能够去提升公司的核心指标,这些都需要因果关系来验证,也就是我们做了什么事情导致它发生提升,那么实验之所以能够论证因果关系,就是因为它控制变量来影响最终结果,从而确定变量和效果之间的因果关系。

实验决策

在介绍完实验论证因果关系的必要性后,我们来探讨一个实验决策的问题:为何不能仅根据实验组和对照组差异的正负就直接得出结论,而需要分析实验效果呢?例如,为何不能直接根据下图所示差值的正负来做出判断,而是还要参考统计显著性?

其核心原因在于数据的波动。由于实验组和对照组的用户是随机采样的两组不同用户,因此存在极端情况,即对照组只有一名男性用户,而实验组只有一名女性用户。在这种情况下,用户之间本身就存在一定的差异。因此,我们需要引入统计学方法来更科学地解释数据上的差异。

15.jpg

假设检验

在AB平台中的话,我们做出的原假设就是实验组的指标=对照组指标。根据原假设本身的正确性以及我们是否接受原假设,会有以下四种情况:

16.jpg

其中包括两种错误情况:

  • 第一类错误(弃真错误),可理解为实际上实验没有产生效果,但却被错误地判定为有效果。

通常用希腊字母α表示,在显著度为95%的情况下,即使实验没有采用任何策略,在单个指标上出现显著结果的概率仍有5%(在多个指标上出现显著结果的概率大于5%)。

  • 第二类错误(取伪错误),可理解为实际上实验产生了效果,但却被错误地判定为没有效果。

通常用希腊字母β表示,其大小取决于两个总体之间的差异量、样本量、方差以及显著性水平。样本量越大、差异量越大、方差越小、显著性水平越大,第二类错误率就越低,实验效果被检出的概率也就越大。

统计引擎实践

17.jpg

检验方法

18.jpg

第一类错误率优化

接下来,将介绍两种第一类错误率优化方法:preaa模拟分流和Delta方差修正。

我们以一个问题引出preaa模拟分流:“为什么我的实验还没有上策略,有的指标就显著了?”

如前文实验决策部分所述,第一类错误率本身有5%的概率,当指标数量足够多时,这个概率远不止5%。AB平台目前提供preaa模拟分流功能,它可以在实验开始前,用“场景的DAU”进行模拟分流,根据过去7/14天的指标表现,对实验流量分配进行优化。preaa模拟分流通过后(没有指标出现显著的情况)再开启实验,能够有效保障实验开启后指标的均匀性。

19.jpg

在AB平台上使用preaa校验的步骤如下:

  1. 新建一个preaa校验;
  2. 选择要进行preaa的实验;
  3. 选择页面;
  4. 选择分流方式;
  5. 计算时间周期;
  6. 选择要观测的目标。

通过以上步骤,我们可以得到对应的分流结果,并判断相应指标是否显著。

关于preaa的使用,有以下最佳实践:

  • 指标数量控制在1到10个之间。指标数量越多,选择难度越大,实验负责人也难以关注核心目标。根据第一类错误率5%计算,10个指标中,有40%的概率会出现一个指标显著。

  • 在无留存或低留存的情况下不太适用。preaa是基于时间前用户的表现来推测时间后的表现,如果用户在实验后不存在,即不存在前后关联关系,就无法用实验前的数据进行推导。例如,一些针对新用户的实验。

同样,我们通过另一个问题来引入Delta方差修正:“为什么我的实验很容易出现显著结果,而且有的指标呈现正向显著,有的指标呈现负向显著?”

在23年12月份,AB平台上线了Delta方法,用于修正被低估的方差,从而确定实验结果是否真的显著。

方差被低估的场景主要是在分析因子的粒度比分流因子更细的情况下。举个例子,我们通常基于UV(Unique Visitors,独立访客)进行分流,然后通过每个user_id来判断其所属的分组。然而,在分析时,我们是以PV(Page Views,页面访问量)或者以用户访问的天数计算多个样本。这样一来,对于不同的PV,它们可能来自于同一个用户,把它们当作独立的样本就会导致样本重复,从而低估方差。

20.jpg

我们可以看一下上面这个图,它描述的是方差被低估为何会导致第一类错误率偏高。图中橙色的曲线是指标实际的分布情况,绿色的两条竖线围起来的范围是95%的置信区间,超出左右竖线的部分属于统计显著区域。蓝色的曲线是低估方差后的曲线,相比于橙色曲线,蓝色曲线更尖。基于蓝色曲线圈定的95%置信区间即为蓝色的双竖线,左右两边的区域都会被判定为显著。由于实际分布是橙色曲线,所以可以看到紫色阴影这部分面积,在实际分布中并不显著,但会被我们判断为显著,这就是非预期的第一个错误。这样一来,指标出现显著的概率就会增加,超过5%。

21.jpg

再和大家分享一下Delta修正之后的优化效果。这是我们与数据分析团队共同完成的一个探索。使用Delta方法后,第一类错误率有着明显的降低。以得物AB平台的几个核心指标为例,第一类错误率UV价值从15.37%下降到4.63%,DAU均社区时长从23.74%下降到4.11%,推荐流去重pvctr从16.11%下降到4.63%。

目前,Delta实验方法已广泛应用于得物实验分析场景,实验覆盖度和指标覆盖度均超过90%。

第二类错误率优化

然后再简单介绍一下第二类错误率的优化。第二类错误:实验有效果但为什么还没有显著?出现第二类错误的原因是统计功效不够,导致统计功效不够的原因常见于:

  • 提升幅度过小

  • 样本量不足

  • 方差较大

关于提升幅度,往往取决于实验本身的效果,样本量可以通过实验流量比例控制,在事后的统计分析上可以通过方差缩减来有效提升统计功效。

在得物AB平台有两种方差缩减的方式:

  • 降噪

在平台选择降噪进行实验分析时,部分指标值会做异常值的盖帽处理,用户粒度的指标超出我们设定的阈值时就和阈值相等,这样能有效降低指标的异常值对整体实验效果的影响。

  • Cuped方法

这种方法还未进行产品化,只有线下的SOP流程。Cuped方法核心原理就是基于用户行为的相关性,使用实验前的数据调整实验周期内的指标,已经通过Cuped方法的测算效果,平台的核心指标如大盘UV价值、社区使用时长都有30%以上的方差缩减。

分析误区

正态性假设

第一个分析误区:关于正态性的假设。很多同学可能认为,在平台进行双样本t检验时,前提假设是指标本身服从正态分布。然而,这种说法是不正确的。双样本t检验的真正前提是实验指标的均值服从正态分布。

均值服从正态分布的理解:我们的实验组和对照组都是从大盘抽样的用户。对于每次抽样,我们都会计算人均指标,即均值。在实验效果评估中,我们评估的是实验组和对照组之间的均值差异是否显著。这与指标本身是否服从正态分布不同。假设我们进行成千上万次抽样,并将这些均值绘制为一个分布曲线。我们期望这个分布曲线趋近正态分布,只有在这种情况下,我们才能正确使用双样本t检验。

中心极限定理的应用:根据中心极限定理,只要样本量足够大,样本的均值分布会趋近于正态分布。

基于上面这两点,我们可以推断出只要样本量足够大,所有指标都可以使用双样本t检验。

样本量与正态分布的关系:

下面这张图展示了随着样本量的增加,大盘UV价值的均值逐渐趋近正态分布的趋势。

最右边的图是10万样本量的结果,可以看到黑色线条表示标准正态分布,蓝色线条表示大盘UV价值的分布。随着样本量逐渐增加到100万,分布差异逐渐减小,到300万和500万时,基本上与正态分布吻合。

22.jpg

辛普森悖论

辛普森悖论是指在某些情况下,将一个整体进行细分后,得到的结果与对整体进行统计的结果存在矛盾。

可以看下面这个例子,实验组进行流量调节可能会导致辛普森悖论:

(以下数据为非真实数据)

23.jpg

从10月19日晚上开始,算法策略的同学将实验组的流量从20%缩减到了10%,因此实验组UV对比对照组UV开始下降。10月20日和10月21日正好是周末,用户的人均点击比工作日高了一截(40+ -> 60+),对照组在周末的流量占比相对于实验组更高,也就导致了这四天累计分析时实验组反而不如对照组。

为了避免实验分析过程的辛普森悖论,可以采用以下解决方案:

  • 实验组和对照组按等比调整,或者不要跨流量调整时间节点分析数据。

  • 细分人群分析时,注意用户在人群之间的迁移。

幸存者偏差

幸存者偏差早已存在,这一理论源于二战时期的一个研究小组。在二战期间,盟军组成了一个小组研究“如何减少空军被击落概率”。当时军方的高层统计了所有返回的飞机的中弹情况,发现飞机的机翼部分中弹较为密集,而机身和机尾部分则中弹较为稀疏,于是当时的盟军高层建议加强机翼部分的防护。但小组中的一位来自哥伦比亚大学的统计学教授亚伯拉罕·沃德(Abraham Wald)却提出了完全相反的观点,他认为应该加强机身和机尾部分的防护。

那么这位统计学家是如何得出这一看似不够符合常识的结论的呢?沃德教授的基本出发点基于三个事实:

  • 统计的样本只是平安返回的战机。

  • 被多次击中机翼的飞机似乎还是能够安全返航。

  • 而在机身机尾的位置很少发现弹孔的原因并非真的不会中弹,而是一旦中弹,其安全返航的机率极小。

为什么AB实验中会存在幸存者偏差?这是因为我们只统计进入实验的用户,而观测的指标通常是平均值,观测的时间范围也往往是最近1-2周,如果用户因为实验的效果流失了,是不会体现在实验第二天的数据中的。

为了避免在AB实验中的幸存者偏差,所有实验都应关注用户的留存,留存出现显著性差异的时候考虑在整个实验周期内进行用户去重分析。一些典型的会出现留存变化的场景包括:

  • 黑白盒实验

  • 拉活实验

  • 异常实验

后续规划

可信

  • SRM检测

  • Cuped方法产品化

  • 检验方法升级

  • …

效率

  • 样本量预估流程

  • 统计引擎服务化

  • 分析功能统一化

  • …

场景化

  • SRM检测

  • Cuped方法产品化

  • 检验方法升级

  • …

智能化&因果推断

  • 样本量预估流程

  • 统计引擎服务化

  • 分析功能统一化

  • …

六、总结

本文主要介绍了以下内容:

  • AB实验的基本概念、用途和实验流程。

  • AB实验平台的整体架构、接入方式,以及分流引擎和数据引擎的技术难点、架构和后续规划。

  • 实验平台中的数据科学,包括实验的必要性、实验决策的基本原理、第一类错误和第二类错误的优化方式,以及一些常见的分析误区。最后还介绍了数据科学方向的后续规划。

*文 / 健胜

本文属得物技术原创,更多精彩文章请看:得物技术

未经得物技术许可严禁转载,否则依法追究法律责任!

相关推荐

从中心调度到自驱协作多 Agent 架构的三次反转|得物技术

本文探讨多Agent系统中的控制权分配问题,提出三大协作架构:Master Agent(中心调度)、任务看板(共享状态)与Advisor(轻量咨询)。通过划清上下文边界与模型边界,强调应以信息相关性而非职业标签划分Agent。三种模式分别将决策权集中于中心、下放至共享状态、再下沉至执行者,形成控制权逐步下沉的演进路径。案例显示,合理设计可提升复杂任务的并行性、弹性与可维护性。

SmartCodeTech的博客 405

Jev 实战:为AI工作流引入轻量决策层 x10倍提速|得物技术

完成这三个场景后,我对适用边界有了更明确的认识:它们都可以先定义答案范围,再根据判断结果驱动下一步操作。接入时,我会优先明确输入、选项、采纳条件和兜底路径,再评估Jev是否适合承担这一环节。结合这些实践,我更容易理解Jev(TypeSafe System One)作为专用结构化决策模型不生成自然语言,而是返回带概率的判断结果。后续接入时,我会继续从脚本中边界明确的判断任务开始,分别验证准确性、耗时和费用,再决定是否扩大使用范围。下面整理了相关能力、限制和接入要点,便于查阅。

SmartCodeTech的博客 343

国产算力·昇腾 910C 大模型推理优化(下):源码修改与算子优化,提速30%|得物技术

本文延续上篇,深入vllm-ascend源码优化:通过多流重叠实现MoE共享专家并行计算,消除冗余事件开销,并解除与FUSED_MC2的互斥限制,实现c=1下TPOT从8.2ms降至8.0ms;优化decode阶段host侧开销,引入状态跟踪跳过冗余拷贝;设计Block Table CPU快路径,规避小batch下NPU kernel启动延迟;针对GDN层融合L2Norm至recurrent kernel,减少算子调用与内存往返。综合优化后推理性能显著提升,形成可复用的昇腾910C大模型推理优化方法论。

SmartCodeTech的博客 238

国产算力·昇腾 910C 大模型推理优化(上):镜像更新与参数调优,提速 40%|得物技术

文中详细给出每一项优化的动机、实现(含具体源码改动路径与关键代码片段)、验证数据与踩坑记录(包括十余项实测无效或负向的尝试),希望为同样在国产算力上做推理优化的团队提供一份可直接复用的工程参考。

SmartCodeTech的博客 217

动态规则的 Agent 实践:用确定性工程驾驭 LLM 的资产智能验收

面对财务验收中规则多变、材料非结构化、核对复杂等痛点,传统规则引擎难以应对。系统采用“规则即配置”思路,由大语言模型(LLM)负责理解合同、扫描件等非结构化材料并执行语义比对,工程系统则保障流程编排与可追溯性。通过异步处理、幂等设计、三类流量隔离及双通道(文本/图像)处理,实现高效稳定运行。结合用户反馈构建自动标准答案,辅以试跑、回测与发布门禁机制,形成闭环质量体系。底层采用确定性工作流架构,确保行为可预期、可测试,真正实现灵活规则的快速迭代与安全上线。

SmartCodeTech的博客 343

发一张图,它居然“跃“出屏幕了?一文读懂得物 3D 空间图片技术实践

3D 空间图片功能的落地,涉及模型生成、内容分发、客户端渲染之间的一系列取舍。本文重点分享如何生产出高质量、小体积的模型,以及如何在手机上流畅运行。

SmartCodeTech的博客 555

别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?

你搜"af1",它得给你"空军一号"。这一年,得物交易搜索把召回从"做选择题"改成了"写答案"——不再从商品池里"找"最像的,而是让模型自己"生成"你真正想要的。从 LLM 语义索引到 HLLM、语义 ID,搜索是怎么从"检索"走向"生成"的?

SmartCodeTech的博客 593

指标平台:从语义底座到智能消费的实践路径|得物技术

这篇文章想做的,不是在本体化的宏大叙事上再叠加一层理论,而是把我们在真实落地中验证过的路径讲清楚:语义底座怎么从零建立起来、怎么保证质量不失控、怎么支撑 Text2SQL 和 AI Coding 两条消费主线,以及沿着这条路径往前走,下一步该往哪个方向发力。

SmartCodeTech的博客 316

企业级 MultiAgent 落地:Plan 模式与主子 Agent 协作|得物技术

基于 AgentScope Java 的企业级 MultiAgent 平台,为研发、数据分析和知识问答等场景提供统一的模型调用、工具接入、任务编排、流式输出与运行追踪能力。

SmartCodeTech的博客 300

得物小摊 AI Native 演进实录:用 Harness 构建可控 AI 交付

AI Coding 一个人用很顺手,进了团队就漏:指令没人审、经验难沉淀、过程看不见、链路不闭环。作者团队基于 Multica 做了 EP-Harness,把 Agent 当成员管,给它套一层可执行、可观察、可治理的 Harness,并让反馈闭环。成果:可追溯决策、多 Agent 协作,高频异常从每 4 小时 2400 多条降到个位数,对得物技术补上团队级 AI 协作关键一环。

SmartCodeTech的博客 540

企业级 MultiAgent 的记忆系统:短期上下文与四层记忆架构实现|得物技术

在 MultiAgent 平台中,Agent 的"记忆"能力是实现智能对话和个性化服务的核心资产。本文深入剖析 Agent 记忆系统的设计理念与实现细节,重点解析长期记忆架构的写入与加载流程,涵盖 LLM 智能判断、语义检索、Token 预算控制、冲突处理等关键技术,为开发者提供完整的技术实现参考。

SmartCodeTech的博客 502

EP-Harness:从个人 AI Coding 到团队级 Agent 工作流|得物技术

AI Coding 个人用得爽,一到团队就崩。EP-Harness 把 Agent 从聊天工具变成团队协作成员——可管理、可追溯、可闭环。落地后高频异常从 2400+/4h 收敛到个位数。

SmartCodeTech的博客 688

得物知识问答:复合检索 Agent 的系统设计实践

从"搜到什么用什么"到"搜→筛→挖→验"自主决策闭环——我们造了一个有判断力的 RAG Agent,不是套壳。

SmartCodeTech的博客 733

实战从零开始构建一个Coding Agent:Violin |得物技术

理解了 coding agent 的构建原理,也就掌握了理解其他 agent 的一把钥匙。笔者对每天都在使用的 agent 原理很感兴趣,于是决定自己写一个:violin。

SmartCodeTech的博客 926

AI Native 交易核心系统的研发范式|得物技术

如何改造旧研发流程适配 AI 编码?本文提出五道标准化关口治理思路,依托 Claude Code Spec-Driven 插件打通需求澄清、方案设计、TDD 落地、门禁管控与埋点监控,构建带人工确认门控的完整工作流,以五层自底向上架构实现 AI 编码规范化落地。

SmartCodeTech的博客 972

推荐系统体验的数字化突破:得物自动化评测平台的技术实践|AICon 文章整理

「得物推荐 AI Harness 工程化实践系列」的末篇内容,本系列共三篇连载。本篇(末篇)详解得物推荐评测平台的完整技术体系:从主观体验量化到大模型自动化评测流水线,涵盖多维度指标设计、人机协作提示词校验闭环、分布式任务调度与成本精控等核心工程实现,以及单周百万级审计需求下实现 91% 资源成本优化的工业级落地实战细节。

SmartCodeTech的博客 1493

RAG 核心概念与原理:Chunking、Embedding、相似度、HNSW 与多路召回|得物技术

决定 RAG 效果的关键不在大模型,而是文本切块、查询改写、多路召回与精排。合理切块存好知识库内容,向量匹配抓语义、BM25 匹配关键词互补。先优化用户提问,快速召回一批相关文档,再用精排模型精细筛选,整套检索流程配合到位,问答准确度才会明显提升。

SmartCodeTech的博客 1079

从“机械应答“到“服务伙伴“:得物高可控智能客服的 Agent 工程实践|AICon 演讲整理

本次分享围绕以下核心技术展开:客服 Agent 挑战与架构设计(Single-Agent→Multi-Agent→Harness);高可控性数据飞轮(PE 自动化 + DPO 训练);RL 策略训练和人工经验对齐;多轮半双工消息流控制。

SmartCodeTech的博客 745

得物推荐系统诊断 Agent:从 “调接口” 到 “会思考”|AICon 演讲整理

本文是得物技术专家在 AICon 上海演讲整理的技术实录。AICon上海2026_全球人工智能开发与应用大会暨大模型应用生态展_InfoQ技术大会「得物推荐 AI Harness 工程化实践系列」的中篇内容,本系列共三篇连载。本篇(中篇)进一步详解得物推荐复杂业务场景下,AI代码从生成、防护校验到安全上线的完整技术体系、自研AI Harness整体架构框架、全流程安全防护机制、混合智能体核心算法实现,以及工业级工程落地的实战细节。

SmartCodeTech的博客 1361

得物 OceanBase 落地实践

得物选型OceanBase多模数据库应对业务挑战,通过验证其高可用架构、存储压缩技术及混合负载处理能力。测试显示OceanBase在复杂查询场景性能较MySQL提升130-200倍,在高并发TP/AP混合场景表现优异,存储成本降低40%+。通过DBA内部报表业务试点验证其稳定性后,逐步推广至核心业务场景,优化数据库技术栈,实现性能与成本的双重收益。

SmartCodeTech的博客 1380

AI UITester:AI Native 的 UI 自动化测试新范式|得物技术

ai_uitester 代表了 AI Native 的 UI 自动化测试新范式:这不仅是工具的升级,而是测试范式的转变 ------ 从 "代码驱动" 转向 "视觉驱动",从 "人工调试" 转向 "AI 自愈",从 "三端分离" 转向 "统一抽象"。

SmartCodeTech的博客 774

从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理

本文是得物技术专家在 AICon 上海演讲整理的技术实录。「得物推荐 AI Harness 工程化实践系列」的开篇内容,本系列共三篇连载。将系统拆解得物推荐复杂业务场景下,AI 代码从生成、防护校验到安全上线的完整技术体系,逐一详解自研 AI Harness 整体架构框架、全流程安全防护机制、混合智能体核心算法实现,以及工业级工程落地的实战细节。本篇(上篇):将整体介绍团队自研的 AI Harness 体系,包括建设思路、全生命周期防护机制、混合智能体架构及落地效果。

SmartCodeTech的博客 1080

从表单到 Agent:得物社区活动搭建的 AI 实践之路

一场营销活动从策划到上线,运营要在三个系统间跳转 10 + 次、填写 40 + 个字段。我们用 AI 重新设计了这条链路 —— 从 “AI 帮你填表单” 到 “两阶段 Agent + 聚合工作台”。这篇文章记录的不是技术细节,而是这条路上的选择和反思。

SmartCodeTech的博客 741

从埋点需求到规则资产:Hermes Agent 重构得物数仓工作流

埋点和指标需求中,消耗数据承接方的不是生成答案,而是补齐证据链、对齐历史口径、识别下游影响,并在生产写入前留下可追溯的确认记录。本文数据承接方指承接业务需求的数据同学或业务合作伙伴;后文讨论内部研发、元数据、查询和门禁能力在流程中的角色。

SmartCodeTech的博客 656

让 Claude Code 拥有自我进化和记忆系统|得物技术

本文记录了为 Claude Code 构建的一套持久化记忆与自我学习系统的设计思路与实现细节。这套系统让 AI 助手能够跨越会话边界记住用户习惯,并在每次对话结束后自动提炼行为规律和系统信息,通过向量检索快速提取关键信息,下一次对话时主动应用,逐步进化为更懂你的编程伙伴。

SmartCodeTech的博客 994

用 LLM Agent 重构告警排查流程|得物技术

告警排查需频繁切换日志、APM、链路追踪等多个平台,耗时 10~30 分钟,且高度依赖个人经验。我们做了 Troubleshooter——用 LLM Agent 自动完成数据采集、根因分析和处置建议生成。上线后中位数排查耗时从 20 分钟降到 4.4 分钟,覆盖 11 个服务和 10+ 种告警类型。

SmartCodeTech的博客 1004

HorizonVault 技术深潜:如何在 HDD 上做出 100GB/s+ 级大吞吐分布式存储|得物技术

HorizonVault是一款面向Kafka远程存储的高吞吐分布式存储引擎,通过分布式并行写入和状态感知调度解决冷数据存储的三大核心问题:吞吐瓶颈、性能抖动和恢复能力。系统采用分层架构,Meta负责全局资源调度,Broker处理请求路由,Store实现本地磁盘管理,形成完整的写入治理链路。通过将HDD磁盘提升为一等资源,实现顺序追加写入、多盘并行和慢盘隔离,在保证高吞吐的同时控制延迟。存储结构采用DiskStore组织磁盘资源,LogSegment顺序写入数据,IndexSegment定位读取,Change

SmartCodeTech的博客 890

Claude Code Harness 工程:数仓侧落地方案|得物技术

Harness 工程通过职责分层实现研发流水线可靠性提升。Claude 负责需求理解与代码生成等语义层工作;hooks 负责规范检查等确定性执行;Subagents 隔离血缘查询、自测等高 token 操作;Memory 承载跨会话状态持久化。四层协同使数仓 AI 开发从"对话式辅助"转变为"规则驱动的自动化流程"。

SmartCodeTech的博客 1093

BP Claw 破解 AI 编码输入难题 ——FlinkSpec 需求智能化实践|得物技术

本文为 FlinkSpec 系列之开篇,亦是这场工程化变革的序章。BP Claw 所立之处,不过链路之源。FlinkSpec 所图,乃以 AI 之力,将实时数仓从需求落地至验收上线的全程工序,熔铸为一套精密自洽、生生不息的智能工程体系。宏图未竟,后续系列将逐章揭幕,敬请期待!

SmartCodeTech的博客 1035

基于 Harness + SDD + 多仓管理模式的 AI 全栈开发实践|得物技术

Harness(约束)思维的本质是:给 AI 一个已有的实现作为参照,让它照着复刻一份,而不是凭空创造。就像给一个新入职的工程师说 "你照着这个模块的风格,写一个类似的",而不是 "你自由发挥"------ 前者往往能更快产出符合团队规范的代码。

SmartCodeTech的博客 1185
上一篇: 前端打包工具Mako架构解析|得物技术
下一篇: 探索BPMN—工作流技术的理论与实践|得物技术
得物技术
得物技术 得物技术官方账号 得物技术官方账号
博客等级 码龄6年 2492粉丝 407原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值