如何進行A/B測試,你學(xué)會了嗎?
什么是 A/B 測試?
A/B 測試,也稱為拆分測試,是一種營銷實驗,可以在其中拆分受眾以測試廣告系列的多個變體并確定哪個效果更好。換句話說,可以向一半觀眾展示內(nèi)容/功能/行為的版本 A,而向另一半觀眾展示版本 B。
為什么不使用第三方服務(wù)?
確實將第 3 方 X 用于 A/B。
對于 X,觀察到以下問題:
- 由于服務(wù)器端標(biāo)記的高延遲
- 特征復(fù)雜度
- 分割部分的跟蹤和影響測量。
- 成本高
它提供什么?
該服務(wù)(作為微服務(wù)實現(xiàn))將使客戶能夠進行 A/B 測試??梢詫Χ鄠€特征(返回值)進行任意數(shù)量的實驗。
設(shè)計時要牢記可擴展性和進一步增強功能。
常用功能包括:
- 能夠在受限的基礎(chǔ)上控制功能上線(特定用戶)
- 為隨機 (%) 用戶啟用任何功能
- 根據(jù)具有復(fù)雜邏輯的用戶配置文件/特定參數(shù)評估功能
- 能夠在受限的基礎(chǔ)上控制前端功能(UI 元素)
- 在任何實驗中添加/編輯特征
- 使段相互排斥的能力
- 能夠找出哪個用戶屬于特定細(xì)分
- 此類實驗可能產(chǎn)生的所有其他分析
技術(shù)棧:
Springboot
Java 8
Maven
Mysql
Groovy
架構(gòu)設(shè)計:
這是上面實體保存的內(nèi)容的簡短描述。所有實體都擴展 BasEntity 以獲取所有實體的公共列。
- 實驗:所有實驗都將保存在這里,并帶有唯一名稱和可選描述。
- Feature:一個實驗可以有多個特征,這些特征將保存在這個表中,具有唯一的名稱,可選的描述和 experiment_id 作為實驗表的外鍵。 值是該功能將以 json 格式返回給客戶端的內(nèi)容。 Whitelisted_users 將包含 user_id 列表作為逗號分隔列表,它將告訴哪些用戶分配給此功能。
- 邏輯:由于每個實驗都可以有一定的條件來劃分用戶段,所以這個條件會保存在邏輯表的條件欄中。(我們稍后會來實現(xiàn))
- User_Feature_Mapping:因為我們可能希望一旦用戶被分配到某個功能,它將在未來的 api 調(diào)用中保持相同的功能。換句話說,我們可能希望保持一致性而不是每次都評估邏輯(條件)。
流程設(shè)計:
現(xiàn)在將了解以上 2 個流程的含義:
usePreCalculated標(biāo)志在這里很重要,因為它意味著我們是要重用 User_Feature_Mapping 表中包含的值還是再次評估邏輯表中的條件。
- 如果為假,將檢查實驗的每個特征的 whitelisted_list。如果退出則返回值,否則將評估邏輯然后相應(yīng)地返回特征值;
- 如果為真,將首先檢查 user_feature_mapping 表是否存在 user_id 和 experiment_id。如果是,那么返回該值。如果沒有,那么將按照上面的步驟(步驟 1)
注意:每次評估邏輯時,都會將結(jié)果保存在user_feature_mapping表中
如何評估條件?
將常規(guī)代碼存儲在邏輯表的條件列中。以下只是一個示例:
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 是因為它具有絕對的靈活性??梢詧?zhí)行復(fù)雜的功能,甚至可以使用存儲為文本的代碼調(diào)用外部方法和 api。當(dāng)用例很復(fù)雜時,這很有用,例如想根據(jù)某些只能由第三方 api 實現(xiàn)的用戶屬性或參數(shù)來分配用戶段。
例如,如果想將A/B分成90:10,可以對user_id進行模10運算,并將結(jié)果0分配給B段,剩下的分配給A段??梢远啻胃谋壤踔吝壿嫙o需重新部署。
API列表:
- /experiment POST -> 創(chuàng)建一個實驗
- /experiment/{experiment_name} PUT -> 編輯實驗
- /experiment/{experiment_name} GET -> 獲取實驗的詳細(xì)信息
- /experiment/{experiment_id}/feature POST -> 向?qū)嶒炋砑犹卣?/li>
- /feature/{feature_id} PUT -> 編輯特征
- /feature/{feature_id}/whitelist PUT -> 編輯特定功能的白名單用戶列表
- /experiment/evaluate/{experiment_name} POST -> 主要 api。評估實驗并返回 json 格式的響應(yīng)