Gerar respostas inteligentes com o Kit de ML no Android

É possível usar o Kit de ML para gerar respostas de mensagens usando um modelo no dispositivo.

Para gerar respostas inteligentes, você transmite ao Kit de ML um registro das mensagens recentes de uma conversa. Se determinar que a conversa está em inglês e que ela não trata de um assunto potencialmente confidencial, o Kit vai gerar até três respostas, que podem ser sugeridas ao usuário.

Antes de começar

  1. Adicione o Firebase ao seu projeto para Android, caso ainda não tenha feito isso.
  2. Adicione as dependências das bibliotecas do Android do Kit de ML ao arquivo Gradle do módulo (nível do aplicativo) (geralmente 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. Também no arquivo build.gradle no nível do aplicativo, desative a compactação de arquivos tflite:
    android {
        // ...
        aaptOptions {
            noCompress "tflite"
        }
    }
    

1. Criar um objeto de histórico de conversas

Para gerar respostas inteligentes, você transmite para o Kit de ML uma List de objetos FirebaseTextMessage em ordem cronológica, com o carimbo de data/hora mais antigo primeiro.

Sempre que o usuário enviar uma mensagem, adicione-a com o carimbo de data/hora ao histórico de conversas:

Java

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

Kotlin

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

Sempre que o usuário receber uma mensagem, adicione a mensagem, o carimbo de data/hora e o ID do usuário do remetente ao histórico de conversas. O ID do usuário pode ser qualquer string que identifique exclusivamente o remetente na conversa. O ID do usuário não precisa corresponder a nenhum dado do usuário e não precisa estar consistente entre conversas ou invocações do gerador de respostas inteligentes.

Java

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

Kotlin

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

Um objeto de histórico de conversas é parecido com o exemplo a seguir:

Carimbo de data/hora ID do usuário Usuário local? Mensagem
Thu Feb 21 13:13:39 PST 2019 true are you on your way?
Thu Feb 21 13:15:03 PST 2019 FRIEND0 false Running late, sorry!

A mensagem mais recente no exemplo acima é de um usuário não local. Isso é importante porque o Kit de ML sugere respostas a serem enviadas pelo usuário do seu aplicativo, o usuário local. Verifique se você está transmitindo ao Kit de ML o registro de uma conversa que termina com uma mensagem à qual o usuário pode querer responder.

2. Receber respostas de mensagens

Para gerar respostas inteligentes a uma mensagem, receba uma instância de FirebaseSmartReply e transmita o histórico de conversas para o método suggestReplies():

Java

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
                // ...
            }
        });

Kotlin

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
            // ...
        }

Se a operação for bem-sucedida, um objeto SmartReplySuggestionResult será transmitido para o gerenciador de sucesso. Esse objeto contém uma lista de até três respostas sugeridas, que você pode apresentar ao usuário:

Java

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

Kotlin

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

Talvez o Kit de ML não retorne resultados se o modelo não estiver confiante na relevância das respostas sugeridas, se a conversa de entrada não estiver em inglês ou se o modelo detectar um assunto confidencial.