阿里妈妈AB-test实验平台Tesla

一、简介

实验田

部署几套系统,切分不同的流量占比。这样的成本很高,可同时进行的实验很少,且发布比较麻烦,一个实验得好多人配合。

Bucket Test System

BTS可以支持正交测试,如图所示:我们分析实验数据,只会针对同一实验内部的基准桶和实验桶。


BTS正交试验示例
Tesla

后来,参考google的一篇论文,Overlapping Experiment Infrastructure More, Better, Faster Experimentation实现了一套可能做很多实验的平台,且集分析和管理于一体。


Tesla架构图

Tesla作为公共库,即可植入前端应用中,也可植入后端引擎中进行实验。

二、原理

从单层到分层
一次请求
请求处理流程
实验需求
实验需求示例

单层试验

单层实验

分层试验
分层实验
分层联合试验
分层联合实验

基本概念

Domain

流量通道,流量隔离,一个流量的容器,可想象成一个电梯。可以嵌套多个Layer;


域的划分
Layer

流量复用流经的一个层,流量流经Layer时进行切流,可以嵌套多个Domain;

Diversion

流量切分规则;acookie, nickname, random...

保障层间独立、保障用户看到页面到一致性。


流量切分规则
Experiment

真正到实验,包含了实验的参数;

Domain和Layer不可互相嵌套。简单来说,Tesla将多个实验分布到多个层中,流量依次流入每层,从而并行地进行多个实验。

分层实验原理

离散


分层实验原理

加入随机性

流量流过每一层,加入离散因子,保障流入下一层被重新打散。

每一次使用固定到离散因子LayerId,同一个用户每次访问到路径一致。

各种分层实验

独立实验

假设,每个实验均可抽象为一些参数的集合,这些参数的组合将决定当前流量将会进行哪些实验。先考虑一种简单的情况,各个实验直接相互没有任何影响,可以同时对同一流量做实验,这种情况下对于流入的流量,仅需要按各个实验需要的比例进行分配即可。同时因为各个实验之间没有任何影响,所以同一个请求可以同时并行多个实验。这种情形下相当于每层只有一个实验,流量在一层之中分配到实验所需要的比例的流量。如图所示,同时并行3个实验。


独立实验
实验间互相影响

在实际的生产环境中,实验之间常常是相互有影响的,在同一个模块中的两个实验通常都是有影响的,例如在Query Rewrite模块同时做两个实验。在这种情况下,对于同一个请求是不能同时进行这两个实验的。需要将这两个或多个相互有影响的实验放在同一个层次里,以使得他们分别占用一定比例的流量,相互之间没有流量的重用。如图所示,可以看出互斥实验被放在了同一层中保证了它们的互不干扰。


互斥实验
更复杂的情况

再考虑一种更复杂的情况,Query Rewrite中的实验1与Match中的实验2是有耦合关系的。需要分出一部分流量单独供Query Rewrite的实验1和Match的实验2来做联合实验。此时,Domain的作用就体现出来了,将流量分到多个Domain中,其中一个Domain专门用于该联合实验,如图所示。


复杂实验

至此,Tesla已经可以支持几乎全部的实验情形,相比实验田,Tesla更加灵活,同时也可以并行做多个实验。

三、实现

Tesla在实现以上的功能的时候,充分考虑到以下几点:
1、简洁:作为公共库,轻量级实现,并提供简洁实用的接口便于应用方使用;
2、解耦:应用方只需依赖Tesla即可,保持系统和Tesla各自的独立性减少系统的复杂性;
3、灵活:提供各种灵活的分流策略以满足多种应用,而且可以提供自定义的流量切分规则;也提供嵌套的Domain从而适合解决各种实验对流量分配的需求;
目前Tesla只对外开放唯一接口,内部实现对应用方透明。接口如下:

int handleRequest(constmap<string, string>& diversionValues // Tesla流量切分需要的信息,如acookie,nick等
map<string, string>& parameters // Tesla返回的实验参数和bucketID)

应用方将实验参数透传至各个实验模块,由各个实验模块独立解析参数并进行执行。Tesla接收到请求req后,会依次按照Layer的序(ID)进行分流,查找该Layer对应的实验,大概流程图如下:


层code分流

一个Layer只能采用一种Diversion,那么计算步骤如下:
1、取到req中的分流参数值,如acookie;
2、对Diversion中指定的分流策略进行hash得到bucket;
3、根据bucket与该Layer内的所有Experiment或者Domain指定的Buckets,确定该次req落到那个Experiment或者Domain;
4、如果落到Experiment,那么将实验参数返回,如果落到Domain,那么重复以上步骤,直至流量流出经过最后一层
5、其他Layer计算步骤以此类推;
6、最后拼接bucketID和收集Parameters,bucketID即为每个Layer选出的Experiment的ID,如果没有选出Experiment,那么ID默认为0,ID间用“_”连接,示例:100_0_300_2;
不同的实验会有不同的流量切分需求,因此,Tesla提供了多种切分规则供应用方选用,如表。

Diversion#hash 说明
1 hash(user) 目前实验田使用的切分规则
2 hash(user,day) 按照天对用户进行切分用户,避免用户永远落在实验田
3 hash(user,Layer) 按照Layer进行切分用户,正交不同Layer的流量,达到Layer间流量共享
4 hash(user,day,Layer) 按照天和Layer进行切分用户
5 hash(user,day,Layer,other) 除了天和Layer,允许引入其他扰动因素进行切分用户

理论上,Tesla能够同时并行无数的实验,但是不建议设计如此复杂的实验,一方面流量是有限的,流量稀疏时,效果波动会很大,实验效果置信低。值得注意的是,为了达到不同的Layer的流量是正交的,设计hash函数会很复杂,流量切分也很难做到简单,且具可解释性。因此,我们建议预先了解实验流量需求,及实验间的冲突,合理设计实验。

四、举例

后端引擎接入Tesla示例

在后端引擎接入Tesla,当引擎接收到请求后,首先请求Tesla取得对应的实验信息,然后依次将实验信息透传给Query Rewrite和Rank,对于Query Rewrite和Rank各取所需实验参数,最后将bucketID记录到投放日志对应的字段中,用于实验效果统计用。

为了验证Tesla的作用,设计了较为复杂的实验,分别针对热搜和导航场景设计了多个算法实验,如图所示。在Query Rewrite模块中,为了确定那个多样性参数效果最好,我们设计了三个并行实验。在Rank模块中,为了验证结果多样性、排序策略,我们也设计了三个并行实验。


多层并行实验

同时并行了12个实验,已经很复杂了,通过Tesla能够有效规避实验间的冲突带来的实验效果的影响。

五、界面

搜索联合场景

实验参数

实验组合

延伸文献:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • 本人微信公众号为“推荐算法学习笔记”,定期推出经典推荐算法文章,欢迎关注。 我们知道互联网公司经常要上线各种各样的...
    xxxhuanging阅读 1,317评论 0 2
  • 作者雏鹰(企业代号名),目前负责贝壳找房增长方向AB实验平台研发工作。 引言 ​ 随着贝壳找房业务的不断增长,...
    南山军少阅读 9,040评论 3 15
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 5,980评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 6,828评论 0 2
  • 昨天考过了阿里规范,心里舒坦了好多,敲代码也犹如神助。早早完成工作回家喽
    常亚星阅读 3,017评论 0 1