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

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

タイムスタンプ userID isLocalUser メッセージ
2019 年 2 月 21 日(木)13:13:39(木)PST true 経路は?
2019 年 2 月 21 日(木)13:15:03(太平洋標準時) FRIEND0 false 遅れて申し訳ございません。

ML Kit は、会話履歴の最後のメッセージへの返信を提案します。最後のメッセージは、ローカル ユーザー以外のユーザーから送信されたものである必要があります。上記の例では、会話の最後のメッセージは、ローカル以外のユーザー friend0 から送信されたものです。パス ML Kit を使用すると、このログから FriendO のメッセージ「Running late, there!」に対する返信が提案されます。

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 は結果を返さないことがあります。