إنشاء "ردود سريعة" باستخدام "حزمة تعلُّم الآلة" على Android

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

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

قبل البدء

  1. أضِف Firebase إلى مشروع Android إذا لم يسبق لك إجراء ذلك.
  2. أضِف العناصر الاعتمادية لمكتبات ML Kit على Android إلى ملف Gradle للوحدة النمطية (على مستوى التطبيق) (عادةً app/build.gradle):
    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services'
    
    dependencies {
      // ...
      implementation 'com.google.firebase:firebase-ml-natural-language:22.0.0'
      implementation 'com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7'
    }
    
  3. وفي ملف build.gradle على مستوى التطبيق أيضًا، أوقِف ضغط ملفات tflite:
    android {
        // ...
        aaptOptions {
            noCompress "tflite"
        }
    }
    
    .

1- إنشاء كائن سجلّ المحادثات

لإنشاء ردود سريعة، يتم إرسال List من عناصر FirebaseTextMessage مرتّبة زمنيًا إلى مجموعة أدوات تعلُّم الآلة، مع إدراج الطابع الزمني الأقدم أولاً.

عندما يرسل المستخدم رسالة، أضِف الرسالة وطابعها الزمني إلى سجلّ المحادثات:

Java

conversation.add(FirebaseTextMessage.createForLocalUser(
        "heading out now", System.currentTimeMillis()));

Kotlin

conversation.add(FirebaseTextMessage.createForLocalUser(
        "heading out now", System.currentTimeMillis()))

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

Java

conversation.add(FirebaseTextMessage.createForRemoteUser(
        "Are you coming back soon?", System.currentTimeMillis(), userId));

Kotlin

conversation.add(FirebaseTextMessage.createForRemoteUser(
        "Are you coming back soon?", System.currentTimeMillis(), userId))

يبدو عنصر سجلّ المحادثات كما يلي:

الطابع الزمني رقم تعريف المستخدم هل أنت مستخدم محلي؟ مراسلة
الخميس 21 شباط (فبراير) الساعة 13:13:39 بتوقيت المحيط الهادئ 2019 صحيح هل أنت في طريقك؟
الخميس 21 شباط (فبراير)، 13:15:03 بتوقيت المحيط الهادئ 2019 الصديق0 خطأ عذرًا، سأتأخر!

يُرجى العلم أنّ أحدث رسالة في المثال أعلاه مُرسَلة من مستخدم غير محلي. وهذا أمر مهم لأنّ حزمة تعلّم الآلة تقترح الردود التي من المفترض أن يرسلها مستخدم تطبيقك، أي المستخدم المحلي. يجب التأكّد من ضبط سجلّ محادثات ينتهي برسالة قد يحتاج المستخدم إلى الرد عليها من خلال استخدام ML Kit.

2- الحصول على ردود على الرسائل

لإنشاء ردود سريعة على رسالة، يمكنك الحصول على نسخة افتراضية من FirebaseSmartReply وتمرير سجلّ المحادثات إلى طريقة suggestReplies() الخاصة بها:

Java

FirebaseSmartReply smartReply = FirebaseNaturalLanguage.getInstance().getSmartReply();
smartReply.suggestReplies(conversation)
        .addOnSuccessListener(new OnSuccessListener<SmartReplySuggestionResult>() {
            @Override
            public void onSuccess(SmartReplySuggestionResult result) {
                if (result.getStatus() == SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE) {
                    // The conversation's language isn't supported, so the
                    // the result doesn't contain any suggestions.
                } else if (result.getStatus() == SmartReplySuggestionResult.STATUS_SUCCESS) {
                    // Task completed successfully
                    // ...
                }
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
            }
        });

Kotlin

val smartReply = FirebaseNaturalLanguage.getInstance().smartReply
smartReply.suggestReplies(conversation)
        .addOnSuccessListener { result ->
            if (result.getStatus() == SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE) {
                // The conversation's language isn't supported, so the
                // the result doesn't contain any suggestions.
            } else if (result.getStatus() == SmartReplySuggestionResult.STATUS_SUCCESS) {
                // Task completed successfully
                // ...
            }
        }
        .addOnFailureListener {
            // Task failed with an exception
            // ...
        }

إذا نجحت العملية، يتم تمرير كائن SmartReplySuggestionResult إلى معالج النجاح. ويحتوي هذا العنصر على قائمة تضم ما يصل إلى 3 ردود مقترَحة، والتي يمكنك عرضها للمستخدم:

Java

for (SmartReplySuggestion suggestion : result.getSuggestions()) {
    String replyText = suggestion.getText();
}

Kotlin

for (suggestion in result.suggestions) {
    val replyText = suggestion.text
}

يُرجى العِلم أنّ حزمة تعلّم الآلة قد لا تعرض نتائج إذا لم يكُن النموذج متأكدًا من مدى صلة الردود المقترَحة، أو لم تكن المحادثة المستخدمة باللغة الإنجليزية، أو إذا رصد النموذج موضوعًا حسّاسًا.