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

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

スマート リプライを生成するには、会話内の最近のメッセージのログを 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. 会話履歴オブジェクトを作成する

スマート リプライを生成するには、ML Kit に TextMessage オブジェクトの時系列の配列を渡し、最も古いタイムスタンプを最初に使用します。ユーザーがメッセージを送受信するたびに、メッセージ、タイムスタンプ、送信者のユーザー 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(太平洋標準時) 今向かっていますか
2019 年 2 月 21 日(木)13:15:03(太平洋標準時) お友達 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 は結果を返しない可能性があります。