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

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

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

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

1. إتاحة إمكانية ضبط النموذج عن بُعد

الخطوة الأولى لإجراء اختبار أ/ب للنماذج هي تعديل تطبيقك لاستخدام مَعلمة 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/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 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);
                }
            }
        });

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

2- تحديد مقياس هدف

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

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

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

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

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، تأكَّد من تسجيل أحداث "إحصاءات Google" ذات الصلة: حدث التفعيل ومقياس الهدف.

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

      بالنسبة إلى الصيغة Experimental plant labeler (تصنيف النباتات التجريبي)، اضبط المَعلمة plant_labeler_model على plant_labeler_v2 (على افتراض أنّك نشرت النموذج الجديد تحت هذا الاسم). سيستخدم المستخدمون الذين تمّ إسنادهم إلى هذا السعر المتغير النموذج الجديد.

    شاشة إعداد اختبار أ/ب

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

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

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

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

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

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

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