如何進行A/B測試,你學會了嗎?
什么是 A/B 測試?
A/B 測試,也稱為拆分測試,是一種營銷實驗,可以在其中拆分受眾以測試廣告系列的多個變體并確定哪個效果更好。換句話說,可以向一半觀眾展示內容/功能/行為的版本 A,而向另一半觀眾展示版本 B。
為什么不使用第三方服務?
確實將第 3 方 X 用于 A/B。
對于 X,觀察到以下問題:
- 由于服務器端標記的高延遲
- 特征復雜度
- 分割部分的跟蹤和影響測量。
- 成本高
它提供什么?
該服務(作為微服務實現)將使客戶能夠進行 A/B 測試。可以對多個特征(返回值)進行任意數量的實驗。
設計時要牢記可擴展性和進一步增強功能。
常用功能包括:
- 能夠在受限的基礎上控制功能上線(特定用戶)
- 為隨機 (%) 用戶啟用任何功能
- 根據具有復雜邏輯的用戶配置文件/特定參數評估功能
- 能夠在受限的基礎上控制前端功能(UI 元素)
- 在任何實驗中添加/編輯特征
- 使段相互排斥的能力
- 能夠找出哪個用戶屬于特定細分
- 此類實驗可能產生的所有其他分析
技術棧:
Springboot
Java 8
Maven
Mysql
Groovy
架構設計:
這是上面實體保存的內容的簡短描述。所有實體都擴展 BasEntity 以獲取所有實體的公共列。
- 實驗:所有實驗都將保存在這里,并帶有唯一名稱和可選描述。
- Feature:一個實驗可以有多個特征,這些特征將保存在這個表中,具有唯一的名稱,可選的描述和 experiment_id 作為實驗表的外鍵。 值是該功能將以 json 格式返回給客戶端的內容。 Whitelisted_users 將包含 user_id 列表作為逗號分隔列表,它將告訴哪些用戶分配給此功能。
- 邏輯:由于每個實驗都可以有一定的條件來劃分用戶段,所以這個條件會保存在邏輯表的條件欄中。(我們稍后會來實現)
- User_Feature_Mapping:因為我們可能希望一旦用戶被分配到某個功能,它將在未來的 api 調用中保持相同的功能。換句話說,我們可能希望保持一致性而不是每次都評估邏輯(條件)。
流程設計:
現在將了解以上 2 個流程的含義:
usePreCalculated標志在這里很重要,因為它意味著我們是要重用 User_Feature_Mapping 表中包含的值還是再次評估邏輯表中的條件。
- 如果為假,將檢查實驗的每個特征的 whitelisted_list。如果退出則返回值,否則將評估邏輯然后相應地返回特征值;
- 如果為真,將首先檢查 user_feature_mapping 表是否存在 user_id 和 experiment_id。如果是,那么返回該值。如果沒有,那么將按照上面的步驟(步驟 1)
注意:每次評估邏輯時,都會將結果保存在user_feature_mapping表中
如何評估條件?
將常規代碼存儲在邏輯表的條件列中。以下只是一個示例:
import groovy.lang.GroovyShell;
public class GroovyDemo {
public static void main(String[] args) {
System.out.println("This represents some random code");
String groovyScript = "println 'first line of Groovy output'\n" +
"println 'second line of Groovy output'";
GroovyShell groovyShell = new GroovyShell();
// instead of passing a String you could pass a
// URI, a File, a Reader, etc... See GroovyShell javadocs
groovyShell.evaluate(groovyScript);
System.out.println("This represents some more random code");
}
}
選擇 groovy shell 是因為它具有絕對的靈活性。可以執行復雜的功能,甚至可以使用存儲為文本的代碼調用外部方法和 api。當用例很復雜時,這很有用,例如想根據某些只能由第三方 api 實現的用戶屬性或參數來分配用戶段。
例如,如果想將A/B分成90:10,可以對user_id進行模10運算,并將結果0分配給B段,剩下的分配給A段。可以多次更改比例甚至邏輯無需重新部署。
API列表:
- /experiment POST -> 創建一個實驗
- /experiment/{experiment_name} PUT -> 編輯實驗
- /experiment/{experiment_name} GET -> 獲取實驗的詳細信息
- /experiment/{experiment_id}/feature POST -> 向實驗添加特征
- /feature/{feature_id} PUT -> 編輯特征
- /feature/{feature_id}/whitelist PUT -> 編輯特定功能的白名單用戶列表
- /experiment/evaluate/{experiment_name} POST -> 主要 api。評估實驗并返回 json 格式的響應