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

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

スマート リプライを生成するには、会話内の最近のメッセージのログを ML Kit に渡します。ML Kit は、会話が英語で、会話にデリケートなトピックの可能性がないと判断した場合、最大 3 つの返信を生成します。この返信はユーザーに提案できます。

始める前に

  1. Podfile に次の ML Kit Pod を含めます。
    pod 'GoogleMLKit/SmartReply', '3.2.0'
    
  2. プロジェクトの Pod をインストールまたは更新した後に、.xcworkspace を使用して Xcode プロジェクトを開きます。ML Kit は、Xcode バージョン 12.4 以降でサポートされています。

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

スマート リプライを生成するには、最も古いタイムスタンプを先頭にした TextMessage オブジェクトの配列を時系列順の配列に ML Kit に渡します。ユーザーがメッセージを送受信するたびに、メッセージ、そのタイムスタンプ、メッセージ送信者のユーザー ID を会話履歴に追加します。

ユーザー ID には、会話内の送信者を一意に識別する任意の文字列を使用できます。ユーザー ID は、ユーザーデータに対応する必要がなく、ユーザー ID は、スマート リプライ生成ツールの会話または呼び出し間で一貫している必要はありません。

返信を提案するユーザーがメッセージを送信した場合は、isLocalUser を true に設定します。

Swift

var conversation: [TextMessage] = []

// Then, for each message sent and received:
let message = TextMessage(
    text: "How are you?",
    timestamp: Date().timeIntervalSince1970,
    userID: "userId",
    isLocalUser: false)
conversation.append(message)

Objective-C

NSMutableArray *conversation = [NSMutableArray array];

// Then, for each message sent and received:
MLKTextMessage *message = [[MLKTextMessage alloc]
        initWithText:@"How are you?"
        timestamp:[NSDate date].timeIntervalSince1970
        userID:userId
        isLocalUser:NO];
[conversation addObject:message];

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

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

ML Kit は、会話履歴内の最後のメッセージへの返信を提案します。最後のメッセージは、ローカル ユーザーからのものではないメッセージにします。上記の例では、会話の最後のメッセージは、ローカル ユーザーではない Friendly0 さんからのメッセージです。このログパスを ML Kit に使用すると、FriendlyO' メッセージへのメッセージを提案できます。

2. メッセージへの返信を受け取る

メッセージに対するスマート リプライを生成するには、SmartReply のインスタンスを取得し、その会話履歴を suggestReplies(for:completion:) メソッドに渡します。

Swift

SmartReply.smartReply().suggestReplies(for: conversation) { result, error in
    guard error == nil, let result = result else {
        return
    }
    if (result.status == .notSupportedLanguage) {
        // The conversation's language isn't supported, so
        // the result doesn't contain any suggestions.
    } else if (result.status == .success) {
        // Successfully suggested smart replies.
        // ...
    }
}

Objective-C

MLKSmartReply *smartReply = [MLKSmartReply smartReply];
[smartReply suggestRepliesForMessages:inputText
                           completion:^(MLKSmartReplySuggestionResult * _Nullable result,
                                        NSError * _Nullable error) {
  if (error || !result) {
    return;
  }
  if (result.status == MLKSmartReplyResultStatusNotSupportedLanguage) {
      // The conversation's language isn't supported, so
      // the result doesn't contain any suggestions.
  } else if (result.status == MLKSmartReplyResultStatusSuccess) {
      // Successfully suggested smart replies.
      // ...
  }
}];

オペレーションが成功すると、SmartReplySuggestionResult オブジェクトが完了ハンドラに渡されます。このオブジェクトには、ユーザーに提示できる返信文の候補が 3 つまで含まれます。

Swift

for suggestion in result.suggestions {
  print("Suggested reply: \(suggestion.text)")
}

Objective-C

for (MLKSmartReplySuggestion *suggestion in result.suggestions) {
  NSLog(@"Suggested reply: %@", suggestion.text);
}

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