اختبار A/B نسختان من نموذج

بعد تدريب نموذج مخصّص جديد، يمكنك استخدام A/B Testing لمعرفة مدى جودة أداء النموذج الجديد في الظروف الواقعية، مقارنةً بالنموذج الذي تستخدمه حاليًا. بعد التأكّد من أنّ النموذج الجديد يقدّم تحسّنًا، يمكنك طرحه بسهولة لجميع المستخدمين بدون الحاجة إلى تحديث التطبيق.

توضّح هذه الصفحة كيفية إجراء اختبار أ/ب لتقييم نسختَين من نموذج يتيح ميزة افتراضية للبحث المرئي عن النباتات. تستخدم هذه الميزة نموذجًا مخصّصًا لتصنيف الصور من أجل مساعدة المستخدمين في التعرّف على أنواع النباتات من صورها.

لنفترض أنّك نشرت للتو نموذجًا جديدًا لتصنيف النباتات، 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/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/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);
                }
            }
        });

يسجّل الرمز أعلاه حدثًا مخصّصًا في &quot;إحصاءات Google&quot; ستستخدمه لاحقًا كحدث تفعيل لتجربتك. حدث التفعيل هو حدث يجب أن ينفّذه المستخدم قبل أن يتم اعتباره جزءًا من التجربة. يضمن ذلك عدم تسجيل المستخدمين في اختبار أ/ب إلى أن ينتهي جهازهم من تنزيل نموذج تعلُّم الآلة المخصّص.

2. تحديد مقياس الهدف

الخطوة التالية هي تحديد كيفية قياس نجاح النموذج، والتأكّد من أنّ تطبيقك يجمع البيانات اللازمة لاختبار مدى أداء الإصدارات المختلفة من النموذج وفقًا لهذا المقياس.

تتضمّن A/B Testing العديد من المقاييس المضمّنة، بما في ذلك الأرباح والتفاعل اليومي والحفاظ على المستخدمين. غالبًا ما تكون هذه المقاييس مفيدة لاختبار مسارات تجربة المستخدم المختلفة أو ضبط المعلمات بدقة، ولكن قد لا تكون منطقية لتقييم النموذج وحالة الاستخدام. في هذه الحالة، يمكنك بدلاً من ذلك محاولة تحسين الأداء لحدث مخصّص في &quot;إحصاءات Google&quot;.

باستخدام ميزة البحث المرئي عن النباتات الافتراضية كمثال، لنفترض أنّك عرضت نتائج البحث للمستخدم بالترتيب وفقًا لمدى ثقة النموذج في كل نتيجة. إحدى الطرق التي يمكنك من خلالها الحصول على فكرة عن دقة نموذجك هي الاطّلاع على عدد المرات التي فتح فيها المستخدمون نتيجة البحث الأولى.

لاختبار النموذج الذي حقّق أفضل نتيجة في زيادة عدد النقرات على النتيجة الأولى، عليك تسجيل حدث مخصّص كلما نقر مستخدم على العنصر الأول في قائمة النتائج.

Kotlin

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

Java

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

يعتمد المقياس الذي تختبره في النهاية على طريقة استخدام تطبيقك للنموذج.

في هذه المرحلة، يمكنك نشر تطبيقك على "متجر Play". سيستمر تطبيقك في استخدام النموذج الأصلي، ولكن سيسمح لك الرمز Remote Config ورمز "إحصاءات Google" اللذان أضفتهما بتجربة نماذج مختلفة باستخدام وحدة تحكّم Firebase فقط.

3- إجراء تجربة A/B Testing

بعد أن أصبح تطبيقك متاحًا للمستخدمين وبدأ في جمع بيانات الإحصاءات، أنشئ تجربة A/B Testing تختبر تأثير استخدام النموذج الجديد بدلاً من النموذج الحالي.

لإنشاء التجربة، اتّبِع الخطوات التالية:

  1. في صفحة الأحداث ضمن وحدة تحكّم Firebase، تأكَّد من تسجيل أحداث &quot;إحصاءات Google&quot; ذات الصلة، أي حدث التفعيل ومقياس الهدف.

    يجب أن يسجّل تطبيقك كل حدث مرة واحدة على الأقل قبل أن يظهر في 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

ابدأ التجربة واتركها تعمل لعدة أيام أو أكثر إلى أن تحدّد A/B Testing إحدى المجموعات كالمجموعة الأفضل أداءً. إذا لم تتمكّن التجربة من تحديد صيغة رائدة، قد تحتاج إلى توسيع التجربة لتشمل المزيد من المستخدمين.

4. طرح الصيغة الفائزة لجميع المستخدمين

بطاقة نتائج اختبار A/B

بعد أن تجمع A/B Testing معلومات كافية لتحديد التصميم الأفضل أداءً، وهو في هذه الحالة التصميم الذي حقّق أكبر عدد من النقرات على نتيجة البحث الأولى، يمكنك تحديد ما إذا كنت تريد طرح التصميم الفائز (أو تصميم آخر) لجميع المستخدمين.

في قسم A/B Testing ضمن Firebase console، افتح عرض التفاصيل الخاص بالتجربة المكتملة. من طريقة العرض هذه، يمكنك الاطّلاع على مستوى أداء كل صيغة وفقًا لمقياس الهدف وأي مقاييس ثانوية اخترتها. باستخدام هذه المعلومات، يمكنك تحديد ما إذا كنت تريد طرح الإصدار الرئيسي أو إصدار آخر.

لطرح صيغة لجميع المستخدمين، انقر على > طرح الصيغة في صفحة تفاصيل التجربة. بعد إجراء ذلك، ستكون قيمة المَعلمة plant_labeler_model هي plant_labeler_v2 لجميع المستخدمين.

في تحديث التطبيق المستقبلي، عليك تغيير القيمة التلقائية للمَعلمة plant_labeler_model إلى plant_labeler_v2 وتعديل النموذج المجمّع إذا كنت تستخدم نموذجًا. مع ذلك، يستخدم المستخدمون حاليًا أحدث نموذج، لذا يمكنك طرح هذا التحديث كجزء من التطبيق المنشور متى كان ذلك مناسبًا، مثلاً عند إجراء تحديث للميزات في المرة القادمة.