После обучения новой пользовательской модели или модели AutoML Vision Edge вы можете использовать A/B-тестирование, чтобы увидеть, насколько хорошо новая модель работает в реальных условиях по сравнению с уже используемой моделью. После того, как вы подтвердите, что ваша новая модель является улучшением, вы можете легко развернуть новую модель для всех своих пользователей, не требуя обновления приложения.

На этой странице показано, как можно провести A/B-тестирование, оценивающее две версии модели, обеспечивающей функцию гипотетического визуального поиска растений. Эта функция использует настраиваемую модель маркировки изображений, чтобы помочь пользователям идентифицировать виды растений по их изображениям.
Предположим, вы только что опубликовали новую модель маркировки растений, plant_labeler_v2
, и хотите провести эксперимент, который сравнит ее с вашей текущей моделью, с именем plant_labeler_v1
. В приведенных ниже шагах показано, как настроить эксперимент, запустить его и принять меры по результатам.
1. Сделайте вашу модель дистанционно настраиваемой
Первым шагом к A/B-тестированию ваших моделей является изменение вашего приложения для использования параметра Remote Config, чтобы определить, какую модель оно использует. Первоначально вы установите значение по умолчанию для этого параметра, чтобы оно было моделью, которую ваше приложение уже использует, но поскольку имя модели контролируется удаленно настраиваемым параметром, вы можете изменять и экспериментировать с различными моделями без необходимости отправлять обновления приложения на ваш компьютер. пользователей каждый раз.
Итак, если вы опубликовали свою текущую модель под именем plant_labeler_v1
, вы должны в коде инициализации вашего приложения установить plant_labeler_v1
в качестве значения по умолчанию для параметра plant_labeler_model
, как в следующем примере:
Kotlin+KTX
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+KTX
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/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/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/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model
Теперь, когда ваше приложение использует параметр Remote Config для определения загружаемой модели, вы можете изменить модель, просто опубликовав новую модель и назначив ее имя параметру Remote Config. Эта возможность позволяет A/B-тестированию назначать разные модели разным пользователям с целью их сравнения.
Прежде чем продолжить, также внесите следующее дополнение в код загрузки модели:
Kotlin+KTX
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);
}
}
});
Приведенный выше код регистрирует пользовательское событие Google Analytics, которое вы будете использовать позже в качестве эксперимента.
2. Определите целевой показатель
Следующий шаг — решить, как вы будете измерять успех вашей модели, и убедиться, что ваше приложение собирает данные, необходимые для проверки того, насколько хорошо разные версии модели работают в соответствии с этой метрикой.
A/B-тестирование имеет несколько встроенных показателей, включая доход, ежедневную вовлеченность и удержание пользователей. Эти метрики часто полезны для тестирования различных UX-потоков или тонкой настройки параметров, но могут не иметь смысла для оценки вашей модели и варианта использования. В этой ситуации вы можете вместо этого попытаться оптимизировать пользовательское событие Google Analytics.
Используя в качестве примера функцию гипотетического визуального поиска растений, предположим, что вы представили результаты поиска своему пользователю в порядке уверенности модели в каждом результате. Один из способов получить представление о точности вашей модели — посмотреть, как часто пользователи открывали первый результат поиска.
Чтобы проверить, какая модель лучше всего достигает цели максимизации кликов по результатам, вы должны регистрировать пользовательское событие всякий раз, когда пользователь нажимает первый элемент в списке результатов.
Kotlin+KTX
FirebaseAnalytics.getInstance(this).logEvent("first_result_opened", null)
Java
FirebaseAnalytics.getInstance(YourActivity.this).logEvent("first_result_opened", null);
Метрика, которую вы тестируете, в конечном итоге зависит от того, как ваше приложение использует вашу модель.
На этом этапе вы можете развернуть свое приложение в Play Store. Ваше приложение продолжит использовать исходную модель, но добавленный вами код Remote Config and Analytics позволит вам экспериментировать с другими моделями, используя только консоль Firebase.
3. Проведите эксперимент по A/B-тестированию
Теперь, когда ваше приложение находится в руках ваших пользователей и собирает аналитические данные, создайте эксперимент A/B-тестирования, который проверяет эффект от использования вашей новой модели вместо текущей модели.
Чтобы создать эксперимент:
На странице « События » консоли Firebase убедитесь, что вы регистрируете соответствующие события Google Analytics: событие активации и показатель цели.
Ваше приложение должно зарегистрировать каждое событие хотя бы один раз, прежде чем оно появится в консоли Firebase.
В консоли Firebase откройте раздел A/B Testing .
Создайте новый эксперимент:
Щелкните Создать эксперимент > Удаленная настройка .
В разделе « Таргетинг »:
- Выберите свое приложение из списка
- Укажите, сколько ваших пользователей вы хотите включить в эксперимент
- Выберите событие активации, которое вы начали регистрировать (в этом примере, nondefault_model_downloaded )
В разделе « Цели » выберите целевую метрику, которую вы определили в предыдущем разделе (в данном примере, first_result_opened ) из списка целевых метрик, а также любые дополнительные метрики, которые вы хотите отслеживать, например доход от покупок или пользователей без сбоев.
В разделе Варианты определите два варианта:
- Группа управления (создается автоматически)
- Этикетировщик экспериментальных растений
Для группы Control создайте параметр
plant_labeler_model
и установите для него значениеplant_labeler_v1
. Пользователи, назначенные в контрольную группу, будут использовать старую модель. (Не устанавливайте для параметра значение(no change)
, так как в вашем приложении вы проверяете, что используете удаленное значение.)Для экспериментального варианта этикетировщика растений установите для параметра
plant_labeler_model
значениеplant_labeler_v2
(при условии, что вы опубликовали свою новую модель под этим именем). Пользователи, назначенные этому варианту, будут использовать новую модель.
Запустите эксперимент и дайте ему поработать несколько дней или больше, пока A/B-тестирование не объявит лидера. Если в ходе эксперимента не удается определить лидера, возможно, вам потребуется расширить эксперимент на большее количество пользователей .
4. Разверните выигрышный вариант для всех пользователей

После того, как A/B-тестирование соберет достаточно информации, чтобы объявить лидера — в данном случае вариант, который максимизирует количество кликов в результатах поиска — вы можете решить, следует ли развернуть выигрышный вариант (или другой вариант) для всех ваших пользователей.
В разделе A/B Testing консоли Firebase откройте представление сведений о завершенном эксперименте. В этом представлении вы можете увидеть, как каждый вариант работал в соответствии с вашей целевой метрикой и любыми дополнительными метриками, которые вы выбрали. С помощью этой информации вы можете решить, развертывать ли ведущий вариант или другой вариант.
Чтобы развернуть вариант для всех пользователей, нажмите more_vert > Развернуть вариант на странице сведений об эксперименте. Как только вы это сделаете, значение параметра plant_labeler_model
будет равно plant_labeler_v2
для всех пользователей.
В будущем обновлении приложения вы должны изменить значение параметра plant_labeler_model
по умолчанию на plant_labeler_v2
и обновить связанную модель, если вы ее используете. Однако ваши пользователи уже используют последнюю модель, поэтому вы можете отправить это обновление как часть опубликованного приложения, когда это будет удобно, например, когда вы в следующий раз сделаете обновление функции.