在 Android 上使用 ML Kit 產生智慧回覆

您可以使用 ML Kit 使用裝置端模型生成訊息回覆。

如要產生智慧回覆,您必須向 ML Kit 傳送對話中近期訊息的記錄。如果 ML Kit 判斷對話是以英文輸入,且對話不含潛在敏感主題,則 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. 建立對話記錄物件

為產生智慧回覆,您必須向 ML Kit 傳遞依時間排序的 FirebaseTextMessage 物件 List,且時間戳記位於最前面。

每當使用者傳送訊息時,請將訊息和訊息時間戳記新增至對話記錄:

Java

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

Kotlin

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

每當使用者收到訊息時,在對話記錄中加入訊息、訊息時間戳記,以及傳送者的使用者 ID。使用者 ID 可以是任何可在對話中識別寄件者的任何字串。使用者 ID 不需要對應至任何使用者資料,而且智慧回覆產生器的對話或叫用使用者 ID 不必保持一致。

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

對話記錄物件如下列範例所示:

時間戳記 使用者 ID 本機使用者? 訊息
2019 年 2 月 21 日星期四 13:13:39 (太平洋標準時間) 你正在路上嗎?
2019 年 2 月 21 日星期四 13:15:03 (太平洋標準時間) 朋友 false 抱歉,我遲到了!

請注意,上述範例中最新的訊息來自非本機使用者。這點非常重要,因為 ML Kit 建議回覆內容是由應用程式使用者 (本機使用者) 傳送。您應該傳送 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
}

請注意,如果模型對建議回覆的關聯性不足、輸入對話不是英文,或是模型偵測到敏感主題,ML Kit 可能不會傳回結果。