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

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

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

准备工作

  1. 如果您尚未将 Firebase 添加到自己的应用中,请按照入门指南中的步骤执行此操作。
  2. 在 Podfile 中添加机器学习套件库:
    pod 'Firebase/MLCommon', '6.25.0'
    pod 'Firebase/MLNLSmartReply', '6.25.0'
    
    在安装或更新项目的 Pod 之后,请务必使用 Xcode 项目的 .xcworkspace 打开该项目。
  3. 在您的应用中导入 Firebase:

    Swift

    import Firebase

    Objective-C

    @import Firebase;

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

如需生成智能回复,请向机器学习套件传递按时间排序的 TextMessage 对象数组,时间戳早的排在前面。每当用户发送或接收消息时,将消息、消息时间戳和消息发送者的用户 ID 添加到对话历史记录中。

用户 ID 可以是用于唯一标识会话中发送者的任何字符串。用户 ID 不需要对应于任何用户数据,也不需要在智能回复生成器的会话或调用之间保持一致。

如果消息是由您要向其提出回复建议的用户发送的,则将 isLocalUser 设置为 true。

Swift

var conversation: [TextMessage] = []

// Then, for each message sent and received:
let message = TextMessage(
    text: "How are you?",
    timestamp: Date().timeIntervalSince1970,
    userID: "userId",
    isLocalUser: false)
conversation.append(message)

Objective-C

NSMutableArray *conversation = [NSMutableArray array];

// Then, for each message sent and received:
FIRTextMessage *message = [[FIRTextMessage alloc]
        initWithText:@"How are you?"
        timestamp:[NSDate date].timeIntervalSince1970
        userID:userId
        isLocalUser:NO];
[conversation addObject:message];

对话历史记录对象类似如下示例:

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

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

2. 获取消息回复

要生成对消息的智能回复,请获取一个 SmartReply 实例,并将会话历史记录传递给其 suggestReplies(for:completion:) 方法:

Swift

let naturalLanguage = NaturalLanguage.naturalLanguage()
naturalLanguage.smartReply().suggestReplies(for: conversation) { result, error in
    guard error == nil, let result = result else {
        return
    }
    if (result.status == .notSupportedLanguage) {
        // The conversation's language isn't supported, so the
        // the result doesn't contain any suggestions.
    } else if (result.status == .success) {
        // Successfully suggested smart replies.
        // ...
    }
}

Objective-C

FIRNaturalLanguage *naturalLanguage = [FIRNaturalLanguage naturalLanguage];
FIRSmartReply *smartReply = [naturalLanguage smartReply];
[smartReply suggestRepliesForMessages:inputText
                           completion:^(FIRSmartReplySuggestionResult * _Nullable result,
                                        NSError * _Nullable error) {
  if (error || !result) {
    return;
  }
  if (result.status == FIRSmartReplyResultStatusNotSupportedLanguage) {
      // The conversation's language isn't supported, so the
      // the result doesn't contain any suggestions.
  } else if (result.status == FIRSmartReplyResultStatusSuccess) {
      // Successfully suggested smart replies.
      // ...
  }
}];
]

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

Swift

for suggestion in result.suggestions {
  print("Suggested reply: \(suggestion.text)")
}

Objective-C

for (FIRSmartReplySuggestion *suggestion in result.suggestions) {
  NSLog(@"Suggested reply: %@", suggestion.text);
}

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