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

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

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

始める前に

  1. まだアプリに Firebase を追加していない場合は、スタートガイドの手順に沿って追加してください。
  2. ML Kit ライブラリを Podfile に含めます:
    pod 'Firebase/MLCommon', '6.25.0'
    pod 'Firebase/MLNLSmartReply', '6.25.0'
    
    プロジェクトの Pod をインストールまたは更新した後に、.xcworkspace を使用して Xcode プロジェクトを開くようにしてください。
  3. アプリに Firebase をインポートします。

    Swift

    import Firebase

    Objective-C

    @import Firebase;

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:
FIRTextMessage *message = [[FIRTextMessage alloc]
        initWithText:@"How are you?"
        timestamp:[NSDate date].timeIntervalSince1970
        userID:userId
        isLocalUser:NO];
[conversation addObject:message];

次に、会話履歴オブジェクトの例を示します。

タイムスタンプ ユーザー 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. メッセージのリプライを取得する

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

Swift

let naturalLanguage = NaturalLanguage.naturalLanguage()
naturalLanguage.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
        // the result doesn't contain any suggestions.
    } else if (result.status == .success) {
        // Successfully suggested smart replies.
        // ...
    }
}

Objective-C

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

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

Swift

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

Objective-C

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

提案されたリプライの関連性にモデルが確信を持てない場合、入力された会話が英語ではない場合、またはモデルで機密性の高い話題が検出された場合、ML Kit によって結果が返されない可能性があります。