יצירת תשובות מהירות באמצעות ML Kit ב-Android

בעזרת ML Kit אפשר ליצור תשובות קצרות להודעות באמצעות מודל שנמצא במכשיר.

כדי ליצור תשובות מהירות, צריך להעביר ל-ML Kit יומן של ההודעות האחרונות שיחה. אם ערכת ML Kit מזהה שהשיחה היא באנגלית, השיחה לא מכילה נושא שעשוי להיות רגיש, למידת מכונה יוצרים עד שלוש תשובות, ואתם יכולים להציע אותן למשתמש.

בחבילהלא חלק מהחבילה
שם הספרייהcom.google.mlkit:smart-replycom.google.android.gms:play-services-mlkit-smart-reply
הטמעההמודל מקושר באופן סטטי לאפליקציה בזמן ה-build.הורדת המודל מתבצעת באופן דינמי דרך Google Play Services.
ההשפעה של גודל האפליקציההגדלה של כ-5.7MB.הגדלה של כ-200KB.
זמן האתחולהמודל זמין באופן מיידי.יכול להיות שתצטרכו להמתין להורדת המודל לפני השימוש הראשון.

רוצה לנסות?

לפני שמתחילים

  1. בקובץ build.gradle ברמת הפרויקט, חשוב לכלול את במאגר Maven בקטע buildscript וגם בקטע allprojects.

  2. הוספת יחסי התלות של ספריות ML Kit Android למודול של המודול ברמת האפליקציה, שהוא בדרך כלל app/build.gradle. יש לבחור אחד מ- בהתאם לצרכים שלכם:

    • כדי לצרף את המודל לאפליקציה:
    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:smart-reply:17.0.4'
    }
    
    • כדי להשתמש במודל ב-Google Play Services:
    dependencies {
      // ...
      // Use this dependency to use the dynamically downloaded model in Google Play Services
      implementation 'com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1'
    }
    

    אם בוחרים להשתמש במודל ב-Google Play Services, אפשר להגדיר האפליקציה תוריד את המודל באופן אוטומטי למכשיר אחרי שהאפליקציה ישירות מחנות Play. על ידי הוספת ההצהרה הבאה אל קובץ AndroidManifest.xml של האפליקציה:

    <application ...>
          ...
          <meta-data
              android:name="com.google.mlkit.vision.DEPENDENCIES"
              android:value="smart_reply" >
          <!-- To use multiple models: android:value="smart_reply,model2,model3" -->
    </application>
    

    אפשר גם לבדוק באופן מפורש את זמינות המודל ולבקש הורדה דרך API של ModuleInstallClient ב-Google Play Services.

    אם לא תפעילו הורדות של מודלים בזמן ההתקנה או תבקשו הורדה מפורשת, מתבצעת הורדה של המודל בפעם הראשונה שמפעילים את מחולל התשובות המהירות. בקשות שמבוצעות לפני סיום ההורדה לא מובילות לתוצאות.

    1. יצירת אובייקט של היסטוריית שיחות

    כדי ליצור תשובות מהירות, צריך להעביר ל-ML Kit List בסדר כרונולוגי מתוך TextMessage אובייקטים, עם חותמת הזמן המוקדמת ביותר.

    בכל פעם שהמשתמש שולח הודעה, הוסף את ההודעה ואת חותמת הזמן שלה אל היסטוריית שיחות:

    Kotlin

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

    Java

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

    בכל פעם שהמשתמש מקבל הודעה, הוסיפו את ההודעה, את חותמת הזמן שלה ואת מזהה המשתמש של השולח בהיסטוריית השיחות. User ID יכול להיות כל מחרוזת מזהה באופן ייחודי את השולח בשיחה. לא צריך את User ID בהתאם לנתוני המשתמש, ומזהה המשתמש לא חייב להיות עקבי בין שיחה לבין הפעלה של מחולל התשובות המהירות.

    Kotlin

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

    Java

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

    אובייקט של היסטוריית שיחות נראה כמו בדוגמה הבאה:

    חותמת זמן userID isLocalUser הודעה
    יום ה' 21 בפברואר 13:13:39 (שעון החוף המערבי) 2019 true בדרך?
    יום ה' 21 בפברואר 13:15:03 (שעון החוף המערבי) 2019 FRIEND0 false איחור, מצטערים!

    ML Kit מציע תשובות להודעה האחרונה בהיסטוריית השיחות. ההודעה האחרונה צריך להיות ממשתמש לא מקומי. בדוגמה שלמעלה, ההודעה האחרונה בשיחה הוא ממשתמש שאינו מקומי TABLE0. כשמשתמשים ביומן הזה להעברת ML Kit, הוא מציע תשובות להודעה של GAMEO: "איחור, סליחה!"

    2. קבלת תשובות להודעות

    כדי ליצור תשובות מהירות להודעות, צריך להוריד מופע של SmartReplyGenerator ומעבירים את היסטוריית השיחות לשיטה suggestReplies() שלה:

    Kotlin

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

    Java

    SmartReplyGenerator smartReply = SmartReply.getClient();
    smartReply.suggestReplies(conversation)
            .addOnSuccessListener(new OnSuccessListener() {
                @Override
                public void onSuccess(SmartReplySuggestionResult result) {
                    if (result.getStatus() == SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE) {
                        // The conversation's language isn't supported, so
                        // 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
                    // ...
                }
            });

    אם הפעולה מצליחה, אובייקט SmartReplySuggestionResult מועבר אל הגורם המטפל להצלחה. האובייקט הזה מכיל רשימה של עד שלוש הצעות לתשובות, שאפשר להציג למשתמש:

    Kotlin

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

    Java

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

    שימו לב: ייתכן ש-ML Kit לא יחזיר תוצאות אם המודל לא בטוח הרלוונטיות של ההצעות לתשובות, שיחת הקלט לא באנגלית, או אם המודל מזהה נושא רגיש.