📚 系列定位:从 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 见)。


二、本节课学习目标

  1. 🎯 掌握 多类协作:如何用一个 ChatBot 主类管理多个 Agent 子类实例
  2. 🎯 掌握 状态机式菜单:命令行菜单 + 用户输入 + 状态切换的经典写法
  3. 🎯 学会 人设热切换:运行时无缝更换 AI 角色的实现思路
  4. 🎯 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 积木思路

  1. 主精灵「ChatBot」初始化三个子精灵(客服/翻译/助教)
  2. 舞台重复:询问用户 → 判断是命令还是对话 → 执行对应积木
  3. 命令 /switch 触发子菜单:“切到哪个人设?1客服 2翻译 3助教”
  4. 命令 /exit 前自动存档,下次启动自动读档
  5. 全程 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
再见👋

六、高频易错点总结

  1. 命令字典存函数带括号{"help": cmd_help()} 是提前调用,应改为 {"help": cmd_help} 不加括号
  2. input().strip():用户不小心输了空格 /exit ,就变成陌生命令了
  3. 切换人设时 current 没重新赋值:光切了字典 key 没切 self.current,等于白切
  4. JSON 存档漏了 ensure_ascii=False:中文变成 \u4f60\u597d,虽然读回来还能用,但打开文件看是天书
  5. while 循环没退出条件:调试时按 Ctrl+C 才能停,很不优雅

七、💡 学习提示

为鼓励大家动手练习、吃透编程逻辑,本篇不提供 Scratch 成品源码,请对照截图亲手搭建积木完成复刻!
配套 Python 代码可直接复制运行学习。


八、往期历史笔记

  1. 编程启蒙|Scratch 转 Python 系列第 1 天:变量、数字运算积木双向对照(AI 基础数值计算实战)

  2. 编程启蒙|Scratch 转 Python 系列第 2 天:分支判断 if 积木双向对照(AI 指令条件过滤实战)

  3. 编程启蒙|Scratch 转 Python 系列第 3 天:循环重复积木双向对照(AI 批量循环处理,已收录 AI Agent 技术社区)

  4. 编程启蒙|Scratch 转 Python 系列第 4 天:字符串文本积木双向对照(AI 提示词拼接、文本清洗实战)

  5. 编程启蒙|Scratch 转 Python 系列第 5 天:自定义积木 / 函数双向对照(AI 工具封装、重复指令简化实战)

  6. 编程启蒙|Scratch 转 Python 系列第 6 天:列表、数组积木双向对照(AI 底层语法 / AI 批量数据处理实战)

  7. 编程启蒙|Scratch 转 Python 系列第 7 天:猜数字大挑战·升级版实战(AI 出题 + 二分查找最优解 + 完整命令行游戏 已被收录在智能体开发者社区)

  8. 编程启蒙|Scratch 转 Python 系列第8天:节奏敲击机游戏实战(AI节奏谱生成实战)

  9. 编程启蒙|Scratch 转 Python 系列第9天:字典/哈希表积木双向对照(AI大模型参数配置表实战)

  10. 编程启蒙|Scratch 转 Python 系列第 10 天:问答闯关游戏实战(AI 题库管理 + 多关卡剧本)

  11. 编程启蒙|Scratch 转 Python 系列第 11 天:文件读写积木双向对照(AI 训练数据存取实战)

  12. 编程启蒙|Scratch 转 Python 系列第 12 天:记忆翻牌游戏实战(AI 图案主题包 + 存档排行榜 已被收录在2048 AI社区)

  13. 编程启蒙|Scratch 转 Python 系列第 13 天:异常处理 try/except 积木双向对照(AI 接口调用容错实战)

  14. 编程启蒙|Scratch 转 Python 系列第 14 天:AI 提示词管理工具实战(增删改查 + 存档导入 + 异常兜底)

  15. 编程启蒙|Scratch 转 Python 系列第 15 天:类与对象积木双向对照(AI 角色类封装实战)已被智能体开发者社区收录

  16. 编程启蒙|Scratch 转 Python 系列第 16 天:继承与多态积木双向对照(AI Agent 角色体系实战)已被智能体开发者社区收录


十、下一章预告

第 18 天:模块导入与常用标准库积木双向对照(AI 工具箱模块化实战)

代码越写越多,是时候学"把工具箱拆成一个个模块"了:

  • import 语法双向对照
  • 常用标准库速查:random / json / os / sys / datetime
  • 把你之前写的散代码拆成模块并互相调用
  • AI 场景:像大厂一样把 Agent、工具、存档拆成模块化目录结构

学完 Day 18,就可以为 Day 19 调真实大模型 API 铺路了!


十一、原创声明

本文为「梅雅达编程笔记」原创技术教程,未经授权禁止转载、洗稿或用于商业培训。转载合作请联系工作室。系列内容持续更新中,欢迎收藏 CSDN 专栏「编程启蒙–scratch转python」追更 🍃

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐