天天看點

ABtest在OpenSearch上的設計與實作 OpenSearch上的ABtest 後續工作

為什麼要做ABtest

OpenSearch是為使用者提供資料搜尋解決方案的平台,目前已經通過阿裡雲平台為集團内外大量客戶提供服務。為了更好地提供搜尋服務,OpenSearch打算把集團内部已經成熟的算法功能輸出給外部客戶使用,如類目預測、查詢分析等。但是在我們開放類目預測功能之後卻發現鮮少有人使用,調研了一些相關客戶後,發現原因是無法證明使用了類目預測功能之後真的能提升搜尋服務效果,以及提升了多少,是以客戶不敢貿然使用,于是ABtest功能應運而生。

https://www.atatech.org/articles/119537#2 實作方案調研

https://www.atatech.org/articles/119537#3 什麼是ABtest

ABtest是指為了達成某一優化目标,提出兩種方案A和B,讓一部分使用者使用A方案,另一部分使用者使用B方案,然後通過比較這兩部分使用者的行為資料來說明哪個方案更優的實驗方法。當然真實的實驗場景會更複雜,包含更多的方案做比較。此外,為了為有限流量的使用者提供同時做多個實驗的能力,ABtest實驗還可以分層,不同層共享100%的流量,層内實驗按比例切分流量并做比較。

https://www.atatech.org/articles/119537#4 已有的實作

通過調研,我們發現公司内部已有ABtest的實作方案,即

Hyperspace

。它提供RESTful API以編輯ABtest實驗,将配置存入DB并同步到

diamond

中,使用者可以使用C++ SDK從diamond同步資料并對流量分實驗。這些功能基本滿足OpenSearch對ABtest功能的需求,同時,Hyperspace本身的積澱也能讓OpenSearch的ABtest功能少走很多彎路,是以我們決定采用Hyperspace作為ABtest的實作方案。

https://www.atatech.org/articles/119537#5 OpenSearch上的ABtest

https://www.atatech.org/articles/119537#6 産品設計

https://www.atatech.org/articles/119537#7 實驗編輯

考慮到OpenSearch的很多使用者沒有使用ABtest的經驗,為了降低使用者的使用難度,我們基于ABtest抽象出了實驗場景、實驗組和實驗三個概念:

  • 實驗場景:實驗場景指的是準備進行實驗的全部流量集合。産生方式是由使用者在發送給OpenSearch的Query中用http參數的方式帶上實驗場景的标簽,并在實驗配置中指定标簽集合。
  • 實驗組:實驗組為實驗的容器,即對應ABtest中層的概念。
  • 實驗:測試功能的随機流量及其配置,也就是ABtest中實驗的概念。目前實驗可支援的配置有查詢分析、粗排表達式、精排表達式以及類目預測。

在産品設計上,我們使用如下圖所示向導的功能讓使用者分别建立場景、實驗組和實驗,并在相應的界面上添加對相應概念的解釋,盡量降低使用者的了解成本。

https://www.atatech.org/download?file%5B%5D=dc134fa6d51b545f96d14c813cd2bbfe%2F%E5%88%9B%E5%BB%BA%E5%9C%BA%E6%99%AF.png https://www.atatech.org/download?file%5B%5D=e2e5dca6bd952f3acf2dea9c9c912fe6%2F%E5%88%9B%E5%BB%BA%E5%AE%9E%E9%AA%8C%E7%BB%84.png https://www.atatech.org/download?file%5B%5D=3bbc23a61ac9a25446e2a40e4df26632%2F%E5%88%9B%E5%BB%BA%E5%AE%9E%E9%AA%8C.png

在使用者的查詢api中,我們提供了scene_tag和flow_divider兩個ABtest相關參數。scene_tag使用者讓使用者辨別流量的場景,用于區分流量是否參加實驗。flow_divider是ABtest用來對流量分實驗的一個哈希字段,一般我們建議使用者使用他的使用者的編号,這樣能保證同一個終端使用者始終進入同一個實驗,為其提供穩定的體驗。

https://www.atatech.org/articles/119537#8 實驗資料報表

在使用者編輯完ABtest實驗之後需要持續觀察流量的變化以确定哪個方案更優,是以OpenSearch為使用者每天統計一次各實驗的PV、IPV、UV、IPV_UV、CTR、無結果率等核心名額(IPV、IPV_UV、CTR三個名額需要使用者開通資料采集功能)展現給使用者對比。

https://www.atatech.org/download?file%5B%5D=cf6ac8eece472a39eb63dc91e4269d54%2F%E6%8A%A5%E8%A1%A8.png

通過編輯實驗和對比名額,使用者的設計決策就有了資料支撐,在使用新的算法功能時也就不必擔心,一切靠資料說話。

https://www.atatech.org/articles/119537#9 技術方案

https://www.atatech.org/articles/119537#10 ABtest實作

在OpenSearch之前,Hyperspace對其他項目的ABtest功能的支援方式是每個項目對應一個配置集合,即Hyperspace中的project。但是OpenSearch是一個搜尋平台,需要支援成千上萬的使用者使用ABtest功能,即要在Hyperspace上開通成千上萬個project,而Hyperspace所用的diamond配置管理系統支援的配置資料量有限,無法滿足這個需求,是以Hyperspace同學部署OpenSearch的服務的時候把diamond替換成了基于etcd實作的配置中心。此外,為了把OpenSearch的使用者與Hyperspace上其他使用者隔離開來,Hyperspace還引入了命名空間的概念,将OpenSearch平台上開通的project單獨放入一個命名空間下。

使用Hyperspace後,ABtest在OpenSearch上的實作架構如下圖所示:

https://www.atatech.org/download?file%5B%5D=c0e97f55691aac8ff3d90fb856bdb326%2Fabtest%E6%9E%B6%E6%9E%84%E5%9B%BE.png

前端提供界面供使用者編輯ABtest實驗,并通過API與Hyperspace互動,Hyperspace把實驗配置存入資料庫并同步給配置中心。agg使用Hyperspace的C++ SDK從配置中心拉取實驗配置,并據其确定實驗,改寫搜尋請求,查詢ha3引擎,将查詢結果傳回給前端。同時,agg也會記錄每個搜尋請求最終進入的是哪個實驗,為各項名額的統計提供支援。

https://www.atatech.org/articles/119537#11 資料報表統計

實驗資料報表的資料來源分為agg上的pv日志以及使用者推送的行為資料兩部分。計算流程使用aflow管理,通過各區域主要機上的crontab指令來每天定時觸發執行。為了與OpenSearch上現有的算法任務(目前主要是類目預測)相容,資料報表的統計任務分為計算較為通用的基礎資料(主要包括app級别的搜尋和點選日志)和報表資料(PV、UV等名額)兩部分。基礎資料不僅可以用來生成報表資料,同時也可以被其他算法任務所使用。

https://www.atatech.org/articles/119537#12 後續工作

​為了降低使用者的了解成本,目前上線的ABtest功能不允許使用者在一個實驗場景下建立多個實驗組,即不支援分層實驗。