获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Teste A/B de duas versões de um modelo

Depois de treinar um novo modelo personalizado ou modelo do AutoML Vision Edge, você pode usar o Teste A/B para ver o desempenho do novo modelo em condições reais, em comparação com o modelo que você já usa. Depois de confirmar que seu novo modelo é uma melhoria, você pode facilmente lançar o novo modelo para todos os seus usuários, sem precisar atualizar o aplicativo.

Esta página mostra como você pode conduzir um teste A/B que avalia duas versões de um modelo que alimenta um recurso hipotético de pesquisa visual de planta. Esse recurso usa um modelo de rotulagem de imagem personalizado para ajudar os usuários a identificar espécies de plantas a partir de imagens delas.

Suponha que você acabou de publicar um novo modelo de rotulagem de plantas, plant_labeler_v2 e deseja executar um experimento que o compare com seu modelo atual, denominado plant_labeler_v1 . As etapas abaixo mostram como configurar o experimento, executá-lo e agir sobre os resultados.

1. Torne seu modelo configurável remotamente

A primeira etapa para testar seus modelos A/B é modificar seu aplicativo para usar um parâmetro do Configuração remota para determinar qual modelo ele usa. Inicialmente, você definirá o valor padrão desse parâmetro para ser o modelo que seu aplicativo já usa, mas como o nome do modelo é controlado por um parâmetro configurável remotamente, você pode alterar e experimentar diferentes modelos sem precisar enviar atualizações do aplicativo para o seu usuários todas as vezes.

Portanto, se você publicou seu modelo atual com o nome plant_labeler_v1 , você deve, no código de inicialização do aplicativo, definir plant_labeler_v1 como o valor padrão do parâmetro plant_labeler_model , como no exemplo a seguir:

Rápido

let remoteConfig = RemoteConfig.remoteConfig()
let defaults = [
    "plant_labeler_model": "plant_labeler_v1" as NSObject,
    // ...
]
remoteConfig.setDefaults(defaults)
remoteConfig.fetchAndActivate()

Objetivo-C

FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig];
NSDictionary<NSString *, NSObject *> *defaults = @{
  @"plant_labeler_model" : (NSObject *)@"plant_labeler_v1",
  // ...
};
[remoteConfig setDefaults:defaults];
[remoteConfig fetchAndActivateWithCompletionHandler:nil];

Em seguida, altere o código de configuração do modelo para carregar o modelo especificado pelo parâmetro plant_labeler_model :

Rápido

let rcValue = remoteConfig.configValue(forKey: "plant_labeler_model")
guard let remoteModelName = rcValue.stringValue else { return }

// ...

let remoteModel = RemoteModel(
    name: remoteModelName,
    allowsModelUpdates: true,
    initialConditions: initialConditions,
    updateConditions: updateConditions
)
ModelManager.modelManager().register(remoteModel)

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

Objetivo-C

FIRRemoteConfigValue *rcValue = [remoteConfig configValueForKey:@"plant_labeler_model"];
NSString *remoteModelName = [rcValue stringValue];

// ...

FIRRemoteModel *remoteModel = [[FIRRemoteModel alloc] initWithName:remoteModelName
                                                allowsModelUpdates:YES
                                                 initialConditions:initialConditions
                                                  updateConditions:updateConditions];
[[FIRModelManager modelManager] registerRemoteModel:remoteModel];

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

Agora que seu aplicativo usa um parâmetro do Configuração remota para determinar qual modelo carregar, você pode alterar o modelo apenas publicando um novo modelo e atribuindo seu nome ao parâmetro Configuração remota. Esse recurso permite que o Teste A/B atribua modelos diferentes a usuários diferentes com o objetivo de compará-los.

Antes de continuar, faça também a seguinte adição ao código de download do seu modelo:

Rápido

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidSucceed,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let _ = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? RemoteModel,
        model.name == remoteModelName
        else { return }
    // If the model downloaded was specified by a remote parameter, log an
    // event, which will be our experiment's activation event.
    if rcValue.source == .remote {
        Analytics.logEvent("nondefault_model_downloaded", parameters: nil)
    }
}

Objetivo-C

__weak typeof(self) weakSelf = self;

[NSNotificationCenter.defaultCenter
    addObserverForName:FIRModelDownloadDidSucceedNotification
                object:nil
                 queue:nil
            usingBlock:^(NSNotification *_Nonnull note) {
              if (weakSelf == nil | note.userInfo == nil) {
                return;
              }

              FIRRemoteModel *model = note.userInfo[FIRModelDownloadUserInfoKeyRemoteModel];
              if ([model.name isEqualToString:remoteModelName] &&
                  rcValue.source == FIRRemoteConfigSourceRemote) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                [FIRAnalytics logEventWithName:@"nondefault_model_downloaded" parameters:nil];
              }
            }];

O código acima registra um evento personalizado do Analytics que você usará posteriormente como evento de ativação . Um evento de ativação é um evento que o usuário deve acionar antes de ser considerado parte do experimento. Isso garante que os usuários não sejam registrados no teste A/B até que o dispositivo termine de baixar o modelo de ML personalizado.

2. Determine uma métrica de meta

A próxima etapa é decidir como você medirá o sucesso do seu modelo e garantir que seu aplicativo esteja coletando os dados necessários para testar o desempenho de diferentes versões do modelo de acordo com essa métrica.

O Teste A/B tem várias métricas integradas, incluindo receita, engajamento diário e retenção de usuários. Essas métricas geralmente são úteis para testar diferentes fluxos de UX ou parâmetros de ajuste fino, mas podem não fazer sentido para avaliar seu modelo e caso de uso. Nessa situação, você pode tentar otimizar para um evento personalizado do Analytics.

Usando o recurso de pesquisa visual de planta hipotética como exemplo, suponha que você apresentou os resultados da pesquisa ao usuário na ordem de confiança do modelo em cada resultado. Uma maneira de ter uma ideia da precisão do seu modelo seria observar a frequência com que os usuários abriram o primeiro resultado da pesquisa.

Para testar qual modelo atingiu melhor o objetivo de maximizar os cliques nos principais resultados, você registraria um evento personalizado sempre que um usuário tocasse no primeiro item da lista de resultados.

Rápido

Analytics.logEvent("first_result_opened", parameters: nil)

Objetivo-C

[FIRAnalytics logEventWithName:@"first_result_opened" parameters:nil];

A métrica que você testa depende, em última análise, de como seu aplicativo usa seu modelo.

Neste ponto, você pode implantar seu aplicativo na App Store. Seu aplicativo continuará usando seu modelo original, mas o código do Configuração remota e do Analytics que você adicionou permitirá que você experimente modelos diferentes usando apenas o console do Firebase.

3. Faça um experimento de teste A/B

Agora que seu aplicativo está nas mãos de seus usuários e está coletando dados de análise, crie um experimento de teste A/B que teste o efeito de usar seu novo modelo em vez do modelo atual.

Para criar o experimento:

  1. Na página Eventos do console do Firebase, verifique se você está registrando os eventos relevantes do Analytics: o evento de ativação e a métrica da meta.

    Seu aplicativo precisa registrar cada evento pelo menos uma vez antes de aparecer no console do Firebase.

  2. No console do Firebase, abra a seção Teste A/B .

  3. Crie um novo experimento:

    1. Clique em Criar experimento > Configuração remota .

    2. Na seção Segmentação :

      • Escolha seu aplicativo na lista
      • Especifique quantos de seus usuários você deseja incluir na experiência
      • Selecione o evento de ativação que você começou a registrar (neste exemplo, nondefault_model_downloaded )
    3. Na seção Metas , escolha a métrica de meta que você determinou na seção anterior (neste exemplo, first_result_opened ) na lista de métricas de meta e selecione as métricas adicionais que deseja acompanhar, como receita de compra ou usuários sem falhas.

    4. Na seção Variantes , defina duas variantes:

      • Grupo de controle (criado automaticamente)
      • Rotuladora de plantas experimentais

      Para o grupo Controle , crie um parâmetro plant_labeler_model e defina-o como plant_labeler_v1 . Os usuários atribuídos ao grupo de controle usarão o modelo antigo. (Não defina o parâmetro como (no change) , pois em seu aplicativo você está testando que está usando um valor remoto.)

      Para a variante do rotulador de planta experimental , defina o parâmetro plant_labeler_model como plant_labeler_v2 (supondo que você publicou seu novo modelo com esse nome). Os usuários atribuídos a essa variante usarão o novo modelo.

    Tela de configuração do teste A/B

Inicie o experimento e deixe-o funcionar por vários dias ou mais, até que o Teste A/B declare um líder. Se a experiência não puder determinar um líder, talvez seja necessário expandir a experiência para mais usuários .

4. Distribua a variante vencedora para todos os usuários

Cartão de resultado do teste A/B

Depois que o Teste A/B coletar informações suficientes para declarar um líder (neste caso, a variante que maximizou os cliques nos principais resultados de pesquisa), você pode decidir se deseja lançar a variante vencedora (ou outra variante) para todos os seus usuários.

Na seção Teste A/B do console do Firebase , abra a visualização de detalhes do experimento concluído. Nessa visualização, você pode ver o desempenho de cada variante de acordo com sua métrica de meta e quaisquer métricas secundárias selecionadas. Com essas informações, você pode decidir se deseja lançar a variante principal ou outra variante.

Para lançar uma variante para todos os usuários, clique em > Implementar variante na página de detalhes do experimento. Depois de fazer isso, o valor do parâmetro plant_labeler_model será plant_labeler_v2 para todos os usuários.

Em uma atualização futura do aplicativo, você deve alterar o valor padrão do parâmetro plant_labeler_model para plant_labeler_v2 e atualizar o modelo empacotado se usar um. Seus usuários já estão usando o modelo mais recente, portanto, você pode enviar essa atualização como parte do aplicativo publicado sempre que for conveniente, como na próxima vez que você fizer uma atualização de recurso.