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

借助机器学习套件,您可以使用设备端模型来生成消息回复。

如需生成智能回复,您需要向机器学习套件传递会话中最近消息的日志。如果机器学习套件确认会话使用的语言是英语,并且其中没有潜在的敏感主题,则会生成最多三个回复,供您向用户推荐。

准备工作

  1. 将 Firebase 添加到您的 Android 项目(如果尚未添加)。
  2. 将 Android 版机器学习套件库的依赖项添加到您的模块(应用级层)Gradle 文件(通常为 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. 同样是在您的应用级层 build.gradle 文件中,停用对 tflite 文件的压缩:
    android {
        // ...
        aaptOptions {
            noCompress "tflite"
        }
    }
    

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

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

每当用户发送消息时,系统都会将消息及其时间戳添加到会话历史记录中:

Java

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

Kotlin

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

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

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

下面是一个会话历史记录对象的示例:

时间戳 用户 ID 是否为本地用户? 消息
太平洋标准时间 2019 年 2 月 21 日星期四 13:13:39 true 还在路上吗?
太平洋标准时间 2019 年 2 月 21 日星期四 13:15:03 FRIEND0 false 要迟到了,对不起!

请注意,上述示例中的最新消息来自非本地用户。这很重要,因为机器学习套件推荐拟由您的应用的用户(即本地用户)发送的回复。您应确保向机器学习套件传送的会话日志以用户可能想要回复的消息结束。

2. 获取消息回复

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

如果操作成功,则系统会向成功处理程序传递一个 SmartReplySuggestionResult 对象。此对象包含最多 3 条您可以向用户显示的推荐回复:

Java

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

Kotlin

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

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