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)+ 语言识别模型(它要先判断对话是不是英语)都打包在里面了。
扫码添加客服咨询