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

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

כדי ליצור תשובות מהירות, צריך להעביר ל-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 של Google בקטע buildscript וגם בקטע allprojects.

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

    • כדי לצרף את המודל לאפליקציה:
    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:smart-reply:17.0.3'
    }
    
    • כדי להשתמש במודל ב-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>
    

    תוכלו גם לבדוק באופן מפורש את זמינות המודל ולבקש הורדה דרך ModuleInstallClient API של 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()));

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

    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 מציע תשובות להודעה האחרונה בהיסטוריית השיחות. ההודעה האחרונה צריכה להישלח ממשתמש שאינו מקומי. בדוגמה שלמעלה, ההודעה האחרונה בשיחה היא מהמשתמש הלא-מקומי REGION. כשמשתמשים ביומן הזה של Pass ML Kit, הוא מציע תשובות להודעה של COMO: "מושהה, סליחה!"

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

    כדי ליצור תשובות מהירות להודעות, תצטרכו להוריד מופע של SmartReplyGenerator ולהעביר את היסטוריית השיחה ל-method 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 מועבר ל-handler של ההצלחה. האובייקט הזה מכיל רשימה של עד שלוש הצעות לתשובות, ואפשר להציג אותן למשתמש:

    Kotlin

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

    Java

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

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