跳到教程内容
教程首页
App Inventor 2 教程 聊天机器人
准备开始
动手创造 · PROJECT LAB

聊天机器人

准备探索你的新作品
0%
★★ 项目难度每一步,都离作品更近

先了解你将做出什么

应用介绍

这个机器人不连接网络,也不需要训练模型:它把输入统一成小写文字,再按关键词选择回复。 你会看到一个“先判断、再回答”的完整对话循环,也会明白这种规则机器人和真正的人工智能有什么区别。

教程主图

聊天机器人教程(难度系数:★★)

准备界面

组件类型 组件名称 关键设置
文本输入框 文本输入框_消息 Hint:和机器人说点什么
按钮 按钮_发送 文本:发送
按钮 按钮_清空 文本:清空
标签 标签_转写 显示对话记录
标签 标签_状态 显示请求状态
文本朗读器 文本朗读器1 非可视组件

把回答规则抽成函数

先处理最具体的关键词,再处理一般问候,最后用兜底回复。顺序很重要:如果先判断“你好”, 包含“你好不好”的句子就会过早结束,后面的规则永远走不到。

function 生成回复(输入) {
  var 文本 = lower(trim(输入))
  var 回复文本 = join("我听到了:", 输入)
  if textcontains(文本, "不开心") {
    回复文本 = "听起来你有点难过,先休息一下吧。"
  } else if textcontains(文本, "你好") {
    回复文本 = "你好!今天想聊点什么?"
  } else if textcontains(文本, "再见") {
    回复文本 = "再见,随时欢迎回来。"
  } else if textcontains(文本, "你是谁") {
    回复文本 = "我是一个用代码写出来的规则机器人。"
  }
  return 回复文本
}

这不是理解句子,而是查找关键词。它的优点是简单、可预测,缺点是遇到没写过的表达方式就只能走兜底分支。

发送一条消息

把每轮对话追加到全局字符串里,再一次性更新标签。这样不会因为只设置最后一行而丢掉前面的聊天记录。

global 对话记录 = ""
global 回复 = ""

when Screen1.Initialize() {
  对话记录 = "机器人:你好!试试输入“你好”或“你是谁”。"
  标签_转写.Text = 对话记录
}

when 按钮_发送.Click() {
  if isempty(文本输入框_消息.Text) {
    标签_状态.Text = "先输入一句话"
  } else {
    回复 = 生成回复(文本输入框_消息.Text)
    对话记录 = join(对话记录, " | 我:", 文本输入框_消息.Text, " | 机器人:", 回复)
    标签_转写.Text = 对话记录
    标签_状态.Text = "已回复"
    文本朗读器1.Speak(回复)
    文本输入框_消息.Text = ""
  }
}

清空对话

清空只重置当前屏幕上的记录,不会影响其他 App 数据。之后再发送消息,机器人会从新的对话开始。

when 按钮_清空.Click() {
  对话记录 = "机器人:我们重新开始吧。"
  标签_转写.Text = 对话记录
  标签_状态.Text = "已清空"
  文本朗读器1.Stop()
}

开始测试

  1. 输入“你好”,是否得到问候。
  2. 输入“我不开心”,是否优先得到安慰,而不是普通问候。
  3. 输入“你是谁”,是否命中对应规则;输入没见过的话,是否走兜底回复。
  4. 连续发送三句话,记录是否完整保留。
  5. 点击清空后再发送,是否只看到新的对话。

剩余工作

可以把关键词和回复放进列表或字典,增加“天气”“学习”“音乐”等主题;还可以用 微数据库 保存对话。 如果希望机器人真的根据语义理解问题,就需要接入专门的模型或在线服务,并额外处理隐私和网络失败。