Setelah melatih model kustom atau AutoML Vision Edge baru, Anda dapat menggunakan Pengujian A/B untuk melihat seberapa baik performa model baru dalam kondisi di dunia nyata, dibandingkan dengan model yang sudah Anda gunakan. Setelah mengonfirmasi bahwa model baru tersebut memiliki performa lebih baik, Anda dapat dengan mudah meluncurkannya ke semua pengguna Anda, tanpa memerlukan update aplikasi.
Halaman ini menunjukkan bagaimana Anda dapat melakukan pengujian A/B yang mengevaluasi dua versi model yang mendukung suatu fitur fiktif penelusuran tanaman secara visual. Fitur ini menggunakan model pelabelan gambar kustom untuk membantu pengguna mengidentifikasi spesies tanaman dari gambarnya.
Misalnya Anda baru saja memublikasikan model pelabelan tanaman baru, plant_labeler_v2
dan Anda ingin menjalankan eksperimen yang membandingkannya dengan model saat ini, yang bernama plant_labeler_v1
. Langkah-langkah di bawah
menunjukkan cara menyiapkan eksperimen, menjalankannya, dan mengambil tindakan atas hasilnya.
1. Membuat agar model dapat dikonfigurasi dari jarak jauh
Langkah pertama untuk menguji A/B model Anda adalah dengan memodifikasi aplikasi Anda menggunakan parameter Remote Config untuk menentukan model mana yang digunakannya. Awalnya, Anda akan menetapkan nilai default parameter ini sebagai model yang telah digunakan aplikasi. Namun, karena nama model dikontrol oleh parameter yang dapat dikonfigurasi dari jarak jauh, Anda dapat mengubah dan bereksperimen dengan model yang berbeda tanpa harus selalu mendorong update aplikasi kepada pengguna.
Jadi, jika memublikasikan model saat ini dengan nama
plant_labeler_v1
, Anda akan menetapkan
plant_labeler_v1
sebagai nilai default parameter
plant_labeler_model
dalam kode inisialisasi aplikasi, seperti dalam contoh berikut:
Swift
let remoteConfig = RemoteConfig.remoteConfig()
let defaults = [
"plant_labeler_model": "plant_labeler_v1" as NSObject,
// ...
]
remoteConfig.setDefaults(defaults)
remoteConfig.fetchAndActivate()
Objective-C
FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig];
NSDictionary<NSString *, NSObject *> *defaults = @{
@"plant_labeler_model" : (NSObject *)@"plant_labeler_v1",
// ...
};
[remoteConfig setDefaults:defaults];
[remoteConfig fetchAndActivateWithCompletionHandler:nil];
Kemudian, ubah kode penyiapan model Anda untuk memuat model yang ditentukan oleh parameter
plant_labeler_model
:
Swift
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
Objective-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
Setelah aplikasi Anda menggunakan parameter Remote Config untuk menentukan model yang akan dimuat, Anda dapat mengubah model hanya dengan memublikasikan model baru dan menetapkan namanya ke parameter Remote Config. Dengan kemampuan ini, A/B Testing dapat menetapkan model yang berbeda untuk pengguna yang berbeda dengan tujuan membandingkannya.
Sebelum melanjutkan, masukkan tambahan berikut pada kode download model Anda:
Swift
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)
}
}
Objective-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];
}
}];
Kode di atas mencatat peristiwa Analytics kustom yang nantinya akan Anda gunakan sebagai
2. Menentukan metrik sasaran
Langkah berikutnya adalah menentukan cara untuk mengukur keberhasilan model Anda, dan memastikan aplikasi mengumpulkan data yang diperlukan untuk menguji seberapa baik performa berbagai versi model sesuai dengan metrik tersebut.
Pengujian A/B memiliki beberapa metrik bawaan, termasuk pendapatan, interaksi harian, dan retensi pengguna. Metrik ini sering berguna untuk menguji berbagai aliran UX atau meningkatkan parameter, tetapi belum tentu cocok untuk mengevaluasi model dan kasus penggunaan Anda. Dalam situasi ini, Anda dapat mencoba melakukan pengoptimalan untuk peristiwa Analytics kustom.
Dengan menggunakan contoh fiktif fitur penelusuran tanaman secara visual, misalnya Anda menyajikan hasil penelusuran kepada pengguna dalam urutan keyakinan model pada masing-masing hasil. Salah satu cara untuk mendapatkan gambaran tentang keakuratan model Anda adalah dengan melihat seberapa sering pengguna membuka hasil penelusuran pertama.
Untuk menguji model mana yang paling baik mencapai sasaran untuk memaksimalkan klik hasil teratas, Anda perlu mencatat peristiwa kustom setiap kali pengguna mengetuk item pertama dalam daftar hasil.
Swift
Analytics.logEvent("first_result_opened", parameters: nil)
Objective-C
[FIRAnalytics logEventWithName:@"first_result_opened" parameters:nil];
Metrik yang Anda uji pada akhirnya bergantung pada bagaimana aplikasi menggunakan model tersebut.
Kini Anda dapat men-deploy aplikasi ke App Store. Aplikasi Anda akan terus menggunakan model asli, tetapi Remote Config dan kode Analytics yang Anda tambahkan akan memungkinkan Anda bereksperimen dengan model yang berbeda hanya dengan menggunakan Firebase console.
3. Menjalankan eksperimen A/B Testing
Setelah aplikasi diterima pengguna dan aplikasi tersebut mengumpulkan data analisis, buat eksperimen A/B Testing yang menguji pengaruh penggunaan model baru, bukan model saat ini.
Untuk membuat eksperimen:
-
Pada halaman Events di Firebase console, verifikasikan bahwa Anda sedang mencatat aktivitas Analytics yang relevan: peristiwa aktivasi dan metrik sasaran.
Aplikasi Anda perlu mencatat setiap peristiwa setidaknya satu kali sebelum muncul di Firebase console.
-
Di Firebase console, buka bagian A/B Testing.
-
Buat eksperimen baru:
Klik Create experiment > Remote Config.
-
Di bagian Targeting:
- Pilih aplikasi Anda dari daftar
- Tentukan jumlah pengguna yang ingin Anda sertakan dalam eksperimen
- Pilih peristiwa aktivasi yang Anda mulai catat dalam log (dalam contoh ini, nondefault_model_downloaded)
-
Di bagian Goals, pilih metrik sasaran yang Anda tetapkan di bagian sebelumnya (dalam contoh ini, first_result_opened) dari daftar metrik sasaran, lalu pilih metrik tambahan yang ingin Anda lacak, seperti pendapatan pembelian atau pengguna bebas error.
-
Di bagian Variants, tentukan dua varian:
- Grup kontrol (dibuat secara otomatis)
- Pemberi label tanaman eksperimental
Untuk Grup kontrol, buat parameter
plant_labeler_model
dan tetapkan keplant_labeler_v1
. Pengguna yang ditetapkan ke grup kontrol akan menggunakan model lama. (Jangan tetapkan parameter ke(no change)
karena Anda menguji bahwa Anda menggunakan nilai jarak jauh di aplikasi.)Untuk varian Experimental plant labeler, tetapkan parameter
plant_labeler_model
keplant_labeler_v2
(dengan asumsi Anda telah memublikasikan model baru dengan nama tersebut). Pengguna yang ditetapkan ke varian ini akan menggunakan model baru.
Mulai eksperimen dan biarkan eksperimen ini berjalan selama beberapa hari, sampai A/B Testing menyatakan varian dominan. Jika eksperimen tidak dapat menentukan varian dominan, Anda mungkin perlu memperluas eksperimen ke lebih banyak pengguna.
4. Meluncurkan varian dominan ke semua pengguna
Setelah A/B Testing mengumpulkan cukup informasi untuk menyatakan varian dominan, dalam hal ini varian yang telah memaksimalkan klik hasil penelusuran teratas, Anda dapat memutuskan apakah akan meluncurkan varian dominan (atau varian lain) ke semua pengguna.
Di bagian A/B Testing di Firebase console, buka tampilan detail eksperimen yang telah diselesaikan. Dari tampilan ini, Anda dapat melihat performa setiap varian menurut metrik sasaran dan metrik sekunder mana pun yang Anda pilih. Dengan informasi ini, Anda dapat memutuskan apakah akan meluncurkan varian dominan atau varian lainnya.
Untuk meluncurkan varian kepada semua pengguna, klik
more_vert > Roll out variant di
halaman detail eksperimen. Setelah Anda melakukannya, nilai parameter
plant_labeler_model
akan menjadi plant_labeler_v2
untuk semua pengguna.
Dalam update aplikasi mendatang, Anda harus mengubah nilai default parameter
plant_labeler_model
ke plant_labeler_v2
dan memperbarui model
yang dipaketkan jika Anda menggunakannya. Namun, pengguna Anda sudah menggunakan model terbaru, sehingga
Anda dapat mendorong update ini sebagai bagian dari aplikasi yang dipublikasikan kapan pun diinginkan,
seperti saat Anda membuat update fitur berikutnya.