多Agent智能教育与个性化学习系统
提示
这是一个企业级多Agent智能教育系统,用5个Agent完成个性化教学,是一个可以用来面试的完整项目,帮助:
- 拥有一个可以在简历上写、面试的企业级多Agent项目
- 理解多Agent系统核心架构思想(Mesh + 事件驱动)
- 掌握面试八股文、STAR回答法、简历写法的全套技巧
- 用主流Python语言实现,适配AI行业岗位需求
[图示已省略]
整体架构
系统采用 Mesh + 事件驱动架构,5个Agent双向异步通信。
┌──────────────┐
│ React 前端 │
│ (WebSocket) │
└──────┬───────┘
│
┌──────▼───────┐
│ API Gateway │
│ / EventBus │
└──────┬───────┘
│
┌────────────────────────┼────────────────────────┐
│ │ │
┌────▼──────┐ ┌─────▼──────┐ ┌──────▼──────┐
│ Assessment│◄────────►│ Tutor │◄────────►│ Hint │
│ Agent │ │ Agent │ │ Agent │
└────┬──────┘ └────────────┘ └─────────────┘
│ ▲
│ │
┌────▼──────┐ ┌─────┴──────┐
│ Curriculum│◄────────►│ Engagement │
│ Agent │ │ Agent │
└───────────┘ └────────────┘
│ │
└───────┬───────────────┘
▼
┌───────────────┐
│ 共享学习者状态 │
│ (PostgreSQL) │
└───────────────┘
事件流设计
核心事件流:学生答题
学生答题
→ STUDENT_SUBMISSION 事件
→ Assessment Agent 处理
→ MASTERY_UPDATED 事件
→ Curriculum Agent(更新SM-2复习计划)
→ ASSESSMENT_COMPLETE 事件
→ Tutor Agent(生成苏格拉底式回复)
→ Engagement Agent(分析学习状态)
→ Engagement Agent 并行处理
→ 如果检测到挫败 → ENGAGEMENT_ALERT 事件
→ Tutor Agent(降低难度)
→ Curriculum Agent(放慢节奏)
提示流:学生卡住
[图示已省略]
学生连续答错
→ Tutor Agent 检测到 attempts >= 2
→ HINT_NEEDED 事件
→ Hint Agent 处理
→ 判断提示级别(1/2/3)
→ HINT_RESPONSE 事件
→ Tutor Agent 转发给学生
为什么选择 Mesh + 事件驱动
与其他架构模式的对比
[图示已省略]
提示
Supervisor 模式:
- 中心化调度器分配任务给各Agent
- 缺点:调度器是瓶颈和单点故障
- 不适合本场景:教育交互是双向的、非线性的
提示
Pipeline 模式:
- Agent按固定顺序串行处理
- 缺点:灵活性差,不支持双向交互
- 不适合本场景:学习路径不是固定的
提示
Mesh 模式 (我们的选择):
- Agent之间通过事件总线自由通信
- 优点:松耦合、可扩展、支持双向交互
- 适合本场景:Agent需要实时感知和响应其他Agent的状态
开闭原则验证
新增一个"家长通知Agent"只需要:
[图示已省略]
class ParentNotifyAgent(BaseAgent):
@property
def subscribed_events(self):
return [EventType.WEAKNESS_DETECTED, EventType.ENCOURAGEMENT]
async def handle_event(self, event):
# 发送通知给家长
pass
无需修改任何现有Agent代码。
数据流
学习者模型数据流
学生行为数据 → Assessment Agent → BKT更新mastery
→ 持久化到数据库
→ 事件通知其他Agent
↓
Curriculum Agent → SM-2更新复习计划
Tutor Agent → 调整教学难度
Engagement Agent → 检测学习状态
状态一致性保证
[图示已省略]
- 单写者策略:mastery只由Assessment Agent写入
- 事件溯源:所有变更通过事件记录,可追溯
- 版本号:每次更新带version,防止并发冲突
部署指南
[图示已省略]
方式一:本地(推荐新手)
cd python
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python -m api.main
# 访问 http://localhost:8000/docs
前端
cd frontend
npm install
npm run dev
# 访问 http://localhost:3000
方式二:Docker Compose(一键部署)
# 在项目根目录
cp .env.example .env
# 编辑 .env 填入 API Key
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f python-api
# 停止
docker-compose down
服务地址:
- 前端:http://localhost:3000
- Python API:http://localhost:8000/docs
- PostgreSQL:localhost:5432
- Redis:localhost:6379
5个Agent职责说明
内嵌表格
| Agent | 职责 | 核心算法/技术 |
|---|---|---|
| Assessment Agent (评估) | 知识点掌握度评估、学习路径诊断 | 贝叶斯知识追踪(BKT)、Beta分布 |
| Tutor Agent (教学) | 苏格拉底式提问教学,动态调整难度 | Prompt Engineering、难度自适应 |
| Curriculum Agent (课程) | 动态生成学习路径,间隔重复排期 | SM-2算法、知识图谱拓扑排序 |
| Hint Agent (提示) | 分级提示:暗示→引导→直接答案 | 三级提示策略、尝试次数分析 |
| Engagement Agent (互动) | 监测学习状态,适时鼓励、调整节奏 | 情感分析、响应时间分析 |
为什么用 Mesh + 事件驱动?
内嵌表格
| 编排模式 | 特点 | 适用场景 |
|---|---|---|
| Supervisor (监督者) | 中心化调度,单点瓶颈 | 简单串行任务流 |
| Pipeline (管道) | 线性流转,灵活性低 | 数据处理流水线 |
| Mesh + 事件驱动 ✅ | Agent双向通信,松耦合 | 教育场景:需要实时双向交互 |
提示
选择 Mesh 的原因:
- 实战过程中,Tutor 需要随时请求 Hint,Assessment 需要通知 Curriculum 调整路径
- Agent 之间是双向、异步、事件驱动
- 新增 Agent 只需订阅事件,无需修改现有代码
🧠 核心算法详解
[图示已省略]
SM-2 间隔重复算法(Curriculum Agent 使用)
什么是间隔重复? 就是"快忘了的时候复习效果最好"。Anki、SuperMemo 都用这个算法。
核心公式:
复习间隔计算:
I(1) = 1 天(第1次复习)
I(2) = 6 天(第2次复习)
I(n) = I(n-1) × EF(之后每次间隔 = 上次间隔 × 难度因子)
难度因子更新:
EF' = EF - 0.8 + 0.28 × q - 0.02 × q²
其中 q 是回答质量(0-5分):
5 = 完美回答 → EF 增大 → 间隔变长
4 = 正确但犹豫 → EF 不变
3 = 勉强正确 → EF 略降
0-2 = 错误 → 重置间隔,从头复习
贝叶斯知识追踪 BKT(Assessment Agent 使用)
什么是 BKT? 用概率模型估计学生对每个知识点的掌握程度。
四个核心参数:
P(L₀) = 初始掌握概率(先验,通常 0.1-0.3)
P(T) = 学习转移概率(每次练习后学会的概率)
P(G) = 猜测概率(不会但猜对的概率)
P(S) = 失误概率(会但做错的概率)
更新公式:
如果学生答对:
P(Lₙ|correct) = P(Lₙ₋₁) × (1 - P(S)) / P(correct)
如果学生答错:
P(Lₙ|wrong) = P(Lₙ₋₁) × P(S) / P(wrong)
苏格拉底式教学策略(Tutor Agent 使用)
什么是苏格拉底式教学? 不直接告诉答案,而是通过提问引导学生自己发现答案。
学生:"二次函数 y = x² + 2x + 1 的顶点在哪里?"
❌ 直接给答案:"顶点是 (-1, 0)"
✅ 苏格拉底式引导:
第1轮:"你知道二次函数的顶点公式吗?或者,你能把这个式子配方吗?"
第2轮:"很好!你配成了 y = (x+1)²,那 (x+1)² 最小值是多少?此时 x 等于几?"
第3轮:"对了!所以顶点坐标是?"