Ir para o console

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 o kit determinar que a conversa está em inglês e ela não tiver um assunto potencialmente confidencial, o kit gerará até três respostas, que podem ser sugeridas ao usuário.

Consulte o guia de início rápido do kit de ML (em inglês) no GitHub para ver um exemplo desta API em uso.

Antes de começar

  1. Adicione o Firebase ao seu projeto para Android, caso ainda não tenha feito isso.
  2. No seu arquivo build.gradle no nível do projeto, inclua o repositório Maven do Google nas seções buildscript e allprojects.
  3. Adicione as dependências das bibliotecas Android do kit de ML ao seu arquivo Gradle do módulo (nível do aplicativo) que geralmente é app/build.gradle:
    dependencies {
      // ...
      implementation 'com.google.firebase:firebase-ml-natural-language:20.0.0'
      implementation 'com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.0'
    }
    
  4. Além disso, no arquivo build.gradle no nível do aplicativo, desative a compactação dos 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 em ordem cronológica de objetos FirebaseTextMessage, 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 código do usuário do remetente ao histórico de conversas. O código do usuário pode ser qualquer string que identifique exclusivamente o remetente na conversa. O código do usuário não precisa corresponder a nenhum dado do usuário e não precisa ser consistente entre conversas ou chamadas do gerador de resposta inteligente.

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 Código 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 um registro de conversa que termina com uma mensagem a que o usuário pode querer responder.

2. Receber respostas de mensagens

Para gerar respostas inteligentes a uma mensagem, receba uma instância do 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
}

O kit de ML poderá não retornar 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.