A/B একটি মডেলের দুটি সংস্করণ পরীক্ষা করে

একটি নতুন কাস্টম মডেলকে প্রশিক্ষণ দেওয়ার পর, আপনি আপনার ব্যবহৃত মডেলের তুলনায় বাস্তব পরিস্থিতিতে নতুন মডেলটি কতটা ভালো কাজ করে তা দেখার জন্য A/B Testing ব্যবহার করতে পারেন। আপনার নতুন মডেলটি যে আগেরটির চেয়ে উন্নত, তা নিশ্চিত করার পর, আপনি অ্যাপ আপডেট করার প্রয়োজন ছাড়াই সহজেই আপনার সকল ব্যবহারকারীর কাছে নতুন মডেলটি চালু করতে পারেন।

এই পৃষ্ঠায় দেখানো হয়েছে, কীভাবে আপনি একটি A/B টেস্ট পরিচালনা করতে পারেন, যা একটি কাল্পনিক ভিজ্যুয়াল উদ্ভিদ অনুসন্ধান ফিচারকে চালিত করে এমন একটি মডেলের দুটি সংস্করণ মূল্যায়ন করে। এই ফিচারটি একটি কাস্টম ইমেজ লেবেলিং মডেল ব্যবহার করে ব্যবহারকারীদের উদ্ভিদের ছবি থেকে তাদের প্রজাতি শনাক্ত করতে সাহায্য করে।

ধরুন, আপনি এইমাত্র plant_labeler_v2 নামে একটি নতুন উদ্ভিদ লেবেলিং মডেল প্রকাশ করেছেন এবং আপনি আপনার বর্তমান মডেল plant_labeler_v1 এর সাথে এর তুলনা করে একটি পরীক্ষা চালাতে চান। নিচের ধাপগুলোতে দেখানো হয়েছে কীভাবে পরীক্ষাটি সেট আপ করতে, চালাতে এবং ফলাফলের উপর ভিত্তি করে ব্যবস্থা নিতে হয়।

১. আপনার মডেলটিকে দূর থেকে নিয়ন্ত্রণযোগ্য করুন

আপনার মডেলগুলোর A/B টেস্টিং করার প্রথম ধাপ হলো, আপনার অ্যাপটিকে এমনভাবে পরিবর্তন করা যাতে এটি একটি Remote Config প্যারামিটার ব্যবহার করে নির্ধারণ করতে পারে যে অ্যাপটি কোন মডেল ব্যবহার করবে। প্রাথমিকভাবে, আপনি এই প্যারামিটারের ডিফল্ট মান হিসেবে সেই মডেলটি সেট করবেন যা আপনার অ্যাপ ইতিমধ্যেই ব্যবহার করছে। কিন্তু যেহেতু মডেলের নামটি একটি রিমোটলি কনফিগারযোগ্য প্যারামিটার দ্বারা নিয়ন্ত্রিত হয়, তাই প্রতিবার ব্যবহারকারীদের কাছে অ্যাপ আপডেট না পাঠিয়েই আপনি বিভিন্ন মডেল পরিবর্তন করে পরীক্ষা-নিরীক্ষা করতে পারবেন।

সুতরাং, যদি আপনি আপনার বর্তমান মডেলটি plant_labeler_v1 নামে প্রকাশ করে থাকেন, তাহলে আপনার অ্যাপ ইনিশিয়ালাইজেশন কোডে, plant_labeler_model প্যারামিটারের ডিফল্ট মান হিসেবে plant_labeler_v1 সেট করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

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);
                }
            }
        });

উপরের কোডটি একটি কাস্টম অ্যানালিটিক্স ইভেন্ট লগ করে, যা আপনি পরবর্তীতে আপনার এক্সপেরিমেন্টের জন্য ব্যবহার করবেন। সক্রিয়করণ ঘটনা অ্যাক্টিভেশন ইভেন্ট হলো এমন একটি ঘটনা যা ব্যবহারকারীকে অবশ্যই ঘটাতে হবে, অন্যথায় তাকে পরীক্ষার অংশ হিসেবে বিবেচনা করা হবে না। এটি নিশ্চিত করে যে, ব্যবহারকারীর ডিভাইসে তার নিজস্ব কাস্টম এমএল মডেল ডাউনলোড সম্পন্ন না হওয়া পর্যন্ত তাকে আপনার এ/বি টেস্টে রেকর্ড করা হবে না।

২. একটি লক্ষ্যমাত্রা নির্ধারণ করুন

পরবর্তী ধাপ হলো, আপনি আপনার মডেলের সাফল্য কীভাবে পরিমাপ করবেন তা স্থির করা, এবং সেই মাপকাঠি অনুযায়ী মডেলের বিভিন্ন সংস্করণ কতটা ভালো কাজ করে তা পরীক্ষা করার জন্য আপনার অ্যাপটি প্রয়োজনীয় ডেটা সংগ্রহ করছে কিনা তা নিশ্চিত করা।

A/B Testing বেশ কিছু বিল্ট-ইন মেট্রিক রয়েছে, যার মধ্যে রেভিনিউ, ডেইলি এনগেজমেন্ট এবং ইউজার রিটেনশন অন্তর্ভুক্ত। এই মেট্রিকগুলো প্রায়শই বিভিন্ন ইউএক্স ফ্লো পরীক্ষা করতে বা প্যারামিটারগুলো ফাইন-টিউন করার জন্য উপযোগী, কিন্তু আপনার মডেল এবং ইউজ কেস মূল্যায়ন করার জন্য এগুলো অর্থবহ নাও হতে পারে। এই পরিস্থিতিতে, আপনি এর পরিবর্তে একটি কাস্টম অ্যানালিটিক্স ইভেন্টের জন্য অপটিমাইজ করার চেষ্টা করতে পারেন।

কাল্পনিক ভিজ্যুয়াল প্ল্যান্ট সার্চ ফিচারের উদাহরণ দিয়ে বলা যায়, ধরুন আপনি আপনার ব্যবহারকারীর কাছে প্রতিটি ফলাফলের ওপর মডেলের আস্থার ক্রম অনুসারে অনুসন্ধানের ফলাফলগুলো উপস্থাপন করেছেন। আপনার মডেলের নির্ভুলতা সম্পর্কে ধারণা পাওয়ার একটি উপায় হতে পারে, ব্যবহারকারীরা কত ঘন ঘন প্রথম অনুসন্ধানের ফলাফলটি খুলেছেন তা দেখা।

কোন মডেলটি শীর্ষ ফলাফলের ক্লিক সর্বাধিক করার লক্ষ্য সবচেয়ে ভালোভাবে অর্জন করেছে তা পরীক্ষা করার জন্য, যখনই কোনো ব্যবহারকারী ফলাফল তালিকার প্রথম আইটেমটিতে ট্যাপ করবে, তখন আপনি একটি কাস্টম ইভেন্ট লগ করবেন।

Kotlin

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

Java

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

আপনি কোন মেট্রিকটি পরীক্ষা করবেন, তা শেষ পর্যন্ত নির্ভর করে আপনার অ্যাপ কীভাবে আপনার মডেলটি ব্যবহার করে তার ওপর।

এই পর্যায়ে, আপনি আপনার অ্যাপটি প্লে স্টোরে ডেপ্লয় করতে পারেন। আপনার অ্যাপটি আপনার মূল মডেলটিই ব্যবহার করতে থাকবে, কিন্তু আপনার যোগ করা Remote Config এবং অ্যানালিটিক্স কোড আপনাকে শুধুমাত্র Firebase কনসোল ব্যবহার করে বিভিন্ন মডেল নিয়ে পরীক্ষা-নিরীক্ষা করার সুযোগ দেবে।

৩. একটি A/B Testing পরীক্ষা চালান।

এখন যেহেতু আপনার অ্যাপটি ব্যবহারকারীদের হাতে রয়েছে এবং অ্যানালিটিক্স ডেটা সংগ্রহ করছে, তাই একটি A/B Testing এক্সপেরিমেন্ট তৈরি করুন যা বর্তমান মডেলের পরিবর্তে আপনার নতুন মডেল ব্যবহারের প্রভাব পরীক্ষা করবে।

পরীক্ষাটি তৈরি করতে:

  1. Firebase কনসোলের ইভেন্টস পেজে, যাচাই করুন যে আপনি প্রাসঙ্গিক অ্যানালিটিক্স ইভেন্টগুলো—অ্যাক্টিভেশন ইভেন্ট এবং গোল মেট্রিক—লগ করছেন।

    Firebase কনসোলে প্রদর্শিত হওয়ার আগে আপনার অ্যাপকে প্রতিটি ইভেন্ট অন্তত একবার লগ করতে হবে।

  2. Firebase কনসোলে, A/B Testing সেকশনটি খুলুন।

  3. একটি নতুন পরীক্ষা তৈরি করুন:

    1. এক্সপেরিমেন্ট তৈরি করুন > Remote Config ক্লিক করুন।

    2. টার্গেটিং বিভাগে:

      • তালিকা থেকে আপনার অ্যাপটি বেছে নিন
      • পরীক্ষায় আপনার কতজন ব্যবহারকারীকে অন্তর্ভুক্ত করতে চান তা নির্দিষ্ট করুন।
      • আপনি যে অ্যাক্টিভেশন ইভেন্টের লগিং শুরু করেছেন তা নির্বাচন করুন (এই উদাহরণে, nondefault_model_downloaded )।
    3. 'Goals' বিভাগে, গোল মেট্রিকের তালিকা থেকে পূর্ববর্তী বিভাগে আপনার নির্ধারিত গোল মেট্রিকটি (এই উদাহরণে, first_result_opened ) বেছে নিন এবং আপনি ট্র্যাক করতে চান এমন যেকোনো অতিরিক্ত মেট্রিক, যেমন ক্রয় থেকে আয় বা ক্র্যাশ-মুক্ত ব্যবহারকারী, নির্বাচন করুন।

    4. ভ্যারিয়েন্টস সেকশনে দুটি ভ্যারিয়েন্ট সংজ্ঞায়িত করুন:

      • নিয়ন্ত্রণ গোষ্ঠী (স্বয়ংক্রিয়ভাবে তৈরি)
      • পরীক্ষামূলক উদ্ভিদ লেবেলার

      কন্ট্রোল গ্রুপের জন্য, একটি plant_labeler_model প্যারামিটার তৈরি করুন এবং এটিকে plant_labeler_v1 এ সেট করুন। কন্ট্রোল গ্রুপে নিযুক্ত ব্যবহারকারীরা পুরোনো মডেলটি ব্যবহার করবেন। (প্যারামিটারটি (no change) -এ সেট করবেন না, কারণ আপনার অ্যাপে আপনি পরীক্ষা করছেন যে আপনি একটি রিমোট ভ্যালু ব্যবহার করছেন।)

      এক্সপেরিমেন্টাল প্ল্যান্ট লেবেলার ভ্যারিয়েন্টের জন্য, plant_labeler_model প্যারামিটারটি plant_labeler_v2 তে সেট করুন (যদি আপনি আপনার নতুন মডেলটি এই নামে প্রকাশ করে থাকেন)। এই ভ্যারিয়েন্টে নিযুক্ত ব্যবহারকারীরা নতুন মডেলটি ব্যবহার করবেন।

    এ/বি টেস্ট কনফিগারেশন স্ক্রিন

পরীক্ষাটি শুরু করুন এবং A/B Testing কোনো একটিকে সেরা হিসেবে ঘোষণা না করা পর্যন্ত এটিকে বেশ কয়েক দিন বা তার বেশি সময় ধরে চলতে দিন। যদি পরীক্ষাটি কোনো সেরাকে নির্ধারণ করতে না পারে, তাহলে আপনাকে আরও বেশি ব্যবহারকারীর মধ্যে পরীক্ষাটি প্রসারিত করতে হতে পারে।

৪. বিজয়ী সংস্করণটি সকল ব্যবহারকারীর জন্য চালু করুন।

এ/বি পরীক্ষার ফলাফল কার্ড

A/B Testing সেরা ভ্যারিয়েন্টটি (এই ক্ষেত্রে, যে ভ্যারিয়েন্টটি সার্চ রেজাল্টের শীর্ষে সর্বাধিক ক্লিক পেয়েছে) ঘোষণা করার জন্য যথেষ্ট তথ্য সংগ্রহ করার পর, আপনি বিজয়ী ভ্যারিয়েন্টটি (বা অন্য কোনো ভ্যারিয়েন্ট) আপনার সকল ব্যবহারকারীর জন্য চালু করবেন কিনা, সেই সিদ্ধান্ত নিতে পারেন।

Firebase কনসোলের A/B Testing বিভাগে, সম্পন্ন হওয়া এক্সপেরিমেন্টটির ডিটেইলস ভিউ খুলুন। এই ভিউ থেকে, আপনি দেখতে পারবেন আপনার গোল মেট্রিক এবং আপনার নির্বাচিত যেকোনো সেকেন্ডারি মেট্রিক অনুযায়ী প্রতিটি ভ্যারিয়েন্ট কেমন পারফর্ম করেছে। এই তথ্যের সাহায্যে, আপনি লিডিং ভ্যারিয়েন্টটি নাকি অন্য কোনো ভ্যারিয়েন্ট রোল আউট করবেন, সেই সিদ্ধান্ত নিতে পারবেন।

সকল ব্যবহারকারীর জন্য একটি ভ্যারিয়েন্ট চালু করতে, এক্সপেরিমেন্টের ডিটেইলস পেজে > Roll out variant-এ ক্লিক করুন। এটি করার পর, plant_labeler_model প্যারামিটারের মান সকল ব্যবহারকারীর জন্য plant_labeler_v2 হয়ে যাবে।

ভবিষ্যতের কোনো অ্যাপ আপডেটে, আপনার plant_labeler_model প্যারামিটারের ডিফল্ট মান পরিবর্তন করে plant_labeler_v2 করা উচিত এবং যদি কোনো বান্ডেলড মডেল ব্যবহার করে থাকেন, তবে সেটিও আপডেট করা উচিত। তবে, আপনার ব্যবহারকারীরা ইতিমধ্যেই সর্বশেষ মডেলটি ব্যবহার করছেন, তাই আপনার সুবিধামতো সময়ে, যেমন পরবর্তী কোনো ফিচার আপডেটের সময়, আপনি প্রকাশিত অ্যাপের অংশ হিসেবে এই আপডেটটি যুক্ত করে দিতে পারেন।