AIQ | 洋码头 AB 测试系统



转载请注明 AIQ - 最专业的机器学习大数据社区  http://www.6aiq.com

AIQ 机器学习大数据 知乎专栏 点击关注

作者 汪洋
作者介绍
汪洋,洋码头搜索推荐工程师
负责洋码头搜索系统、推荐系统和数据平台的研发工作。

为了更好的提升用户体验,让实验数据来驱动产品决策, 洋码头自研了一套 AB 测试系统。本文为大家分享这套系统的架构设计及实现要点。

全文约 2000 字,可参阅下面的大纲阅读。

  • 1. 什么是 AB 测试系统

  • 1.1 基本概念

  • 1.2 AB 测试流程

  • 1.3 平台功能

  • 2. 平台架构

  • 3. 流量模型

  • 4. AB 测试服务的实现

  • 5. 实验平台概览

  • 6. 遇到的问题

  • 7. 参考资料

1. 什么是 AB 测试系统

1.1 基本概念

首先我们需要了解一下什么是 AB 测试。一种较为常见的解释是:AB 测试是一种新兴的网页优化方法,可以用于增加转化率注册率等网页指标。AB 测试本质上是个分离式组间实验,以前进行 AB 测试的技术成本和资源成本相对较高,但随着一系列专业的可视化实验工具的出现,AB 测试已越来越成为网站优化常用的方法。它其实是一种“先验”的实验体系,属于预测型结论。AB 测试的目的在于通过科学的实验设计、采样样本代表性、流量分割与小流量测试等方式来获得具有代表性的实验结论,并确信该结论在推广到全部流量可信。

 

洋码头 AB 测试系统是洋码头进行线上效果优化和观察的有利工具,其基本原理是通过对访问请求按用户纬度和实验进行切分,使得用户按一定比例落在不同的测试组中,然后通过对用户的行为进行日志收集、分析,最后以报表的形式进行直观数据展示,以达到对比不同测试组所使用策论优劣的目的。目前该系统已经应用在洋码头各业务中。

 

下面是一个简单的示意图,我们看到用户流量被均分为 1:1 的各 50% 的 2 组试验,2 组试验通过在同一页面上的统一模块呈现不同的颜色,最后通过页面埋点进行日志收集方式统计出 A 版本和 B 版本的转化率分别为 23% 和 11%。决策者因而知道在 A 版本的颜色可以达到更好的转化率效果。

1.2 AB 测试流程

AB 测试的流程可以分为以下 5 个步骤,分别是提出问题、建立假设、准备测试方案、验证和数据分析。我们以洋码头的日记分享业务为例进行了 AB 测试,具体流程如下图。

1.3 平台功能

目前洋码头 AB 测试平台主要包括以下 4 个功能模块:

  1. 实验管理:是一个实验管理后台,允许用户对实验进行配置和管理。

  2. 流量管理:对实验进行流量切分配置。

  3. 日志收集:请求过 AB 测试配置后,服务端会把对应的用户日志进行上传。

  4. 数据分析:对上传的日志进行数据清洗和数据分析,最后通过报表的形式进行展示。

 

2. 平台架构

整个平台的系统架构如下图。

 

图中的上半部分是在线部分,下半部分是离线部分。下面我们分别进行详细展开。

 

在线部分包括 app/web 客户端(以下简称客户端)、app 后端服务、AB 测试服务和实验管理平台。客户端会向 app 服务端进行数据请求,而客户端和 app 服务端都可以向 AB 测试服务发送请求,要求返回 AB 实验数据的参数及算法配置。之所以二者都可以向 AB 测试服务发出请求,是因为目前的洋码头的 AB 测试服务支持两种实验类型即客户端实验和后端服务实验。AB 测试服务会定期从配置数据库中拉取各 AB 实验的配置信息。数据的访问请求以 yid(洋码头通用用户 id) 为参数进行的。

 

离线部分包括日志收集和数据分析模块。其中日志收集部分使用 Kafka 和 Flume 作为日志上传和收集的工具,最终日志落地到 HDFS 中。HDFS 中的日志数据被清洗后被固化到数据仓库中,然后通过 hive 和 spark 等工具对数据进行分析和导出,最终的统计分析数据进入到报表系统。各 AB 测试业务方可以很方便的在报表系统中看到各测试组的实验指标对比。

 

 

3. 流量模型

AB 服务在对流量进行切分的时候参考了谷歌的分层流量模型(如下图)。该模型的流量切分满足以下 2 个特性:

  1. 正交性:支持对全部流量进行第 1 次切分后,对其中某一个实验组的流量进行多次继续划分。

  2. 一致性:使用了 yid 和 exp_id(实验 id) 作为 hash 的因子,得到的结果对 100 取模,从而保证了流量的均匀分布。计算公式为 segment = hash(yid,exp_id) mod 100。

 

4.AB 测试服务的实现

AB 测试服务的请求处理流程如下图。

首先, AB 测试服务会定期从 AB 配置数据库中读取实验配置信息,将其缓存在内存中;

其次,当接收到一个 AB 请求,AB 服务会根据内存缓存中的实验配置信息将用户分配到其对应的实验组中;

最后,将用户属于哪个实验组的信息返回给各业务方,并将此次 AB 访问进行日志上传。

 

5. 实验平台概览

实验配置系统是一个后台管理系统,其后端实现技术为 Django+Mysql, 前端实现为 Bootstrap+JQuery+Chart.js。界面如下图。

该平台所包含的功能有:

  1. 实验管理

  2. 测试组管理

  3. 流量比例控制

  4. 参数配置

  5. 实验条件配置(仅对 app 实验需要配置)

  6. 白名单设置

 

6. 遇到的问题

1. 线上某些业务场景需要一次性传入大量 yid 进行 AB 实验配置请求。 尽管 AB 配置的信息已提前载入内存,但是当传入的 yid 个数太多,系统需要在短时间内进行大量的线程创建或者切换和日志上传等操作,对机器负载压力较大

解决方案:针对该场景提供一个批量的查询接口,针对多个 yid 的日志上传进行日志压缩、异步上传等优化处理。

2. 目前 AB 测试的流量报表是每天更新一次,而某些实时性要求较强的 AB 测试需要更快速地得到结果

解决方案:后期可以考虑对此类对实时性要求较强的任务缩短其频率到小时级别,这样,生成报表所需要的时间也会比原来生成一天的数据报表所需时间有所缩短。

 

7. 参考资料

http://engineering.indeedblog.com/blog/2014/06/proctor-a-b-testing-framework/

https://app.optimizely.com/projects/4997952707/experiments

https://github.com/facebook/planout/tree/master/python/planout

http://www.appadhoc.com/abtesting/direction.html

http://www.appadhoc.com/abtesting/experiment.html

http://heidixie.blog.sohu.com/93520624.html


更多高质资源 尽在AIQ 机器学习大数据 知乎专栏 点击关注

转载请注明 AIQ - 最专业的机器学习大数据社区  http://www.6aiq.com