Генерируйте умные ответы с помощью ML Kit на Android

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

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

Прежде чем вы начнете

  1. Если вы еще этого не сделали, добавьте Firebase в свой проект Android .
  2. Добавьте зависимости для библиотек Android ML Kit в файл Gradle вашего модуля (на уровне приложения) (обычно app/build.gradle ):
    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services'
    
    dependencies {
      // ...
      implementation 'com.google.firebase:firebase-ml-natural-language:22.0.0'
      implementation 'com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7'
    }
    
  3. Также в файле build.gradle на уровне приложения отключите сжатие файлов tflite :
    android {
        // ...
        aaptOptions {
            noCompress "tflite"
        }
    }
    

1. Создайте объект истории разговоров.

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

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

Джава

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

Котлин

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

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

Джава

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

Котлин

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

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

Временная метка ID пользователя Локальный пользователь? Сообщение
Четверг, 21 февраля, 13:13:39 по тихоокеанскому стандартному времени 2019 г. истинный ты уже в пути?
Чт, 21 февраля, 13:15:03 по тихоокеанскому стандартному времени 2019 г. ДРУГ0 ЛОЖЬ Опаздываю, извините!

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

2. Получите ответы на сообщения

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

Джава

FirebaseSmartReply smartReply = FirebaseNaturalLanguage.getInstance().getSmartReply();
smartReply.suggestReplies(conversation)
        .addOnSuccessListener(new OnSuccessListener<SmartReplySuggestionResult>() {
            @Override
            public void onSuccess(SmartReplySuggestionResult result) {
                if (result.getStatus() == SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE) {
                    // The conversation's language isn't supported, so the
                    // 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
                // ...
            }
        });

Котлин

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

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

Джава

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

Котлин

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

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