App Inventor 2 AI人工智能集成完全指南
一、AI集成概述
1.1 为什么App Inventor需要AI?
传统App Inventor限制:
- 本地计算能力有限
- 无法处理复杂AI任务
- 没有自然语言处理能力
AI赋能后的能力:
- 🤖 智能对话助手
- 👁️ 图像识别分类
- 🔊 语音情感分析
- 📝 智能文本生成
- 🎯 推荐系统
1.2 集成方案总览
| AI能力 | 实现方案 | 难度 | 推荐度 |
|---|---|---|---|
| 聊天对话 | ChatGPT API | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 图像识别 | 百度/阿里OCR | ⭐⭐ | ⭐⭐⭐⭐ |
| 语音转文字 | 讯飞/百度 | ⭐⭐ | ⭐⭐⭐⭐ |
| 文本分类 | OpenAI API | ⭐⭐ | ⭐⭐⭐⭐ |
| 人脸检测 | 百度/Face++ | ⭐⭐ | ⭐⭐⭐ |
| 情感分析 | 百度NLP | ⭐⭐⭐ | ⭐⭐⭐ |
二、ChatGPT对话助手
2.1 配置ChatGPT API
初始化全局变量 OpenAI_API_Key = "sk-your-api-key"
初始化全局变量 API_URL = "https://api.openai.com/v1/chat/completions"
初始化全局变量 对话历史 = 创建空列表()
初始化全局变量 模型 = "gpt-3.5-turbo"
2.2 发送消息
当 Button_发送.被点击 时
设置 全局变量 用户消息 = TextBox_Input.文本
如果 全局变量 用户消息 ≠ "" 则
// 添加到对话历史
添加项目到列表(全局变量 对话历史, 创建列表("user", 全局变量 用户消息))
// 显示用户消息
设置 ListPicker_History.Elements = 调用 获取对话摘要(全局变量 对话历史)
// 发送请求
调用 发送ChatGPT请求(全局变量 用户消息)
// 清空输入
设置 TextBox_Input.文本 = ""
如果结束
过程 发送ChatGPT请求(消息)
调用 Notifier1.显示消息("AI思考中...")
调用 Web1.设置请求头([
["Content-Type", "application/json"],
["Authorization", "Bearer " + 全局变量 OpenAI_API_Key]
])
调用 Web1.发送文本请求(
网址: 全局变量 API_URL,
方法: "POST",
内容: 调用 JSON.字典转文本({
"model": 全局变量 模型,
"messages": 调用 构建消息列表(全局变量 对话历史)
})
)
当 Web1.收到文本响应(响应文本) 时
设置 全局变量 响应 = 调用 JSON.文本转字典(响应文本)
设置 全局变量 助手回复 = 获取键的值(
获取列表项目(
获取键的值(获取键的值(全局变量 响应, "choices", [{"message": {"content": ""}}]), 1),
"message"
),
"content",
""
)
// 添加到对话历史
添加项目到列表(全局变量 对话历史, 创建列表("assistant", 全局变量 助手回复))
// 显示回复
设置 Label_Reply.文本 = 全局变量 助手回复
// 文字转语音朗读
调用 TextToSpeech1.朗读(全局变量 助手回复)
过程 构建消息列表(历史)
设置 全局变量 消息列表 = 创建空列表()
// 添加系统提示
添加项目到列表(全局变量 消息列表, 创建字典(
"role", "system",
"content", "你是一个友好的AI助手,请用简洁的语言回答问题。"
))
对于 每个 消息 在 历史 中
添加项目到列表(全局变量 消息列表, 创建字典(
"role", 获取列表项目(消息, 1),
"content", 获取列表项目(消息, 2)
))
循环结束
返回 全局变量 消息列表
过程结束
过程 获取对话摘要(历史)
设置 全局变量 摘要 = 创建空列表()
对于 每个 消息 在 历史 中
设置 全局变量 角色 = 获取列表项目(消息, 1)
设置 全局变量 内容 = 获取列表项目(消息, 2)
添加项目到列表(全局变量 摘要, 角色 + ": " + 文本取部分(全局变量 内容, 1, 30))
循环结束
返回 全局变量 摘要
过程结束
2.3 流式响应(高级)
// 如果API支持流式输出
当 Web1.收到文本响应(响应文本) 时
// 分段处理响应
设置 全局变量 增量文本 = 响应文本
设置 Label_Reply.文本 = 获取键的值(全局变量 已有文本, "text", "") + 全局变量 增量文本
调用 TextToSpeech1.朗读增量(全局变量 增量文本)
三、百度AI集成
3.1 配置百度AI
// 获取API密钥:https://ai.baidu.com/
初始化全局变量 百度_API_Key = "your_api_key"
初始化全局变量 百度_Secret_Key = "your_secret_key"
初始化全局变量 百度_Access_Token = ""
3.2 获取Access Token
过程 获取百度Token
调用 Web1.发送文本请求(
网址: "https://aip.baidubce.com/oauth/2.0/token?" +
"grant_type=client_credentials&client_id=" + 全局变量 百度_API_Key +
"&client_secret=" + 全局变量 百度_Secret_Key
)
过程结束
当 Web1.收到文本响应(响应文本) 时
设置 全局变量 Token响应 = 调用 JSON.文本转字典(响应文本)
设置 全局变量 百度_Access_Token = 获取键的值(全局变量 Token响应, "access_token", "")
调用 Notifier1.显示消息("百度AI初始化成功")
3.3 图像识别
过程 识别图片内容(图片路径)
设置 全局变量 图片Base64 = 调用 图像扩展1.图片转Base64(图片路径)
调用 Web1.发送文本请求(
网址: "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced?access_token=" + 全局变量 百度_Access_Token,
方法: "POST",
内容: "image=" + 调用 Web1.UriEncode(全局变量 图片Base64)
)
过程结束
当 Web1.收到文本响应(响应文本) 时
设置 全局变量 识别结果 = 调用 JSON.文本转字典(响应文本)
设置 全局变量 结果列表 = 获取键的值(全局变量 识别结果, "result", [])
设置 全局变量 显示文本 = ""
对于 每个 结果 在 全局变量 结果列表 中
设置 全局变量 物品名 = 获取键的值(结果, "keyword", "")
设置 全局变量 置信度 = 获取键的值(结果, "score", 0)
设置 全局变量 显示文本 = 全局变量 显示文本 + 全局变量 物品名 + " (" + 四舍五入(全局变量 置信度 * 100, 1) + "%)\n"
循环结束
设置 Label_Result.文本 = 全局变量 显示文本
3.4 文字识别(OCR)
过程 OCR识别(图片路径)
设置 全局变量 图片Base64 = 调用 图像扩展1.图片转Base64(图片路径)
调用 Web1.发送文本请求(
网址: "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + 全局变量 百度_Access_Token,
方法: "POST",
内容: "image=" + 调用 Web1.UriEncode(全局变量 图片Base64)
)
过程结束
当 Web1.收到文本响应(响应文本) 时
设置 全局变量 OCR响应 = 调用 JSON.文本转字典(响应文本)
设置 全局变量 文字列表 = 获取键的值(全局变量 OCR响应, "words_result", [])
设置 全局变量 识别文字 = ""
对于 每个 文字项 在 全局变量 文字列表 中
设置 全局变量 文字 = 获取键的值(文字项, "words", "")
设置 全局变量 识别文字 = 全局变量 识别文字 + 全局变量 文字 + "\n"
循环结束
设置 Label_OCR.文本 = 全局变量 识别文字
四、自定义AI聊天机器人
4.1 对话管理
初始化全局变量 对话上下文 = 创建空列表()
初始化全局变量 最大上下文长度 = 10
过程 添加到上下文(角色, 内容)
添加项目到列表(全局变量 对话上下文, 创建列表(角色, 内容))
// 限制上下文长度
如果 获取列表长度(全局变量 对话上下文) > 全局变量 最大上下文长度 则
设置 全局变量 对话上下文 = 获取列表子集(全局变量 对话上下文, 2, 获取列表长度(全局变量 对话上下文))
如果结束
过程结束
过程 清空对话
设置 全局变量 对话上下文 = 创建空列表()
设置 ListPicker_History.Elements = 创建空列表()
设置 Label_Reply.文本 = ""
调用 Notifier1.显示消息("对话已清空")
过程结束
4.2 角色设定
// 预设角色选项
初始化全局变量 角色列表 =
创建列表(
创建列表("助手", "你是一个友好的AI助手"),
创建列表("老师", "你是一个耐心的老师,用简单的例子解释概念"),
创建列表("翻译", "你是一个翻译专家,将中文翻译成英文,或将英文翻译成中文"),
创建列表("程序员", "你是一个经验丰富的程序员,用代码解决问题"),
创建列表("顾问", "你是一个商业顾问,提供专业的商业建议")
)
当 ListPicker_角色.AfterPicking() 时
设置 全局变量 选中角色 = 获取列表项目(全局变量 角色列表, ListPicker_角色.SelectionIndex)
设置 全局变量 角色名 = 获取列表项目(全局变量 选中角色, 1)
设置 全局变量 角色提示 = 获取列表项目(全局变量 选中角色, 2)
// 清空上下文,设置新角色
调用 清空对话()
调用 添加到上下文("system", 全局变量 角色提示)
调用 Notifier1.显示消息("已切换为:" + 全局变量 角色名)
4.3 多轮对话
当 Button_发送.被点击 时
设置 全局变量 用户输入 = TextBox_Input.文本
如果 全局变量 用户输入 ≠ "" 则
// 添加用户消息到上下文
调用 添加到上下文("user", 全局变量 用户输入)
// 显示用户消息
设置 ListPicker_History.Elements = 调用 获取对话摘要(全局变量 对话上下文)
// 调用AI
调用 调用AI(全局变量 对话上下文)
如果结束
过程 调用AI(上下文)
// 准备API请求
调用 Web1.设置请求头([
["Content-Type", "application/json"],
["Authorization", "Bearer " + 全局变量 OpenAI_API_Key]
])
调用 Web1.发送文本请求(
网址: 全局变量 API_URL,
方法: "POST",
内容: 调用 JSON.字典转文本({
"model": 全局变量 模型,
"messages": 调用 构建消息列表(上下文)
})
)
过程结束
当 Web1.收到文本响应(响应文本) 时
设置 全局变量 响应 = 调用 JSON.文本转字典(响应文本)
设置 全局变量 AI回复 = 获取键的值(
获取列表项目(
获取键的值(获取键的值(全局变量 响应, "choices", [{"message": {"content": ""}}]), 1),
"message"
),
"content",
""
)
// 添加AI回复到上下文
调用 添加到上下文("assistant", 全局变量 AI回复)
// 显示
设置 Label_Reply.文本 = 全局变量 AI回复
设置 ListPicker_History.Elements = 调用 获取对话摘要(全局变量 对话上下文)
五、AI绘图应用
5.1 DALL-E绘图
过程 生成图片(描述)
调用 Notifier1.显示消息("正在生成图片...")
调用 Web1.设置请求头([
["Content-Type", "application/json"],
["Authorization", "Bearer " + 全局变量 OpenAI_API_Key]
])
调用 Web1.发送文本请求(
网址: "https://api.openai.com/v1/images/generations",
方法: "POST",
内容: 调用 JSON.字典转文本({
"prompt": 描述,
"n": 1,
"size": "512x512"
})
)
过程结束
当 Web1.收到文本响应(响应文本) 时
设置 全局变量 绘图响应 = 调用 JSON.文本转字典(响应文本)
设置 全局变量 图片URL = 获取键的值(
获取列表项目(
获取键的值(全局变量 绘图响应, "data", [{}]), 1
),
"url",
""
)
// 下载并显示图片
调用 Web1.获取文件(
网址: 全局变量 图片URL,
保存到: "/sdcard/generated_image.png"
)
当 Web1.文件接收完成(文件路径) 时
设置 Image1.图片 = 文件路径
调用 Notifier1.显示消息("图片生成完成!")
六、AI应用模板
6.1 智能问答助手
功能:
- 用户输入问题
- AI分析并回答
- 支持语音输入
- 支持朗读回答
适用场景:
- 作业助手
- 语言学习
- 知识查询
6.2 图像识别助手
功能:
- 拍照或选择图片
- AI识别图像内容
- 显示识别结果和置信度
- 支持保存识别记录
适用场景:
- 植物识别
- 动物识别
- 商品识别
- OCR文字识别
6.3 智能翻译
功能:
- 输入或拍照获取文本
- 选择目标语言
- AI翻译
- 语音朗读翻译结果
适用场景:
- 外语学习
- 出国旅行
- 文档翻译
七、最佳实践
7.1 API安全
⚠️ 重要提醒:
1. 保护API密钥
- 不要硬编码在代码中
- 使用TinyDB或加密存储
- 定期更换密钥
2. 限制API调用
- 添加防抖/节流
- 限制单用户调用频率
- 设置调用上限
3. 错误处理
- 处理网络错误
- 处理API限流
- 处理无效响应
7.2 性能优化
优化建议:
1. 缓存结果
- 相同问题返回缓存
- 减少API调用
2. 异步处理
- 不阻塞UI
- 显示加载状态
3. 压缩数据
- 图片压缩后再发送
- 精简上下文
八、常见问题
Q1: API调用失败怎么办?
A: 检查网络、API密钥、请求格式、余额Q2: 如何控制成本?
A: 限制调用次数、缓存结果、使用低价模型Q3: 响应慢怎么优化?
A: 流式输出、预加载、优化网络教程作者:ai2claw 🐝 | 创建时间:2026-03-31
参考资料与版权声明
原文来源
- MIT App Inventor 官方文档 - MIT App Inventor
- MIT App Inventor Community - MIT App Inventor Community
- MIT App Inventor GitHub - MIT CML
版权声明
本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:- MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
- MIT App Inventor Community 帖子版权归原作者所有
