Eseguire test A/B di due versioni di un modello

Dopo aver addestrato un nuovo modello personalizzato o un modello AutoML Vision Edge, puoi utilizzare A/B Testing per valutare le prestazioni del nuovo modello in condizioni reali, rispetto al modello che utilizzi già. Dopo aver verificato che il nuovo modello rappresenta un miglioramento, puoi implementarlo facilmente per tutti gli utenti senza richiedere un aggiornamento dell'app.

Questa pagina mostra come eseguire un test A/B che valuta due versioni di un modello alla base di un'ipotetica funzionalità di ricerca di piante visive. Questa funzionalità utilizza un modello di etichettatura delle immagini personalizzato per aiutare gli utenti a identificare le specie di piante dalle relative immagini.

Supponiamo che tu abbia appena pubblicato un nuovo modello di etichettatura delle piante,plant_labeler_v2 e che tu voglia eseguire un esperimento per confrontarlo con il tuo modello attuale, denominato plant_labeler_v1. I passaggi riportati di seguito mostrano come configurare l'esperimento, eseguirlo e intervenire in base ai risultati.

1. Rendi il tuo modello configurabile da remoto

Il primo passaggio per eseguire test A/B dei modelli consiste nel modificare l'app in modo che utilizzi un parametro Remote Config per determinare il modello utilizzato. Inizialmente, impostare il valore predefinito di questo parametro sul modello già utilizzato dalla tua app, ma poiché il nome del modello è controllato da un parametro configurabile da remoto, puoi modificare e sperimentare diversi modelli senza dover inviare ogni volta aggiornamenti dell'app agli utenti.

Pertanto, se hai pubblicato il tuo modello attuale con il nome plant_labeler_v1, nel codice di inizializzazione dell'app imposterai plant_labeler_v1 come valore predefinito del parametro plant_labeler_model, come nell'esempio seguente:

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.
                  // ...
                }
            }
        });

Poi, modifica il codice di configurazione del modello per caricare il modello specificato dal parametro 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

Ora che la tua app utilizza un parametro Remote Config per determinare quale modello caricare, puoi modificarlo semplicemente pubblicando un nuovo modello e assegnando il relativo nome al parametro Remote Config. Questa funzionalità consente a A/B Testing di assegnare modelli diversi a utenti diversi al fine di confrontarli.

Prima di continuare, aggiungi anche la seguente istruzione al codice di download del modello:

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);
                }
            }
        });

Il codice riportato sopra registra un evento Analytics personalizzato che utilizzerai in seguito come evento di attivazione dell'esperimento. Un evento di attivazione è un evento che deve essere attivato dall'utente prima che venga considerato parte dell'esperimento. In questo modo, gli utenti non verranno registrati nel test A/B finché il loro dispositivo non avrà completato il download del modello ML Kit personalizzato.

2. Determina una metrica dell'obiettivo

Il passaggio successivo consiste nel decidere in che modo misurare il successo del modello e assicurarti che l'app raccolga i dati necessari per testare il rendimento di diverse versioni del modello in base a questa metrica.

A/B Testing include diverse metriche integrate, tra cui entrate, coinvolgimento giornaliero e fidelizzazione degli utenti. Queste metriche sono spesso utili per testare diversi flussi di UX o parametri di ottimizzazione, ma potrebbero non avere senso per valutare il modello e il caso d'uso. In questo caso, puoi provare a ottimizzare per un evento Analytics personalizzato.

Utilizzando l'ipotetica funzionalità di ricerca di piante visive come esempio, supponiamo di aver presentato all'utente i risultati di ricerca nell'ordine dell'affidabilità del modello per ciascun risultato. Un modo per avere un'idea dell'accuratezza del modello è esaminare la frequenza con cui gli utenti hanno aperto il primo risultato di ricerca.

Per verificare quale modello ha raggiunto meglio l'obiettivo di massimizzare i clic sui risultati principali, registra un evento personalizzato ogni volta che un utente tocca il primo elemento nell'elenco risultati.

Kotlin

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

Java

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

La metrica che testare dipende in ultima analisi da come la tua app utilizza il modello.

A questo punto, puoi eseguire il deployment dell'app sul Play Store. La tua app continuerà a utilizzare il modello originale, ma il codice Remote Config e Analytics che hai aggiunto ti consentirà di eseguire esperimenti con modelli diversi utilizzando solo la console Firebase.

3. Eseguire un esperimento A/B Testing

Ora che la tua app è nelle mani degli utenti e raccoglie dati di analisi, crea un esperimento A/B Testing che test l'effetto dell'utilizzo del nuovo modello anziché del modello attuale.

Per creare l'esperimento:

  1. Nella pagina Eventi della console Firebase, verifica di registrare gli eventi Analytics pertinenti: l'evento di attivazione e la metrica Obiettivo.

    L'app deve registrare ogni evento almeno una volta prima che venga visualizzato nella consoleFirebase.

  2. Nella console Firebase, apri la sezione A/B Testing.

  3. Crea un nuovo esperimento:

    1. Fai clic su Crea esperimento > Remote Config.

    2. Nella sezione Targeting:

      • Scegli l'app dall'elenco
      • Specifica il numero di utenti da includere nell'esperimento
      • Seleziona l'evento di attivazione di cui hai iniziato la registrazione (in questo esempio, nondefault_model_downloaded)
    3. Nella sezione Obiettivi, scegli la metrica dell'obiettivo che hai determinato nella sezione precedente (in questo esempio, first_result_opened) dall'elenco delle metriche dell'obiettivo e seleziona eventuali altre metriche da monitorare, come le entrate generate dagli acquisti o gli utenti senza arresti anomali.

    4. Nella sezione Varianti, definisci due varianti:

      • Gruppo di controllo (creato automaticamente)
      • Etichettatrice delle piante sperimentale

      Per il gruppo di controllo, crea un parametro plant_labeler_model e impostalo su plant_labeler_v1. Gli utenti assegnati al gruppo di controllo utilizzeranno il vecchio modello. Non impostare il parametro su (no change), poiché nella tua app stai testando l'utilizzo di un valore remoto.

      Per la variante Etichettatore di piante sperimentale, imposta il parametro plant_labeler_model su plant_labeler_v2 (supponendo che tu abbia pubblicato il nuovo modello con questo nome). Gli utenti assegnati a questa variante utilizzeranno il nuovo modello.

Avvia l'esperimento e lascialo in esecuzione per diversi giorni o più, finché A/B Testing non dichiara un leader. Se l'esperimento non riesce a determinare un gruppo di utenti di riferimento, potrebbe essere necessario estenderlo ad altri utenti.

4. Implementa la variante vincente per tutti gli utenti

Dopo che A/B Testing ha raccolto informazioni sufficienti per dichiarare un leader, in questo caso la variante che ha massimizzato i clic sui risultati di ricerca principali, puoi decidere se implementare la variante vincente (o un'altra variante) per tutti gli utenti.

Nella sezione A/B Testing della console Firebase, apri la visualizzazione dei dettagli dell'esperimento completato. In questa visualizzazione puoi vedere il rendimento di ogni variante in base alla metrica dell'obiettivo e alle eventuali metriche secondarie selezionate. Con queste informazioni, puoi decidere se implementare la variante principale o un'altra variante.

Per implementare una variante per tutti gli utenti, fai clic su > Implementa variante nella pagina dei dettagli dell'esperimento. In questo modo, il valore del parametro plant_labeler_model sarà plant_labeler_v2 per tutti gli utenti.

In un aggiornamento futuro dell'app, devi modificare il valore predefinito del parametro plant_labeler_model in plant_labeler_v2 e aggiornare il modello incluso se ne utilizzi uno. Tuttavia, i tuoi utenti utilizzano già il modello più recente, quindi puoi inviare questo aggiornamento nell'app pubblicata quando è opportuno, ad esempio al successivo aggiornamento delle funzionalità.