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:

conversation.add(FirebaseTextMessage.createForLocalUser(
       
"heading out now", System.currentTimeMillis()));
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.

conversation.add(FirebaseTextMessage.createForRemoteUser(
       
"Are you coming back soon?", System.currentTimeMillis(), userId));
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() :

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

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:

for (SmartReplySuggestion suggestion : result.getSuggestions()) {
   
String replyText = suggestion.getText();
}
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.