Gere respostas inteligentes com kit de ML no Android

Você pode usar o ML Kit para gerar respostas de mensagens usando um modelo no dispositivo.

Para gerar respostas inteligentes, você passa ao ML Kit um registro de mensagens recentes em uma conversa. Se o ML Kit determinar que a conversa está em inglês e que a conversa não tem assunto potencialmente delicado, o ML Kit gera até três respostas, que você pode sugerir ao usuário.

Antes de você começar

  1. Adicione o Firebase ao seu projeto Android , caso ainda não o tenha feito.
  2. Adicione as dependências das bibliotecas Android do ML Kit 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. Crie um objeto de histórico de conversa

Para gerar respostas inteligentes, você passa ao ML Kit uma List ordenada cronologicamente de objetos FirebaseTextMessage , com o carimbo de data/hora mais antigo primeiro.

Sempre que o usuário enviar uma mensagem, adicione a mensagem e seu carimbo de data/hora ao histórico da conversa:

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, seu carimbo de data/hora e o ID do usuário do remetente ao histórico da conversa. 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 ser consistente entre conversas ou invocações 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 conversa se parece com o exemplo a seguir:

Carimbo de data e hora ID do usuário Usuário local? Mensagem
Qui, 21 de fevereiro, 13:13:39 PST de 2019 verdadeiro você está no seu caminho?
Qui, 21 de fevereiro, 13:15:03 PST de 2019 AMIGO0 falso Atrasado, desculpe!

Observe que a mensagem mais recente no exemplo acima é de um usuário não local. Isso é importante porque o ML Kit sugere respostas que devem ser enviadas pelo usuário do seu aplicativo: o usuário local. Você deve passar ao Kit de ML um registro de conversa que termina com uma mensagem à qual seu usuário pode querer responder.

2. Obtenha respostas de mensagens

Para gerar respostas inteligentes a uma mensagem, obtenha uma instância do FirebaseSmartReply e passe o histórico da conversa para seu 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á passado para o manipulador de sucesso. Este objeto contém uma lista de até 3 respostas sugeridas, que você pode apresentar ao seu usuário:

Java

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

Kotlin

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

Observe que 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 assuntos confidenciais.