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

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

スマート リプライを生成するには、会話内の最近のメッセージのログを ML Kit に渡します。ML Kit は、会話が英語であり、会話の主題が機密情報ではないと判断した場合、ML Kit は最大 3 つの返信を生成します。この返信をユーザーに提案できます。

スマート リプライの生成を統合するには、モデルをアプリの一部としてバンドルする方法と、Google Play 開発者サービスに依存するバンドルされていないモデルを使用する方法の 2 つがあります。バンドルされていないモデルを選択すると、アプリのサイズが小さくなります。詳しくは、以下の表をご覧ください。

バンドルバンドルなし
ライブラリ名com.google.mlkit:smart-replycom.google.android.gms:play-services-mlkit-smart-reply
実装モデルはビルド時に静的にアプリにリンクされます。モデルは Google Play 開発者サービスを介して動的にダウンロードされます。
アプリのサイズへの影響約 5.7 MB のサイズ増加。約 200 KB のサイズ増加。
初期化時間モデルはすぐに利用できます。モデルをダウンロードしてから最初の使用が必要になる場合があります。

始める前に

  1. プロジェクト レベルの build.gradle ファイルの buildscript セクションと allprojects セクションの両方に Google の Maven リポジトリを組み込みます。

  2. ML Kit Android ライブラリの依存関係をモジュールのアプリレベルの Gradle ファイル(通常は app/build.gradle)に追加します。ニーズに応じて、次のいずれかの依存関係を選択します。

    • モデルをアプリにバンドルするには:
    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:smart-reply:17.0.2'
    }
    
    • Google Play 開発者サービスでモデルを使用するには:
    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 開発者サービスでモデルを使用する場合は、アプリが 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>
    

    モデルの可用性を明示的に確認したり、Google Play 開発者サービスの ModuleInstallClient API を使用してダウンロードをリクエストしたりすることもできます。

    インストール時モデルのダウンロードを有効にしない場合や、明示的なダウンロードをリクエストしなかった場合、スマート リプライ生成ツールの初回実行時にモデルがダウンロードされます。ダウンロードが完了する前にリクエストを送信しても、結果はありません。

    1. 会話履歴オブジェクトを作成する

    スマート リプライを生成するには、ML Kit に、TextMessage オブジェクトを時系列にした List を渡します。

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

    Kotlin

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

    Java

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

    ユーザーがメッセージを受信するたびに、メッセージ、タイムスタンプ、送信者のユーザー ID を会話履歴に追加します。ユーザー ID は、会話内の送信者を一意に識別する任意の文字列です。ユーザー ID は、ユーザーデータに対応する必要はありません。また、スマート リプライ生成ツールの会話または呼び出し間でユーザー ID を一致させる必要はありません。

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

    会話履歴オブジェクトは、次の例のようになります。

    タイムスタンプ ユーザー ID isLocalUser メッセージ
    2019 年 2 月 21 日(木)13:13:39(太平洋標準時) true 今向かっていますか
    2019 年 2 月 21 日(木)13:15:03(太平洋標準時) お友達 false 遅れて申し訳ありません。

    ML Kit は会話履歴の最後のメッセージへの返信を提案します。最後のメッセージは、ローカル ユーザー以外からのものにする必要があります。上記の例では、会話の最後のメッセージは、ローカル ユーザー以外の Friendly0 さんからのメッセージです。このログパスで ML Kit を使用すると、FriendlyO のメッセージに対して「遅れて申し訳ありません。

    2. メッセージに返信する

    メッセージへのスマート リプライを生成するには、SmartReplyGenerator のインスタンスを取得し、その会話履歴を 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 オブジェクトが成功ハンドラに渡されます。このオブジェクトには、ユーザーに提示できる返信の候補が最大 3 つ含まれます。

    Kotlin

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

    Java

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

    返信候補の関連性が信頼できない場合、入力会話が英語でない場合、またはデリケートなテーマをモデルが検出した場合、ML Kit は結果を返しない可能性があります。