编程启蒙|Scratch 转 Python 系列第 17 天:AI 聊天机器人游戏实战(AI 多角色对话 + 人设切换实战)
📚 系列定位:从 Scratch 积木到 Python 代码,双向对照学 AI 编程
✍️ 作者:梅雅达编程笔记
🎯 本篇难度:⭐⭐⭐⭐(进阶实战)
一、摘要
本篇是 Scratch 转 Python 系列第 17 天,我们把 Day 15-16 的 AI Agent 角色体系 真正跑起来——做一个 命令行版多角色 AI 聊天机器人。全篇串联五天的知识点:Day 6 列表 + Day 9 字典 + Day 11 文件读写 + Day 13 异常处理 + Day 15-16 类与继承多态,让你亲手看到"OOP 不是花架子,它就是现代 AI 应用的骨架"。学完这一篇,你写出来的东西已经能算个"AI Agent 雏形"了,只差最后一步——接大模型 API(Day 19 见)。
二、本节课学习目标
- 🎯 掌握 多类协作:如何用一个
ChatBot主类管理多个 Agent 子类实例 - 🎯 掌握 状态机式菜单:命令行菜单 + 用户输入 + 状态切换的经典写法
- 🎯 学会 人设热切换:运行时无缝更换 AI 角色的实现思路
- 🎯 AI 应用场景:亲手做一个可扩展、可存档、可切人设的
CLI Chatbot(企业 AI 客服系统的雏形)
三、专业名词通俗释义
| 名词 | 通俗解释 | Scratch 类比 |
|---|---|---|
| CLI(命令行界面) | 靠输入文字来交互的黑框框界面 | Scratch 舞台上「询问 并等待」的文字对话 |
| 人设切换 | 中途更换 AI 角色的说话风格和职业 | 舞台上切换主角精灵 |
| 对话上下文 | 记录之前聊过什么,让 AI 回复更连贯 | 精灵变量里存的历史列表 |
| 状态机 | 程序在不同"状态"之间跳转的运行方式(菜单/聊天/看历史…) | Scratch 里用变量 mode 控制流程走哪一段 |
| 命令模式 | 用户输入特殊符号(如 /exit)触发功能,而不是普通对话 |
收到某些"暗号消息"时精灵切换行为 |
四、分模块双向对照知识点
模块 1:CLI 主循环 + 命令解析
Scratch 积木逻辑:
一直重复:询问用户 → 检查输入 → 如果是暗号(比如 /help)就执行对应功能;否则就当作聊天内容传给当前精灵。
Python 源码(含 Scratch 积木注释):
# 【Scratch积木】重复直到 (退出标志 = 真)
while True:
# 【Scratch积木】询问 (请说) 并等待
user_input = input("你 > ").strip()
# 【Scratch积木】如果 输入 = "/exit" 那么
if user_input == "/exit":
print("再见👋")
break
# 【Scratch积木】否则运行聊天积木
else:
print(f"AI > 收到:{user_input}")
运行结果:
你 > 你好
AI > 收到:你好
你 > /exit
再见👋
核心易错说明:
input()得到的一定是字符串,别忘.strip()去掉首尾空白break只跳出当前循环,多层循环要注意
模块 2:命令字典表——用字典优雅管理指令
Scratch 积木逻辑:
准备一个"命令-对应积木"的字典表,来一条命令就查一下表,直接跳到对应功能。比 if-elif 一大串优雅太多。
Python 源码(含 Scratch 积木注释):
def cmd_help():
print("可用命令:/help /switch /history /clear /exit")
def cmd_history():
print("查看历史记录……")
# 【Scratch积木】新建字典「命令表」
commands = {
"/help": cmd_help,
"/history": cmd_history,
}
user_input = "/help"
# 【Scratch积木】如果 输入 在 命令表 里 → 运行对应积木
if user_input in commands:
commands[user_input]() # 直接调用对应函数
运行结果:
可用命令:/help /switch /history /clear /exit
核心易错说明:
- 字典
value存的是函数对象(不带括号cmd_help),调用时才加括号commands[cmd]() - 加括号存进去就是"提前调用",等
if时才发现值已经变成None了,是常见 bug
模块 3:人设切换——运行时换 Agent
Scratch 积木逻辑:
有一个"当前精灵"变量,指向此刻在说话的精灵。切换人设时,把这个变量指向另一只精灵。
Python 源码(含 Scratch 积木注释):
class Agent:
def __init__(self, name): self.name = name
def chat(self, msg): print(f"{self.name}: {msg}")
# 【Scratch积木】新建多个精灵实例
agents = {
"客服": Agent("小助手"),
"翻译": Agent("Sara"),
"助教": Agent("小张老师"),
}
# 【Scratch积木】设 (当前精灵) 为 (客服)
current = agents["客服"]
current.chat("你好呀")
# 【Scratch积木】切换:设 (当前精灵) 为 (助教)
current = agents["助教"]
current.chat("今天学什么?")
运行结果:
小助手: 你好呀
小张老师: 今天学什么?
核心易错说明:
- 切换后同一个变量指向新对象,之前对象还在,只是不再被引用
- 想让新角色继承旧对话历史?需要手动
new.history = old.history[:](切片复制)
模块 4:存档与读档——JSON 序列化多角色历史
Scratch 积木逻辑:
关机前把所有精灵的对话历史写到文件;下次开机时读回来,接着聊。
Python 源码(含 Scratch 积木注释):
import json
# 【Scratch积木】新建列表变量存所有历史
all_history = {
"客服": [{"user": "退款", "bot": "好的"}],
"翻译": [],
}
# 【Scratch积木】保存到文件积木
with open("chat_history.json", "w", encoding="utf-8") as f:
json.dump(all_history, f, ensure_ascii=False, indent=2)
# 【Scratch积木】从文件读入积木
with open("chat_history.json", "r", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded)
运行结果:
{'客服': [{'user': '退款', 'bot': '好的'}], '翻译': []}
核心易错说明:
- 写入必须
ensure_ascii=False,否则中文变\uxxxx转义 - 首次运行文件可能不存在,读入前要用
try/except FileNotFoundError兜底(Day 13 内容)
五、综合实战项目:CLI 多角色 AI 聊天机器人
一个完整的命令行聊天机器人,支持:
- ✅ 五种命令:
/help/switch/history/clear/exit - ✅ 三个 AI 人设:客服、翻译、助教(继承自 Day 15-16 的 Agent 体系)
- ✅ 各角色对话历史独立存储
- ✅ 一键存档 / 读档到
chat_history.json - ✅ 异常兜底:文件不存在、输入为空、命令拼错都不崩溃
Scratch 积木思路
- 主精灵「
ChatBot」初始化三个子精灵(客服/翻译/助教) - 舞台重复:询问用户 → 判断是命令还是对话 → 执行对应积木
- 命令
/switch触发子菜单:“切到哪个人设?1客服 2翻译 3助教” - 命令
/exit前自动存档,下次启动自动读档 - 全程
try/except包裹,出错说明原因不闪退
Python 完整可运行代码(片段)
class ChatBot:
def __init__(self):
self.agents = {
"客服": KefuAgent("小助手", "热情耐心"),
"翻译": FanyiAgent("Sara", "专业严谨"),
"助教": ZhujiaoAgent("小张老师", "循循善诱"),
}
self.current = self.agents["客服"]
self.load_history()
def run(self):
print("===== 梅雅达 AI 聊天机器人 =====")
print(f"当前人设:【{self.current.role_name}】")
print("输入 /help 查看命令,/exit 退出\n")
while True:
user_input = input("你 > ").strip()
if not user_input:
continue
if user_input.startswith("/"):
self.handle_command(user_input)
if user_input == "/exit":
break
else:
self.current.chat(user_input)
# 完整代码(含所有子类、命令处理、存档读档、异常兜底)
# 见配套源码文件 day17_code.py
运行结果预览:
===== 梅雅达 AI 聊天机器人 =====
当前人设:【客服·小助手】
输入 /help 查看命令,/exit 退出
你 > 我想退款
【客服·小助手】亲亲~您说的「我想退款」已收到,正在为您处理哦~
你 > /switch
选择人设:1)客服 2)翻译 3)助教 > 2
✅ 已切换到【翻译·Sara】
你 > Hello world
【翻译·Sara】「Hello world」译文示例:你好,世界(示例仅供参考)
你 > /exit
💾 对话历史已保存到 chat_history.json
再见👋
六、高频易错点总结
- ❌ 命令字典存函数带括号:
{"help": cmd_help()}是提前调用,应改为{"help": cmd_help}不加括号 - ❌
input()没.strip():用户不小心输了空格/exit,就变成陌生命令了 - ❌ 切换人设时 current 没重新赋值:光切了字典 key 没切
self.current,等于白切 - ❌ JSON 存档漏了
ensure_ascii=False:中文变成\u4f60\u597d,虽然读回来还能用,但打开文件看是天书 - ❌ while 循环没退出条件:调试时按 Ctrl+C 才能停,很不优雅
七、💡 学习提示
为鼓励大家动手练习、吃透编程逻辑,本篇不提供 Scratch 成品源码,请对照截图亲手搭建积木完成复刻!
配套 Python 代码可直接复制运行学习。
八、往期历史笔记
-
编程启蒙|Scratch 转 Python 系列第 3 天:循环重复积木双向对照(AI 批量循环处理,已收录 AI Agent 技术社区)
-
编程启蒙|Scratch 转 Python 系列第 5 天:自定义积木 / 函数双向对照(AI 工具封装、重复指令简化实战)
-
编程启蒙|Scratch 转 Python 系列第 6 天:列表、数组积木双向对照(AI 底层语法 / AI 批量数据处理实战)
-
编程启蒙|Scratch 转 Python 系列第 7 天:猜数字大挑战·升级版实战(AI 出题 + 二分查找最优解 + 完整命令行游戏 已被收录在智能体开发者社区)
-
编程启蒙|Scratch 转 Python 系列第 12 天:记忆翻牌游戏实战(AI 图案主题包 + 存档排行榜 已被收录在2048 AI社区)
-
编程启蒙|Scratch 转 Python 系列第 13 天:异常处理 try/except 积木双向对照(AI 接口调用容错实战)
-
编程启蒙|Scratch 转 Python 系列第 14 天:AI 提示词管理工具实战(增删改查 + 存档导入 + 异常兜底)
-
编程启蒙|Scratch 转 Python 系列第 15 天:类与对象积木双向对照(AI 角色类封装实战)已被智能体开发者社区收录
-
编程启蒙|Scratch 转 Python 系列第 16 天:继承与多态积木双向对照(AI Agent 角色体系实战)已被智能体开发者社区收录
十、下一章预告
第 18 天:模块导入与常用标准库积木双向对照(AI 工具箱模块化实战)
代码越写越多,是时候学"把工具箱拆成一个个模块"了:
import语法双向对照- 常用标准库速查:
random / json / os / sys / datetime - 把你之前写的散代码拆成模块并互相调用
- AI 场景:像大厂一样把 Agent、工具、存档拆成模块化目录结构
学完 Day 18,就可以为 Day 19 调真实大模型 API 铺路了!
十一、原创声明
本文为「梅雅达编程笔记」原创技术教程,未经授权禁止转载、洗稿或用于商业培训。转载合作请联系工作室。系列内容持续更新中,欢迎收藏 CSDN 专栏「编程启蒙–scratch转python」追更 🍃
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)