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 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。