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

您可以使用 ML Kit 使用裝置上的模型產生訊息回覆。

要產生智慧回复,您可以向 ML Kit 傳遞對話中最近訊息的日誌。如果 ML Kit 確定對話是英語,且對話沒有潛在的敏感主題,ML Kit 會產生最多三個回复,您可以向用戶建議這些回复。

在你開始之前

  1. 如果您尚未將 Firebase 新增至您的 Android 專案中,請將其新增至您的 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 ,其中最早的時間戳在前。

每當用戶發送訊息時,將訊息及其時間戳記新增至對話歷史記錄:

爪哇

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

科特林

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

每當用戶收到訊息時,都會將該訊息、其時間戳記和寄件者的用戶 ID 新增至對話記錄中。使用者 ID 可以是對話中唯一標識寄件者的任何字串。用戶ID不需要對應到任何用戶數據,且用戶ID不需要在智慧回復生成器的對話或呼叫之間保持一致。

爪哇

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

科特林

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

對話歷史記錄物件如下例所示:

時間戳使用者身分本地用戶?訊息
2019 年 2 月 21 日星期四 13:13:39(太平洋標準時間)真的你在路上嗎?
2019 年 2 月 21 日星期四 13:15:03(太平洋標準時間)朋友0錯誤的遲到了,抱歉!

請注意,上例中的最新消息來自非本地用戶。這很重要,因為 ML Kit 建議由應用程式的使用者(本機使用者)發送的回應。您應該確保向 ML Kit 傳遞一個對話日誌,該日誌以用戶可能想要回复的訊息結尾。

2. 獲取訊息回复

要產生對訊息的智慧回复,請取得FirebaseSmartReply的實例並將對話歷史記錄傳遞給其suggestReplies()方法:

爪哇

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
                // ...
            }
        });

科特林

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 個建議回應的列表,您可以將其呈現給使用者:

爪哇

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

科特林

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

請注意,如果模型對建議回應的相關性沒有信心、輸入對話不是英語或模型偵測到敏感主題,ML Kit 可能不會傳回結果。