MLKitSmartReply 拓展:智能回复建议(仅英语)

« 返回首页

logo MLKitSmartReply 拓展

根据对话上下文生成 1~3 条候选回复(就像输入法上方的快捷回复)。

⚠️ 只支持英语对话

ML Kit 的智能回复模型只训练了英语。中文对话会触发「语言不支持」事件而不是给出建议。 这是模型的能力边界,不是拓展的 bug —— 中文项目请不要用这个拓展。 中文智能回复请用大模型(本仓库的 LLMAI2Ext 拓展)。

为什么选它(在英语场景下):

  • 完全离线。模型随 .aix 打包,设备不需要 Google Play 服务。
  • 对话历史由组件维护。ML Kit 原生要求你构造一个带「本人/对方」标识和时间戳的 消息列表 —— 在 App Inventor 里手工做几乎不可能。本拓展改成三个块: 「添加对方消息」「添加本人消息」「生成回复建议」。
  • 「语言不支持」和「没有合适回复」是两个不同的事件,不会含糊成一个失败。

  • .aix 拓展下载:

cn.fun123.MLKit.SmartReply.aix


快速上手

一、最小可用

按对话发生的先后顺序喂入消息,再生成建议。

when 按钮_收到消息.Click() {
  SmartReply1.AddRemoteMessage("Are you free this weekend?", "friend")
  SmartReply1.SuggestReplies()
}
when SmartReply1.GotSuggestions(count, suggestions) {
  列表显示框_建议.Elements = suggestions
  标签1.Text = join("有 ", count, " 条建议")
}
when SmartReply1.LanguageNotSupported() {
  标签1.Text = "智能回复只支持英语对话"
}
when SmartReply1.NoReplyAvailable() {
  标签1.Text = "这句话没有合适的快捷回复"
}
when SmartReply1.SuggestFailed(operation, errorMessage) {
  标签1.Text = errorMessage
}

对话的最后一条必须是对方发的,否则没有可回复的内容(会走 NoReplyAvailable)。

二、完整的聊天流程

when 按钮_发送.Click() {
  SmartReply1.AddLocalMessage(文本输入框_输入.Text)
  文本输入框_输入.Text = ""
}
when 计时器_轮询.Timer() {
  SmartReply1.AddRemoteMessage(标签_收到的消息.Text, "friend")
  SmartReply1.SuggestReplies()
}
when 列表显示框_建议.AfterPicking() {
  文本输入框_输入.Text = 列表显示框_建议.Selection
}

点一条建议就填进输入框,用户改一改就能发。

三、开始新对话

when 按钮_新会话.Click() {
  SmartReply1.ClearConversation()
  列表显示框_建议.ElementsFromString = ""
  标签1.Text = join("对话已清空,当前 ", SmartReply1.MessageCount, " 条消息")
}

属性

MessageCount
只读。当前对话历史里有多少条消息。上限 30 条,超过会自动丢掉最旧的。
Busy
只读。是否正在生成建议。

事件

GotSuggestions(count,suggestions)
获得 1~3 条回复建议。suggestions 是文本列表,可以直接给列表显示框, 或做成几个按钮让用户一键发送。
LanguageNotSupported()
⚠️ 对话语言不支持 —— 只支持英语。中文对话会走到这里。这不是错误,是能力边界。
NoReplyAvailable()
模型认为没有合适的回复可建议(例如最后一条是本人发的、或内容不适合快捷回复)。这不是错误。
SuggestFailed(operation,errorMessage)
生成失败。也包括「消息内容为空」「对话历史是空的」这类用法问题。

方法

AddRemoteMessage(text,userId)
添加一条对方发来的消息。userId 用来区分不同对话人(群聊时有用), 单人对话随便填一个固定值即可(如 friend);留空会自动用默认值,不会报错。 按对话发生的先后顺序调用。
AddLocalMessage(text)
添加一条本人发出的消息。按对话发生的先后顺序调用。
SuggestReplies()
根据当前对话历史生成回复建议。对话的最后一条必须是对方发的。
ClearConversation()
清空对话历史。开始一段新对话时调用。

运行环境:AI 伴侣联机需要 Android 11 及以上

本拓展的识别模型放在依赖库自带的 assets 里,AI 伴侣联机调试要把它挂进 AssetManager,用的是 Android 11(API 30)才有的 ResourcesLoader —— 这是系统提供的 唯一公开办法,更低版本没有等价 API。所以:

运行方式 Android 6 ~ 10 Android 11 及以上
打包 APK ✅ 正常 ✅ 正常
AI 伴侣联机 ❌ 模型加载不了 ✅ 正常

打包 APK 之所以不受限制,是因为模型在编译时就被并进了 APK 的 assets,装到手机上 就是 App 自己的资源,与系统版本无关。伴侣的 APK 是提前编好装在手机上的,运行时没法 往自己已安装的包里加文件,只能靠系统的运行时挂载 API。

低版本设备上想验证功能,直接打包 APK 测即可;要用伴侣边改边调,请换 Android 11+ 的设备。

常见问题

中文对话一直触发「语言不支持」。 这就是预期行为 —— ML Kit 智能回复只有英语模型。没有办法绕过。 中文场景请改用大模型(LLMAI2Ext)。

英语对话也没有建议。 检查:① 对话最后一条是不是对方发的(本人发的没什么可回复); ② 内容适不适合快捷回复(陈述句、问句效果好;单个表情、纯链接通常没建议)。 这两种情况走 NoReplyAvailable,不是错误。

要喂多少条历史? 一条就能出建议,但多几条上下文质量更好。组件最多保留 30 条,超过自动丢最旧的, 不用担心内存无限增长。

为什么 .aix 有 15 MB? 智能回复模型(11 MB)+ 语言识别模型(它要先判断对话是不是英语)都打包在里面了。

文档反馈