A/B 測試模型的兩個版本

訓練新的自訂模型或 AutoML Vision Edge 模型後,您可以使用 A/B Testing 查看新模型在實際情況下的效能表現,並與您目前使用的模型進行比較。確認新模型有改善效果後,您可以輕鬆向所有使用者推出新模型,無須要求他們更新應用程式。

本頁說明如何執行 A/B 版本測試,評估兩個模型版本,以支援假設的視覺植物搜尋功能。這項功能會使用自訂圖片標籤模型,協助使用者從植物圖片中辨識植物種類。

假設您剛發布了新的植物標註模型 plant_labeler_v2,並想要執行實驗,將其與名為 plant_labeler_v1 的現有模型進行比較。以下步驟說明如何設定實驗、執行實驗,以及根據結果採取行動。

1. 讓模型可從遠端進行設定

進行模型 A/B 版本測試的第一步,就是修改應用程式,使用 Remote Config 參數來決定要使用的模型。一開始,您會將這個參數的預設值設為應用程式已使用的型號,但由於型號名稱是由遠端設定參數控制,因此您可以變更及嘗試不同的型號,而不必每次都向使用者推送應用程式更新。

因此,如果您以 plant_labeler_v1 這個名稱發布目前的模型,請在應用程式初始化程式碼中將 plant_labeler_v1 設為 plant_labeler_model 參數的預設值,如以下範例所示:

Kotlin

val remoteConfig = FirebaseRemoteConfig.getInstance()

val remoteConfigDefaults = HashMap<String, Any>()
remoteConfigDefaults["plant_labeler_model"] = "plant_labeler_v1"
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults))

remoteConfig.fetchAndActivate().addOnSuccessListener { success ->
    if (success) {
      // Okay to get remote values.
      // ...
    }
}

Java

final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();

Map<String, Object> remoteConfigDefaults = new HashMap<>();
remoteConfigDefaults.put("plant_labeler_model", "plant_labeler_v1");
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults));

remoteConfig.fetchAndActivate().addOnSuccessListener(
        new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean success) {
                if (success) {
                  // Okay to get remote values.
                  // ...
                }
            }
        });

接著,變更模型設定程式碼,以便載入 plant_labeler_model 參數指定的模型:

Kotlin

val rcValue = remoteConfig.getValue("plant_labeler_model")
val remoteModelName = rcValue.asString()

// ...

val remoteModel = FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build()
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel)

// Optionally configure a local model:
// https://firebase.google.com/docs/ml-kit/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml-kit/android/use-custom-models#configure_a_local_model

Java

FirebaseRemoteConfigValue rcValue = remoteConfig.getValue("plant_labeler_model");
String remoteModelName = rcValue.asString();

// ...

FirebaseRemoteModel remoteModel = new FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build();
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel);

// Optionally configure a local model:
// https://firebase.google.com/docs/ml-kit/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml-kit/android/use-custom-models#configure_a_local_model

由於應用程式會使用 Remote Config 參數來決定要載入哪個模型,因此您只要發布新模型並將其名稱指派給 Remote Config 參數,即可變更模型。這項功能可讓 A/B Testing 將不同模型指派給不同使用者,以便進行比較。

繼續操作前,請在模型下載程式碼中加入下列內容:

Kotlin

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
    .addOnSuccessListener {
        // If the model downloaded was specified by a remote parameter, log an
        // event, which will be our experiment's activation event.
        if (rcValue.source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
            FirebaseAnalytics.getInstance(this).logEvent("nondefault_model_downloaded", null)
        }
    }

Java

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                if (rcValue.getSource() == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
                    FirebaseAnalytics.getInstance(YourActivity.this)
                            .logEvent("nondefault_model_downloaded", null);
                }
            }
        });

以上程式碼會記錄自訂 Analytics 事件,以便日後用於實驗的啟用事件。啟用事件是指使用者必須觸發的事件,系統才能將使用者視為實驗的一部分。這樣一來,使用者裝置下載自訂 ML Kit 模型後,系統就會將他們記錄在 A/B 版本測試中。

2. 決定目標指標

接下來,您必須決定如何評估模型的成效,並確保應用程式收集到必要資料,以便根據該指標測試不同版本的模型效能。

A/B Testing 內建多項指標,包括收益、每日參與度和使用者留存率。這些指標通常可用於測試不同的使用者體驗流程或微調參數,但可能不適合用於評估模型和用途。在這種情況下,您可以改為嘗試針對自訂 Analytics 事件進行最佳化。

以假設的視覺植物搜尋功能為例,假設您按照模型對每個結果的信心程度,向使用者呈現搜尋結果。您可以查看使用者開啟第一個搜尋結果的頻率,藉此瞭解模型的準確度。

如要測試哪個模型最能達成提高熱門搜尋結果點擊次數的目標,您可以在使用者輕觸結果清單中的第一個項目時,記錄自訂事件。

Kotlin

FirebaseAnalytics.getInstance(this).logEvent("first_result_opened", null)

Java

FirebaseAnalytics.getInstance(YourActivity.this).logEvent("first_result_opened", null);

您測試的指標最終取決於應用程式使用模型的方式。

此時,您可以將應用程式部署至 Play 商店。應用程式會繼續使用原始模型,但您新增的 Remote Config 和 Analytics 程式碼可讓您只透過 Firebase 資訊主頁嘗試不同的模型。

3. 執行 A/B Testing 實驗

應用程式已交付給使用者,並開始收集數據分析資料,因此請建立 A/B Testing 實驗,測試使用新模型 (而非目前的模型) 的效果。

如要建立實驗,請按照下列步驟操作:

  1. Firebase 主控台的「事件」頁面上,確認您是否記錄相關的 Analytics 事件:啟用事件和目標指標。

    應用程式必須至少記錄一次每個事件,事件才會顯示在 Firebase 控制台中。

  2. Firebase 主控台中,開啟「A/B Testing專區。

  3. 建立新實驗:

    1. 依序點選「建立實驗」>「Remote Config

    2. 在「指定目標」部分中:

      • 從清單中選擇應用程式
      • 指定要納入實驗的使用者人數
      • 選取您開始記錄的啟用事件 (在本例中為 nondefault_model_downloaded)
    3. 在「目標」部分,從目標指標清單中選擇先前部分所確定的目標指標 (本例為 first_result_opened),然後選取要追蹤的其他指標,例如購買收益或無當機的使用者。

    4. 在「變體」部分中,定義兩個變體:

      • 控制組 (系統自動建立)
      • 實驗性植物標籤

      針對控制組,建立 plant_labeler_model 參數並將其設為 plant_labeler_v1。指派給控制組的使用者將使用舊版模型。(請勿將參數設為 (no change),因為您在應用程式中測試的是使用遠端值)。

      針對實驗植物標記器變化版本,請將 plant_labeler_model 參數設為 plant_labeler_v2 (假設您以該名稱發布新模型)。指派給這個變化版本的使用者會使用新模型。

開始實驗並讓實驗執行數天或更長時間,直到 A/B Testing 宣告領先者為止。如果實驗無法判定哪個版本表現最佳,您可能需要 將實驗擴大至更多使用者

4. 向所有使用者顯示最佳變化版本

A/B Testing 收集到足以宣告領先的資訊後 (在本例中,是能將熱門搜尋結果點擊次數最大化的變化版本),您可以決定是否要向所有使用者推出勝出的變化版本 (或其他變化版本)。

Firebase 控制台A/B Testing 部分中,開啟已完成實驗的詳細資料檢視畫面。透過這個檢視畫面,您可以根據目標指標和所選的次要指標,查看各個變化版本的成效。有了這項資訊,您就可以決定是否要推出領先變數或其他變數。

如要向所有使用者推出變化版本,請在實驗的詳細資料頁面中,依序點選 >「推出變化版本」。完成後,所有使用者的 plant_labeler_model 參數值都會變成 plant_labeler_v2

在日後的應用程式更新中,您應將 plant_labeler_model 參數的預設值變更為 plant_labeler_v2,並更新已使用的內含模型。不過,使用者已在使用最新的模型,因此您可以視情況將這項更新推送至已發布的應用程式,例如下次進行功能更新時。