在 Android 系统中使用机器学习套件生成智能回复

机器学习套件可以使用设备端模型生成对消息的简短回复。

如需生成智能回复,请向机器学习套件传递对话中近期消息的日志。如果机器学习套件确定对话为英语,并且对话没有潜在的敏感主题,则会生成最多三个回复,您可以向用户推荐这些回复。

捆绑不捆绑
库名称com.google.mlkit:smart-replycom.google.android.gms:play-services-mlkit-smart-reply
实现模型在构建时静态关联到您的应用。模型通过 Google Play 服务动态下载。
对应用大小的影响大小增加约 5.7 MB。大小增加约 200 KB。
初始化时间模型立即可用。可能必须等待模型下载完毕,然后才能首次使用。

试试看

准备工作

  1. 请务必在您的项目级 build.gradle 文件中的 buildscriptallprojects 部分添加 Google 的 Maven 制品库。

  2. 将 Android 版机器学习套件库的依赖项添加到模块的应用级 Gradle 文件(通常为 app/build.gradle)。根据您的需求选择以下依赖项之一:

    • 如需将模型与您的应用捆绑在一起,请执行以下操作:
    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:smart-reply:17.0.3'
    }
    
    • 如需在 Google Play 服务中使用该模型,请执行以下操作:
    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'
    }
    

    如果您选择在 Google Play 服务中使用该模型,则可以将应用配置为在用户从 Play 商店安装您的应用后,自动将该模型下载到设备上。将以下声明添加到应用的 AndroidManifest.xml 文件:

    <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>
    

    您还可以通过 Google Play 服务 ModuleInstallClient API 明确检查模型可用性并请求下载。

    如果您未启用安装时模型下载或请求显式下载模型,系统会在您首次运行智能回复生成器时下载模型。您在下载完成之前提出的请求不会产生任何结果。

    1. 创建对话历史记录对象

    如需生成智能回复,请向机器学习套件传递按时间排序的 TextMessage 对象的 List,时间戳早的排在最前面。

    每当用户发送消息时,将消息及其时间戳添加到对话记录中:

    Kotlin

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

    Java

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

    每当用户收到消息时,都将消息、消息时间戳和发送者的用户 ID 添加到对话历史记录中。用户 ID 可以是任何可唯一标识对话中的发送者的字符串。用户 ID 不需要与任何用户数据相对应,并且在智能回复生成器的对话或调用之间也不需要保持一致。

    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));

    对话历史记录对象如以下示例所示:

    时间戳 userID isLocalUser 消息
    太平洋标准时间 2019 年 2 月 21 日星期四 13:13:39 true 你在路上吗?
    太平洋标准时间 2019 年 2 月 21 日星期四 13:15:03 FRIEND0 false 要迟到了,对不起!

    机器学习套件会针对对话记录中的最后一封邮件提供回复建议。最后一条消息应来自非本地用户。在上例中,对话中的最后一条消息来自非本地用户 FRIEND0。当您使用“传递机器学习套件此日志”时,它会针对 FRIENDO 的消息“运行晚点,抱歉!”提供建议回复。

    2. 获取消息回复

    如需生成对消息的智能回复,请获取 SmartReplyGenerator 的一个实例,并将对话历史记录传递给其 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
                    // ...
                }
            });

    如果操作成功,则系统会向成功处理程序传递一个 SmartReplySuggestionResult 对象。此对象包含一个最多包含三个建议回复的列表,您可以向用户显示这些回复:

    Kotlin

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

    Java

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

    请注意,如果模型对建议回复的相关性不确定、输入会话不是英语,或者模型检测到敏感主题,则机器学习套件可能不会返回结果。