Gerar respostas inteligentes com o Kit de ML no Android

O Kit de ML pode gerar respostas curtas a 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 de ML determinar que a conversa está em inglês e que ela não tem um assunto potencialmente sensível, ele vai gerar até três respostas, que podem ser sugeridas ao usuário.

AgrupadasDesagrupados
Nome da bibliotecacom.google.mlkit:smart-replycom.google.android.gms:play-services-mlkit-smart-reply
ImplementaçãoO modelo é estaticamente vinculado ao app no tempo de compilação.O download do modelo é feito dinamicamente pelo Google Play Services.
Impacto no tamanho do appAumento de aproximadamente 5,7 MB.Aumento de aproximadamente 200 KB no tamanho.
Tempo de inicializaçãoO modelo fica disponível imediatamente.Talvez seja necessário aguardar o download do modelo para usá-lo pela primeira vez.

Testar

Antes de começar

  1. No arquivo build.gradle no nível do projeto, inclua o repositório Maven do Google nas seções buildscript e allprojects.

  2. Adicione as dependências das bibliotecas do Android do Kit de ML ao arquivo Gradle do módulo no nível do app, que geralmente é app/build.gradle. Escolha uma das seguintes dependências com base nas suas necessidades:

    • Para agrupar o modelo e o app, faça o seguinte:
    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:smart-reply:17.0.3'
    }
    
    • Para usar o modelo no Google Play Services:
    dependencies {
      // ...
      // Use this dependency to use the dynamically downloaded model in Google Play Services
      implementation 'com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1'
    }
    

    Se você optar por usar o modelo no Google Play Services, poderá configurar seu app para fazer o download automático do modelo no dispositivo depois que o app for instalado da Play Store. Adicione a seguinte declaração ao arquivo AndroidManifest.xml do app:

    <application ...>
          ...
          <meta-data
              android:name="com.google.mlkit.vision.DEPENDENCIES"
              android:value="smart_reply" >
          <!-- To use multiple models: android:value="smart_reply,model2,model3" -->
    </application>
    

    Você também pode verificar explicitamente a disponibilidade do modelo e solicitar o download pela API ModuleInstallClient do Google Play Services.

    Se você não ativar os downloads do modelo no momento da instalação ou solicitar um download explícito, o modelo será transferido na primeira vez que você executar o gerador de resposta inteligente. As solicitações feitas antes da conclusão do download não produzem resultados.

    1. Criar um objeto de histórico de conversas

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

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

    Kotlin

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

    Java

    conversation.add(TextMessage.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 nem estar consistente entre conversas ou invocações do gerador de respostas inteligentes.

    Kotlin

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

    Java

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

    Um objeto de histórico de conversas é parecido com este exemplo:

    Carimbo de data/hora userID isLocalUser A mensagem
    Quinta-feira, 21 de fevereiro de 2019, 13:13:39 PST verdadeiro você está a caminho?
    Quinta-feira, 21 de fevereiro de 2019, 13:15:03 PST FRIEND0 false Desculpe, vou atrasar!

    O Kit de ML sugere respostas para a última mensagem de um histórico de conversas. A última mensagem precisa ser de um usuário não local. No exemplo acima, a última mensagem da conversa é do usuário não local FRIEND0. Quando você usa o Kit de ML de passagem desse registro, ele sugere respostas para a mensagem do FRIENDO: "Está atrasado, sinto muito!"

    2. Receber respostas de mensagens

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

    Kotlin

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

    Java

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

    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 podem ser apresentadas ao usuário:

    Kotlin

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

    Java

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

    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 sensível.