ML Kit を使用してスマート リプライを生成する(Android)

ML Kit では、デバイスモデルを使用してメッセージの返信を生成できます。

スマート リプライを生成するには、会話の中の最新のメッセージのログを ML Kit に渡します。ML Kit で、会話が英語であり、会話に機密性の高い話題が含まれていないと判断された場合、ML Kit で最大 3 つのリプライが生成されます。これをユーザーに提案できます。

始める前に

  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. 会話履歴オブジェクトを作成する

スマート リプライを生成するには、FirebaseTextMessage オブジェクトの List を時系列の順で ML Kit に渡します。最も早いタイムスタンプが最初です。

ユーザーがメッセージを送信するたびに、メッセージとそのタイムスタンプを会話履歴に追加します。

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 ローカル ユーザーかどうか メッセージ
Thu Feb 21 13:13:39 PST 2019 true まだ着きませんか?
Thu Feb 21 13:15:03 PST 2019 FRIEND0 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 によって結果が返されない可能性があります。