Как создавать быстрые ответы с помощью ML Kit на устройствах iOS

ML Kit может генерировать короткие ответы на сообщения, используя модель на устройстве.

Чтобы сгенерировать быстрые ответы, передайте в ML Kit журнал последних сообщений в чате. Если ML Kit определит, что разговор ведется на английском языке и не содержит потенциально конфиденциальных тем, он сгенерирует до трех вариантов ответа, которые вы сможете предложить пользователю.

Попробовать

Подготовка

  1. Добавьте в Podfile следующие контейнеры ML Kit:
    pod 'GoogleMLKit/SmartReply', '8.0.0'
    
  2. После установки или обновления Pods проекта откройте проект Xcode, используя файл .xcworkspace. ML Kit поддерживается в Xcode версии 12.4 и выше.

1. Как создать объект истории чата

Чтобы сгенерировать быстрые ответы, передайте в ML Kit хронологически упорядоченный массив объектов TextMessage, начиная с самой ранней временной метки. Когда пользователь отправляет или получает сообщение, добавьте сообщение, его временную метку и идентификатор пользователя отправителя в историю чата.

Идентификатор пользователя может быть любой строкой, которая уникальным образом идентифицирует отправителя в рамках разговора. Идентификатор пользователя не должен соответствовать каким-либо пользовательским данным и может быть разным в разных разговорах или при разных вызовах генератора быстрых ответов.

Если сообщение было отправлено пользователем, которому вы хотите предложить готовые ответы, задайте для 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 Сообщение
Четверг, 21 февраля 2019 г., 13:13:39 по тихоокеанскому стандартному времени true Ты уже едешь?
Thu Feb 21 13:15:03 PST 2019 FRIEND0 false Опаздываю, извините!

ML Kit предлагает готовые ответы на последнее сообщение в истории чата. Последнее сообщение должно быть от пользователя, не являющегося локальным. В примере выше последнее сообщение в чате отправлено пользователем FRIEND0, который не находится в том же регионе, что и вы. Когда вы используете ML Kit для обработки этого журнала, он предлагает ответы на сообщение FRIENDO: "Опаздываю, извини!"

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. Этот объект содержит список из трех вариантов ответа, которые можно предложить пользователю:

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 может не возвращать результаты, если модель не уверена в релевантности готовых ответов, если входной диалог не на английском языке или если модель обнаруживает деликатную тему.