יצירת תשובות מהירות באמצעות 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 לקובץ ההדרגתיות של המודול ברמת האפליקציה, שהוא בדרך כלל 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.

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

    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 PST 2019 true האם אתה בדרך?
    ה' 21 בפברואר 13:15:03 PST 2019 FRIEND0 false סליחה, איחור!

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

    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 לא תחזיר תוצאות אם המודל לא בטוח ברלוונטיות של התשובות המוצעות, אם שיחת הקלט לא כתובה באנגלית או אם המודל מזהה נושא רגיש.