การทดสอบ A/B กับโมเดล 2 เวอร์ชัน

หลังจากฝึกโมเดลที่กำหนดเองใหม่หรือโมเดล AutoML Vision Edge แล้ว คุณจะใช้ A/B Testingเพื่อดูว่าโมเดลใหม่ทำงานได้ดีเพียงใดในสภาพการใช้งานจริง เมื่อเทียบกับรุ่นที่คุณใช้งานอยู่ หลังจากคุณยืนยันว่ารูปแบบใหม่ของคุณคือ คุณสามารถเปิดตัวโมเดลใหม่ กับผู้ใช้ทั้งหมดได้อย่างง่ายดาย โดยไม่ต้องอัปเดตแอป

หน้านี้แสดงวิธีทำการทดสอบ A/B ที่มีการประเมิน 2 เวอร์ชัน ของโมเดลที่ขับเคลื่อนฟีเจอร์การค้นหาต้นไม้สมมติ ฟีเจอร์นี้ ใช้โมเดลการติดป้ายกำกับรูปภาพที่กำหนดเองเพื่อช่วยให้ผู้ใช้ระบุชนิดพืชจาก รูปภาพเหล่านั้น

สมมติว่าคุณเพิ่งเผยแพร่โมเดลการติดป้ายกำกับพืชใหม่ 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-kit/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml-kit/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-kit/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml-kit/android/use-custom-models#configure_a_local_model

ตอนนี้แอปใช้พารามิเตอร์ Remote Config เพื่อกำหนดโมเดลที่จะใช้ ของโมเดล คุณสามารถเปลี่ยนโมเดลได้โดยการเผยแพร่โมเดลใหม่และกำหนด ชื่อให้กับพารามิเตอร์ Remote Config ซึ่งความสามารถนี้ช่วยให้ A/B Testing มอบหมาย รูปแบบที่ต่างกันกับผู้ใช้ที่แตกต่างกันเพื่อจุดประสงค์ในการเปรียบเทียบ

ก่อนดำเนินการต่อ ให้ทำการดาวน์โหลดโมเดลต่อไปนี้เพิ่มเติม รหัส:

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

โค้ดข้างต้นจะบันทึกเหตุการณ์ Analytics ที่กำหนดเอง ซึ่งคุณจะนำมาใช้ในภายหลังเป็น เหตุการณ์การเปิดใช้งานของการทดสอบ เหตุการณ์การเปิดใช้งานคือเหตุการณ์ ผู้ใช้ต้องทริกเกอร์ก่อนที่จะถือว่าอยู่ในการทดสอบ ช่วงเวลานี้ ทำให้มั่นใจได้ว่าผู้ใช้จะไม่ถูกบันทึกในการทดสอบ A/B จนกว่าอุปกรณ์ของผู้ใช้จะ เสร็จสิ้นการดาวน์โหลดโมเดล ML Kit ที่กำหนดเอง

2. กำหนดเมตริกเป้าหมาย

ขั้นตอนถัดไปคือการตัดสินใจว่าจะวัดความสำเร็จของโมเดลอย่างไร และเพื่อให้มั่นใจว่าแอปรวบรวมข้อมูลที่จำเป็นต่อการทดสอบ โมเดลที่ต่างกันจะทำงานตามเมตริกนั้น

A/B Testing มีเมตริกในตัวมากมาย รวมถึงรายได้รายวัน การมีส่วนร่วม และการคงผู้ใช้ไว้ เมตริกเหล่านี้มักมีประโยชน์สำหรับการทดสอบ ขั้นตอน UX หรือพารามิเตอร์การปรับแต่งที่แตกต่างกัน แต่อาจไม่เหมาะ ประเมินโมเดลและกรณีการใช้งานของคุณ ในกรณีนี้ คุณสามารถลองแก้ปัญหา เพิ่มประสิทธิภาพสําหรับเหตุการณ์ 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 และโค้ด Analytics ที่คุณเพิ่มจะให้คุณทดสอบ ที่มีรุ่นต่างๆ โดยใช้เฉพาะคอนโซล Firebase

3. ทำการทดสอบ A/B Testing

เมื่อแอปของคุณอยู่ในส่วนของผู้ใช้ และเก็บรวบรวมข้อมูล Analytics อยู่ สร้างการทดสอบ A/B Testing ที่จะทดสอบผลจากการใช้ แทนรูปแบบปัจจุบัน

วิธีสร้างการทดสอบ

  1. ในหน้าเหตุการณ์ ของคอนโซล Firebase เพื่อยืนยันว่าคุณกำลังบันทึกข้อมูล เหตุการณ์ใน Analytics: เหตุการณ์การเปิดใช้งานและเมตริกเป้าหมาย

    แอปของคุณต้องบันทึกเหตุการณ์แต่ละเหตุการณ์อย่างน้อย 1 ครั้งก่อนที่จะปรากฏใน คอนโซล Firebase

  2. ในคอนโซล Firebase ให้เปิดส่วน A/B Testing

  3. สร้างการทดสอบใหม่

    1. คลิกสร้างการทดสอบ > Remote Config

    2. ในส่วนการกำหนดเป้าหมาย ให้ทำดังนี้

      • เลือกแอปจากรายการ
      • ระบุจำนวนผู้ใช้ที่คุณต้องการรวมไว้ในฟิลด์ การทดสอบ
      • เลือกเหตุการณ์การเปิดใช้งานที่คุณเริ่มบันทึก (ในตัวอย่างนี้ nondefault_model_downloaded)
    3. ในส่วนเป้าหมาย ให้เลือกเมตริกเป้าหมายที่ระบุไว้ใน ส่วนก่อนหน้า (ในตัวอย่างนี้คือ first_result_opened) จากรายการตัวชี้วัดเป้าหมาย และเลือกเมตริกอื่นๆ ที่คุณ ต้องการติดตาม เช่น รายได้จากการซื้อ หรือผู้ใช้ที่ไม่พบข้อขัดข้อง

    4. ในส่วนตัวแปร ให้กำหนดตัวแปร 2 รายการดังนี้

      • กลุ่มควบคุม (สร้างโดยอัตโนมัติ)
      • ผู้ติดป้ายกำกับโรงงานทดลอง

      สำหรับกลุ่มควบคุม ให้สร้าง plant_labeler_model และตั้งค่าเป็น plant_labeler_v1 ผู้ใช้ที่มอบหมายให้กับกลุ่มควบคุม จะใช้โมเดลเดิม (อย่าตั้งค่าพารามิเตอร์เป็น (no change) เนื่องจากในแอปคุณกำลังทดสอบว่าคุณใช้ ค่าระยะไกล)

      สําหรับตัวแปรผู้ติดป้ายกํากับพืชรุ่นทดลอง ให้ตั้งค่า plant_labeler_model พารามิเตอร์ไปยัง plant_labeler_v2 (สมมติว่าคุณได้เผยแพร่โมเดลใหม่แล้ว ภายใต้ชื่อนั้น) ผู้ใช้ที่กำหนดให้กับตัวแปรนี้จะใช้ โมเดล

เริ่มต้นการทดสอบและปล่อยให้มีการทำงานเป็นเวลาหลายวันหรือนานกว่านั้นจนกระทั่ง A/B Testing ประกาศตัวแปรที่ดีที่สุด หากการทดสอบไม่สามารถระบุตัวแปรที่ได้คะแนนนำ คุณอาจต้อง ขยายการทดสอบไปยังผู้ใช้จำนวนมากขึ้น

4. เริ่มใช้ตัวแปรที่ชนะกับผู้ใช้ทุกคน

หลังจาก A/B Testing รวบรวมข้อมูลได้มากพอที่จะประกาศ ตัวแปรที่ดีที่สุด ซึ่งในกรณีนี้คือตัวแปรที่ทำให้ผลการค้นหาอันดับบนสุดขยายตัวสูงสุด การคลิก — คุณสามารถตัดสินใจว่าจะเปิดตัวตัวแปรที่ชนะ (หรือตัวแปรอื่น) ) ให้แก่ผู้ใช้ทั้งหมด

ในส่วน A/B Testing ของคอนโซล Firebase ให้เปิดรายละเอียด ของการทดสอบที่เสร็จสมบูรณ์ จากมุมมองนี้ คุณจะเห็นวิธีที่แต่ละตัวแปร มีประสิทธิภาพตามเมตริกเป้าหมายและเมตริกรองที่คุณเลือก คุณสามารถใช้ข้อมูลนี้เพื่อตัดสินใจว่าจะเริ่มใช้ตัวแปรที่ดีที่สุดหรือ ตัวแปรอื่น

หากต้องการเปิดตัวตัวแปรกับผู้ใช้ทุกคน ให้คลิก เริ่มใช้ตัวแปรใน หน้ารายละเอียดของการทดสอบ เมื่ออัปโหลดแล้ว ค่าของ พารามิเตอร์ plant_labeler_model รายการจะเป็น plant_labeler_v2 สำหรับผู้ใช้ทุกคน

ในการอัปเดตแอปในอนาคต คุณควรเปลี่ยนค่าเริ่มต้นของ plant_labeler_model พารามิเตอร์เป็น plant_labeler_v2 และอัปเดตกลุ่ม หากคุณใช้ ผู้ใช้ของคุณกำลังใช้เวอร์ชันล่าสุดอยู่แล้ว ดังนั้น คุณก็ส่งการอัปเดตนี้ เป็นส่วนหนึ่งของแอปที่เผยแพร่ได้ทุกเมื่อที่สะดวก เช่น เมื่อคุณทำการอัปเดตฟีเจอร์ครั้งถัดไป