严选客户端ABT实践

ABT智能决策,达到自行运转的决策循环,降低产品A/B实验决策周期、成本,助力业务增长。为实现这个目标,我们对客户端ABT、数据埋点、首页动态化进行了重构设计。本文主要分享我们对ABT改造实践相关技术点:客户端ABT架构设计、ABT协议规范、ABT埋点。

概述

关于A/B 有很多层的定义,通俗来说,A/B 是一种工具,通过分流A和B两个版本,统计埋点数据,进而实时计算出对应版本关键指标数据,然后根据指标数据和算法策略自决策哪个A/B版本效果更好并调整对应版本的流量。

架构设计

对于客户端视角来说架构体系主要划分:业务模块层、APP内H5、APP埋点、业务请求、APP Server、ABT Server。

  • ABT SDK:生命周期内缓存实验决策信息,为业务模块解析决策信息、匹配业务埋点对应实验信息、匹配业务请求的实验透传后端。

  • 埋点:用户的行为数据的采集&上报。

  • APP内h5:对于APP内的H5页面 为保持与APP实验决策表现的一致性,SDK通过UA传递实验决策给h5页面。

  • APP Server:透传ABT服务实验决策列表,apolloY配置参与实验的业务接口Path。

  • ABT Server:创建ABT实验,提供原始的实验决策信息并透传实验的业务信息。

ABT协议规范

为了保证资源投放、客户端、app Server服务、ABT服务、数据埋点服务,这些服务都保持一套页面模块体系 ,约定了一套ABT协议规范,并且各个服务都遵循这套协议,然后ABT各种实验玩法(TAC/资源投放/纯客户端实验)都是在这套协议上运行。

$(ABT协议版本号)|$(页面)|$(模块)|$(位置)|$(服务标识)|$(实验ID)|$(方案ID)。

  • 第一位: 协议版本号,预留,防止后面扩展或者修改协议用,示例1,由ABT平台提供,各方统一

  • 第二位: 页面,如首页,示例index,这个标识符由页面模块管理服务提供,各方统一,没有该项,则为NULL

  • 第三位: 模块,如banner位,示例BANNER, 这个标识符由页面模块管理服务提供,各方统一,没有该项,则为NULL

  • 第四位: 位置,如1,2,3, 应该由页面模块管理服务提供,各方统一,没有该项,则为-1

  • 第五位: 第三方服务标识, 如RDC,表示资源投放系统,这个标识由ABT平台提供,各方统一

  • 第六位: 实验ID,ABT平台上创建的实验的id

  • 第七位: 方案ID, ABT平台上创建的方案id。

例如 对于首页里的banner模块里的第二个坑位需要进行资源投放实验,那么对应的ABT协议ID为

1|index|banner|2|RDC|002|001。

{        "type":0,    //端类型, 0 native实验, 1 h5实验

        "groupId":"1|index|banner|2|RDC|002|001", //实验ID, 

        "extend":"", //ABT透传业务字段

        "paths":["/api/tac/execute/index"] //当前实验涉及的接口path列表 ,约定path不带.json后缀

    }

ABT埋点

ABT实验埋点粒度支持模块粒度、页面粒度、全局粒度、坑位粒度(目前主要是资源投放场景实验)的埋点。并且实验埋点信息是根据页面模块自动匹配 然后随当前埋点一起上报。

  • 模块级别实验,模块里埋点只会带上与该模块相关的实验信息(实验ID_方案ID),主要作用于模块内的实验。例如menu模块内埋点只会带menu模块相关的实验信息 。
  • 页面级别实验, 页面内所有埋点会带上与该页面相关的实验信息,主要用于页面内跨模块的实验 。如首页TAC实验需要跨首页多个模块。
  • 全局实验,整个APP内所有埋点都会带全局实验信息,主要用户跨页面实验。比如交易链路实验需要涉及到购物车页、下单页多页面。

例如 当前ABT SDK缓存的ABT决策列表:

["1|index|newitem|2|TAC|002|001",   //模块级别实验

"1|index|newitem|3|TAC|003|004",  //模块级别实验

"1|NULL|NULL|2|TAC|005|006",     //全局实验

"1|index|more|2|TAC|007|008"]      //模块级别实验

对于首页的新品模块的商品点击埋点click_index_newitem_item对应页面是index、模块是newitem,那么该埋点匹配到对应的实验信息是

“002_001|003_004|005_006”


资源投放实验埋点

资源投放ABT埋点比较特殊,对于客户端来说这种实验基本上是透明的,并且实验的粒度到模块的坑位级别。实验的埋点信息都是随业务接口返回 然后在对应坑位埋点直接透传埋点服务。

  • 资源投放ABT直接访问ABT平台
  • 资源投放ABT埋点 接口返回SCM埋点信息

ABT首页落地

对于首页TAC实验场景来说,由于首页页面模块UI布局&数据都是在后端TAC服务进行组装页面,所以对于这个场景SDK不仅为客户端提供实验决策也需要提供实验决策给后端TAC服务。
对于TAC 服务决策信息我们在业务请求通过WZP Header传递给后端TAC服务,然后TAC服务根据header里的决策信息组装好对应版本的页面数据返回给APP。

例如线上已完成下线的一个实验,首页的TAC布局实验测试。

实验A版本模块顺序:超级会员专属福利 -> 首页私人定制模块 – > 首页人气推荐模块;

实验B版本模块顺序:首页人气推荐模块 -> 超级会员专属福利 -> 首页私人定制模块。

总结展望

截止目前严选已经上线了78个客户端实验,包括首页TAC布局实验、首页TAC样式实验、资源投放实验、商详实验等。

随着用户数据隐私的管理越来越严,并且手机设备性能越来越好,未来我们期望结合On-Device AI技术充分利用手机设备算力资源、节省云端资源。在某些业务场景下,让数据不出手机端直接在端内进行决策。

作者简介

胡大,网易高级iOS开发工程师。2016年硕士毕业于上海计算技术研究所,同年加入网易严选,参与严选业务开发,现阶段主要负责导购链商品评价、交易链购物车两大业务模块开发。同时负责严选客户端APM、网络基础设施建设。目前参与严选Flutter技术建设落地。

本文由作者授权严选技术团队发布