Как генерировать быстрые ответы с помощью ML Kit на Android

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

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

ПакетныйОтдельно
Название библиотекиcom.google.mlkit:smart-replycom.google.android.gms:play-services-mlkit-smart-reply
РеализацияМодель статически связывается с приложением во время сборки.Модель динамически скачивается через сервисы Google Play.
Влияние размера приложенияРазмер увеличится примерно на 5,7 МБ.Размер увеличивается примерно на 200 КБ.
Время инициализацииМодель доступна сразу.Перед первым использованием может потребоваться подождать, пока модель скачается.

Попробовать

Подготовка

  1. В файле build.gradle на уровне проекта убедитесь, что репозиторий Google Maven включен в разделы buildscript и allprojects.

  2. Добавьте зависимости для библиотек ML Kit для Android в файл gradle на уровне приложения вашего модуля, который обычно называется app/build.gradle. Выберите одну из следующих зависимостей в зависимости от ваших потребностей:

    • Чтобы добавить модель в приложение:
    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:smart-reply:17.0.4'
    }
    
    • Чтобы использовать модель в сервисах Google Play:
    dependencies {
      // ...
      // Use this dependency to use the dynamically downloaded model in Google Play Services
      implementation 'com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1'
    }
    

    Если вы решите использовать модель в сервисах Google Play, то сможете настроить автоматическую загрузку модели на устройство после установки приложения из Google Play. Добавив в файл AndroidManifest.xml приложения следующую декларацию:

    <application ...>
          ...
          <meta-data
              android:name="com.google.mlkit.vision.DEPENDENCIES"
              android:value="smart_reply" >
          <!-- To use multiple models: android:value="smart_reply,model2,model3" -->
    </application>
    

    Вы также можете проверить доступность модели и запросить ее скачивание с помощью ModuleInstallClient API сервисов Google Play.

    Если вы не включите скачивание модели во время установки или не запросите явное скачивание, модель будет скачана при первом запуске генератора быстрых ответов. Запросы, отправленные до завершения скачивания, не будут обработаны.

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

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

    Каждый раз, когда пользователь отправляет сообщение, добавляйте его и временную метку в историю чата:

    Kotlin

    conversation.add(TextMessage.createForLocalUser(
            "heading out now", System.currentTimeMillis()))

    Java

    conversation.add(TextMessage.createForLocalUser(
            "heading out now", System.currentTimeMillis()));

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

    Kotlin

    conversation.add(TextMessage.createForRemoteUser(
            "Are you coming back soon?", System.currentTimeMillis(), userId))

    Java

    conversation.add(TextMessage.createForRemoteUser(
            "Are you coming back soon?", System.currentTimeMillis(), userId));

    Объект истории чата выглядит следующим образом:

    Временная метка 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. Как получать ответы на сообщения

    Чтобы сгенерировать быстрые ответы на сообщение, получите экземпляр SmartReplyGenerator и передайте историю чата в его метод suggestReplies():

    Kotlin

    val smartReplyGenerator = SmartReply.getClient()
    smartReply.suggestReplies(conversation)
            .addOnSuccessListener { result ->
                if (result.getStatus() == SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE) {
                    // The conversation's language isn't supported, so
                    // the result doesn't contain any suggestions.
                } else if (result.getStatus() == SmartReplySuggestionResult.STATUS_SUCCESS) {
                    // Task completed successfully
                    // ...
                }
            }
            .addOnFailureListener {
                // Task failed with an exception
                // ...
            }

    Java

    SmartReplyGenerator smartReply = SmartReply.getClient();
    smartReply.suggestReplies(conversation)
            .addOnSuccessListener(new OnSuccessListener() {
                @Override
                public void onSuccess(SmartReplySuggestionResult result) {
                    if (result.getStatus() == SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE) {
                        // The conversation's language isn't supported, so
                        // the result doesn't contain any suggestions.
                    } else if (result.getStatus() == SmartReplySuggestionResult.STATUS_SUCCESS) {
                        // Task completed successfully
                        // ...
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    // Task failed with an exception
                    // ...
                }
            });

    Если операция выполнена успешно, обработчику передается объект SmartReplySuggestionResult. Этот объект содержит список из трех вариантов ответа, которые можно предложить пользователю:

    Kotlin

    for (suggestion in result.suggestions) {
        val replyText = suggestion.text
    }

    Java

    for (SmartReplySuggestion suggestion : result.getSuggestions()) {
        String replyText = suggestion.getText();
    }

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