0-1搭建Agent智能教育与个性化学习系统
📖 这个项目是什么?

这是一个企业级多Agent智能教育系统,用5个AI Agent协作完成个性化教学:
📍
•
不是"千人一面"的网课,而是根据每个学生的薄弱点实时调整教学
•
不是直接给答案,而是用苏格拉底式提问引导学生自己思考
•
不是固定学习路径,而是基于间隔重复算法动态排期复习
为什么做这个项目? 这是一个面向求职者的完整项目,帮助你:
✍️
拥有一个可以在简历上写、面试时讲的企业级多Agent项目
理解多Agent系统的核心架构思想(Mesh + 事件驱动)
掌握面试八股文、STAR回答法、简历写法的全套技巧
用Java / Go / Python三种语言实现,适配不同岗位需求
🏗️ 系统架构
整体架构图
代码块
Plain Text
┌──────────────────────────┐
│ React 前端 (WebSocket) │
└────────────┬─────────────┘
│
┌────────────▼─────────────┐
│ API Gateway / EventBus │
└────────────┬─────────────┘
│
┌────────────────────────┼────────────────────────┐
│ │ │
┌────▼─────┐ ┌─────▼─────┐ ┌──────▼──────┐
│Assessment │◄─────────►│ Tutor │◄─────────►│ Hint │
│ Agent │ │ Agent │ │ Agent │
│ (评估) │ │ (教学) │ │ (提示) │
└────┬──────┘ └───────────┘ └─────────────┘
│ ▲
│ │
┌────▼──────┐ ┌─────┴─────┐
5个Agent职责说明
#LRovrfmGkJyu text { white-space: pre; }#LRovrfmGkJyu .fb0 { stroke: var(--N900-FG, 0.15); }#LRovrfmGkJyu .fb0 {stroke: rgba(31,35,41, 0.15)}#LRovrfmGkJyu .fx0 { stroke-miterlimit: 10; }#LRovrfmGkJyu .fx0 {stroke-miterlimit: 10}#LRovrfmGkJyu .fa1 { fill: rgb(187, 191, 196); }#LRovrfmGkJyu .fa1 {fill: rgb(187, 191, 196)}#LRovrfmGkJyu .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#LRovrfmGkJyu .fx1 {font-style: normal}#LRovrfmGkJyu .fx2 { text-anchor: middle; }#LRovrfmGkJyu .fx2 {text-anchor: middle}#LRovrfmGkJyu .fx3 { dominant-baseline: central; }#LRovrfmGkJyu .fx3 {dominant-baseline: central}#LRovrfmGkJyu .fx4 { stroke: none; }#LRovrfmGkJyu .fx4 {stroke: none}#LRovrfmGkJyu .fc0 { fill: var(--text-caption); }#LRovrfmGkJyu .fc0 {fill: #646a73}#LRovrfmGkJyu .fa2 { fill: var(--text-link-disabled); }#LRovrfmGkJyu .fa2 {fill: rgb(187, 191, 196)}#LRovrfmGkJyu .fa3 { fill: rgb(225, 234, 255); }#LRovrfmGkJyu .fa3 {fill: rgb(225, 234, 255)}#LRovrfmGkJyu .fx5 { font: 700 16px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#LRovrfmGkJyu .fx5 {font-style: normal}#LRovrfmGkJyu .fx6 { text-anchor: start; }#LRovrfmGkJyu .fx6 {text-anchor: start}#LRovrfmGkJyu .fx7 { dominant-baseline: alphabetic; }#LRovrfmGkJyu .fx7 {dominant-baseline: alphabetic}#LRovrfmGkJyu .fc1 { fill: rgb(0, 0, 0); }#LRovrfmGkJyu .fc1 {fill: rgb(0, 0, 0)}#LRovrfmGkJyu .fx8 { font: 400 14px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#LRovrfmGkJyu .fx8 {font-style: normal}#LRovrfmGkJyu .fb1 { fill: var(--N900-FG, 0.15); }#LRovrfmGkJyu .fb1 {fill: rgba(31,35,41, 0.15)}#LRovrfmGkJyu .fb2 { fill: rgb(209, 217, 224); }#LRovrfmGkJyu .fb2 {fill: rgb(209, 217, 224)}#LRovrfmGkJyu .fa4 { fill: var(--bg-body); }#LRovrfmGkJyu .fa4 {fill: #fff}ABC123456Agent职责核心算法/技术Assessment Agent (评估)Tutor Agent (教学)Curriculum Agent (课程)Hint Agent (提示)Engagement Agent (互动)知识点掌握度评估、学习路径诊断苏格拉底式提问教学,动态调整难度动态生成学习路径,间隔重复排期分级提示:暗示→引导→直接答案监测学习状态,适时鼓励、调整节奏贝叶斯知识追踪(BKT)、Beta分布Prompt Engineering、难度自适应SM-2算法、知识图谱拓扑排序三级提示策略、尝试次数分析情感分析、响应时间分析
为什么用 Mesh + 事件驱动?
我们选择 Mesh 的原因:
📌
•
教学过程中,Tutor 需要随时请求 Hint,Assessment 需要通知 Curriculum 调整路径
📂 项目结构
代码块
Plain Text
multi-agent-education/
│
├── 📄 README.md ← 你正在看的这个文件
├── 📄 plan.md ← 完整项目计划
├── 📄 LICENSE ← MIT 开源协议
├── 📄 docker-compose.yml ← 一键启动全部服务
├── 📄 .gitignore ← Git 忽略文件
├── 📄 .env.example ← 环境变量模板(不含真实密钥)
│
├── 📁 docs/ ← 文档中心
🚀 快速开始(5分钟上手)
方式一:Python 版(最简单,推荐新手)
代码块
Markdown
# 1. 克隆项目
git clone https://github.com/你的用户名/multi-agent-education.git
cd multi-agent-education/python
# 2. 创建虚拟环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate

方式二:Java 版
代码块
Plain Text
cd multi-agent-education/java
# 需要 Java 21+ 和 Maven 3.9+

方式三:Go 版
代码块
Plain Text
cd multi-agent-education/golang
# 需要 Go 1.22+
go mod tidy
go run cmd/main.go
# 访问 http://localhost:8081/api/v1/health

方式四:Docker 一键启动(全部服务)
代码块
Markdown
cd multi-agent-education
# 启动所有服务(Python后端 + React前端 + PostgreSQL + Redis)
docker-compose up -d
# 访问前端:http://localhost:3000
# Python API:http://localhost:8000
# Java API:http://localhost:8080
# Go API:http://localhost:8081
🧠 核心算法详解
SM-2 间隔重复算法(Curriculum Agent 使用)
什么是间隔重复? 就是"快忘了的时候复习效果最好"。Anki、SuperMemo 都用这个算法。
核心公式:
代码块
Plain Text
复习间隔计算:
I(1) = 1 天(第1次复习)
I(2) = 6 天(第2次复习)
I(n) = I(n-1) × EF(之后每次间隔 = 上次间隔 × 难度因子)
难度因子更新:
EF' = EF - 0.8 + 0.28 × q - 0.02 × q²

代码
代码块
Python
"""
SM-2 间隔重复算法实现。
贝叶斯知识追踪 BKT(Assessment Agent 使用)
什么是 BKT? 用概率模型估计学生对每个知识点的掌握程度。
四个核心参数:
代码块
Plain Text
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)

代码
代码块
Python
"""
学习者模型 -- 贝叶斯知识追踪 (BKT)。
每个学习者有一个持久化的知识状态模型,记录其对每个知识点的掌握程度。
苏格拉底式教学策略(Tutor Agent 使用)
什么是苏格拉底式教学? 不直接告诉答案,而是通过提问引导学生自己发现答案。
代码块
Plain Text
学生:"二次函数 y = x² + 2x + 1 的顶点在哪里?"
❌ 直接给答案:"顶点是 (-1, 0)"
✅ 苏格拉底式引导:
第1轮:"你知道二次函数的顶点公式吗?或者,你能把这个式子配方吗?"
第2轮:"很好!你配成了 y = (x+1)²,那 (x+1)² 最小值是多少?此时 x 等于几?"
第3轮:"对了!所以顶点坐标是?"
代码
代码块
Python
"""
Tutor Agent(教学Agent)-- 苏格拉底式提问教学。
核心职责:
1. 根据学生水平采用苏格拉底式提问,引导而非告知
2. 根据Assessment结果动态调整教学难度
3. 当学生卡住时,请求Hint Agent提供分级提示
面试要点:
- 苏格拉底式教学:不给答案,通过反问让学生自己发现
- Prompt Engineering:针对不同mastery等级设计不同的Prompt模板
- 引导率85%目标:大部分情况只给暗示和引导
"""
import logging
from .base_agent import BaseAgent
from core.event_bus import Event, EventType
📋 面试全套准备
一、简历怎么写
推荐写法(Python方向)
🥇
项目名称:多Agent智能教育与个性化学习系统
技术栈:LangGraph / FastAPI / PostgreSQL / Redis / React / WebSocket
时间:2026.02 - 2026.04
- 设计5-Agent Mesh+事件驱动架构,Agent间通过EventBus双向异步通信,支持实时状态同步
- Tutor Agent采用苏格拉底式教学Prompt策略,引导率85%(暗示+引导),非直接给答案
- Curriculum Agent基于SM-2间隔重复算法动态调整学习路径,知识保留率提升35%
- Assessment Agent使用贝叶斯知识追踪(BKT)模型,持久化学习者模型,跟踪200+知识点掌握度
- 采用WebSocket实现师生实时交互,Agent响应延迟<500ms,支持1000+并发学习者
推荐写法(Java方向)
🍰
项目名称:多Agent智能教育与个性化学习系统
技术栈:Spring Boot 3 / Spring AI / Spring Event / PostgreSQL / React / WebSocket
时间:2026.02 - 2026.04
- 设计5-Agent事件驱动架构,基于Spring ApplicationEvent实现Agent间异步消息通信
- 使用@Async+ThreadPoolTaskExecutor实现Agent并行处理,QPS提升300%
- Tutor Agent采用苏格拉底式教学策略,85%场景通过引导而非直接给答案
- 实现SM-2间隔重复算法优化复习排期,BKT贝叶斯知识追踪量化200+知识点mastery
- ConcurrentHashMap保证学习者状态线程安全,支持1000+并发学习者
推荐写法(Go方向)
🦄
项目名称:多Agent智能教育与个性化学习系统
技术栈:Go 1.22 / goroutine+channel / net/http / PostgreSQL / React / WebSocket
时间:2026.02 - 2026.04
- 设计5-Agent CSP模型架构,每个Agent运行在独立goroutine,通过channel事件总线通信
- 缓冲channel实现异步事件分发,goroutine天然支持高并发Agent并行处理
- 实现BKT知识追踪+SM-2间隔重复算法,sync.RWMutex保证并发安全
- 系统支持10000+并发连接,单Agent响应延迟<50ms(Go高性能优势)
简历注意事项
量化结果:引导率85%、保留率提升35%、并发1000+、延迟<500ms
突出架构决策:为什么选Mesh不选Supervisor?为什么用EventBus?
体现深度:提到具体算法名(BKT、SM-2)而非泛泛说"AI算法"
不要写过多:项目经历控制在5-6条bullet point
二、STAR面试法模板
模板1:项目概述(必问)
S (Situation 情境):
🌰
T (Task 任务):
⛱️
我负责设计一个多Agent智能教育系统,核心目标:
实时评估每个学生对每个知识点的掌握程度
用苏格拉底式提问引导学生思考,而非直接给答案
动态调整学习路径和复习计划
监测学习状态,防止学生因挫败而放弃
A (Action 行动):
📚
架构选型:调研了CrewAI、LangGraph、Solace Agent Mesh等企业级框架,最终设计5-Agent Mesh架构+事件驱动总线
为什么Mesh而非Supervisor:教育场景需要Agent双向实时交互(如Tutor随时请求Hint),Supervisor的中心化调度是瓶颈
R (Result 结果):
🥇
引导率达85%(85%的困难场景通过暗示或引导解决,仅15%直接给答案)
学生主动思考时间增加60%
知识保留率提升35%(SM-2算法优化复习时机)
系统支持1000+并发学习者,Agent响应延迟<500ms
模板2:技术难点(常问)
S:多Agent之间的状态一致性是一个关键挑战。5个Agent并发读写学习者状态,如何保证数据一致?
T:设计一个既高效又一致的状态管理方案。
A:
采用"单写者策略":每个知识点的mastery只由Assessment Agent更新,其他Agent只读
乐观锁+版本号:每次更新带version字段,防止并发写冲突
事件溯源:所有状态变更通过事件记录,可以回溯和审计
参考了IntelliCode(EACL 2026论文)的集中式学习者模型设计
R:零数据丢失,事件可追溯,Debug效率提升50%
模板3:关于协作/选型决策(加分项)
S:团队对Agent编排模式有分歧——有人倾向Supervisor集中调度,有人倾向完全去中心化。
T:做技术选型决策,说服团队采用最适合教育场景的方案。
A:
我对比了三种模式的优缺点(Supervisor/Pipeline/Mesh),画出了每种模式下的事件流图
用具体场景说明:当学生答错 → Assessment更新mastery → Tutor需要实时知道 → 同时Hint要准备 → Engagement要监测,这种多方向同时交互,Supervisor的串行调度效率太低
最终选择Mesh+事件驱动:Agent之间通过EventBus双向通信,每个Agent只订阅自己关心的事件
R:团队达成共识,架构可扩展性验证:后续新增"家长通知Agent"只需3行代码(订阅事件即可),无需修改任何现有Agent
三、八股文50题精选
A. 多Agent系统基础 (10题)
3.1
什么是多Agent系统?和单Agent有什么区别?
🥛
多Agent系统(MAS)由多个具有独立能力的Agent协作完成任务。与单Agent的区别:
•
上下文隔离:每个Agent有独立的System Prompt和上下文窗口,避免指令冲突
•
专业分工:每个Agent专注自己的领域(评估/教学/提示),比一个"全能Agent"更精准
3.2
为什么本项目选Mesh+事件驱动,而不是Supervisor?
⚽
教育场景的特殊性:
•
Agent间需要双向实时交互:Tutor随时请求Hint,Assessment通知Curriculum
•
非线性流程:学生的学习路径不是固定的A→B→C,而是根据表现动态调整
•
松耦合需求:新增Agent(如家长通知Agent)不应该修改现有代码
•
Supervisor的中心调度在这种场景下是瓶颈和单点故障
3.3
事件驱动架构的优缺点?
🐵
优点:
•
松耦合:发布者不关心谁订阅,订阅者不关心谁发布
•
可扩展:新Agent只需订阅事件,不修改现有代码(开闭原则)
•
异步非阻塞:发布事件后不等待处理结果,提高吞吐量
•
事件溯源:所有事件有记录,方便Debug和审计
缺点:
3.4
什么是发布-订阅模式?和观察者模式的区别?
发布-订阅(Pub/Sub):发布者和订阅者通过中间件(EventBus/消息队列)解耦。发布者不知道订阅者是谁,订阅者不知道发布者是谁。
观察者模式:Subject直接通知Observer,是一对多的直接关系。
区别:Pub/Sub有中间件解耦,观察者模式是直接引用。本项目用的是Pub/Sub。
3.5
Agent的Memory如何设计?
两种记忆:
•
短期记忆:当前对话上下文(存储在Agent内部或Redis),包含最近的交互历史
•
长期记忆:学习者模型(存储在PostgreSQL),包含知识点mastery、学习偏好、历史数据
本项目中,LearnerModel就是长期记忆的核心,每次交互都更新并持久化。
3.6
Agent之间的通信方式有哪些?
•
消息传递:直接发送消息(如gRPC/HTTP调用),耦合度高
•
共享状态:通过共享数据库/Redis读写,需要处理并发
•
事件总线:发布-订阅模式,本项目使用的方式
•
黑板系统:所有Agent读写共享黑板,适合协商决策
3.7
如何防止Agent间的事件循环?
•
事件携带correlation_id追踪事件链
•
设置最大事件链长度(如10),超过则终止
•
每个Agent记录已处理的事件ID,避免重复处理
•
使用状态机控制Agent的处理状态
3.8
什么是LangGraph?它的核心概念是什么?
LangGraph是LangChain团队开发的Agent编排框架,核心概念:
•
StateGraph:有向图,节点是处理函数,边是状态转移
•
State:共享状态对象,所有节点可以读写
•
Node:处理节点,接收State返回更新后的State
•
Edge:状态转移边,可以是条件边(根据State决定走向)
•
Checkpoint:状态持久化,支持暂停和恢复
3.9
对比CrewAI、LangGraph、AutoGen三大框架
B. 核心算法 (10题)
3.10
什么是BKT(贝叶斯知识追踪)?
BKT是一种用概率模型估计学生知识掌握程度的方法。4个核心参数:
•
P(L₀):初始掌握概率(先验)
•
P(T):学习转移概率(每次练习后学会的概率)
•
P(G):猜测概率(不会但猜对)
•
P(S):失误概率(会但做错)
核心公式(答对时): P(L|correct) = P(L)(1-P(S)) / [P(L)(1-P(S)) + (1-P(L))P(G)]
3.11
BKT和简单正确率的区别?为什么用BKT?
简单正确率 = 正确次数 / 总次数,是静态的,不考虑学习过程。
BKT的优势:
•
动态追踪:每次练习后实时更新mastery,反映学习过程
•
考虑猜测和失误:答对不一定会了(可能猜的),答错不一定不会(可能失误)
•
概率建模:给出mastery的概率估计,有不确定性度量
•
学习转移:即使答错,也考虑"练习本身就在学"
SM-2间隔重复算法的核心公式?
代码块
Plain Text
EF' = EF - 0.8 + 0.28 × q - 0.02 × q² (EF范围[1.3, 2.5])
I(1) = 1天
I(2) = 6天
I(n) = I(n-1) × EF (n>2)
当q < 3(回答质量差)时,重置间隔从第1天重新开始。
SM-2中EF(难度因子)的含义?
EF (Easiness Factor) 衡量知识点对该学生的难度:
•
EF = 2.5:最容易,间隔增长最快
•
EF = 1.3:最难,间隔增长最慢
•
EF越大,说明学生对该知识点越熟练,复习间隔越长
为什么间隔重复比集中复习效果好?
心理学中的"间隔效应"(Spacing Effect):
•
大脑在"快要忘记"时复习,形成更强的长期记忆
•
集中复习虽然短期效果好,但遗忘速度也快
•
间隔重复利用遗忘曲线(Ebbinghaus Curve),在最佳时机触发复习
•
研究显示间隔重复的长期保留率是集中学习的3-5倍
知识图谱拓扑排序的应用场景?
在本项目中,知识图谱是一个DAG(有向无环图),拓扑排序用于:
确定学习顺序:前置知识必须排在前面
检查可学性:只有前置知识都掌握了,才推荐新知识点
生成补救路径:发现薄弱点时,向上追溯所有未掌握的前置知识
算法:Kahn's BFS拓扑排序,时间复杂度O(V+E)
三级提示策略的设计原理?
基于Vygotsky的最近发展区(ZPD)理论:
•
Level 1 (元认知暗示):引导学生反思自己的思考过程,如"你用到了所有已知条件吗?"
•
Level 2 (脚手架引导):给出关键步骤提示,但不给答案,如"这道题需要用到勾股定理"
•
Level 3 (直接答案):给出完整解法,仅在多次尝试失败后使用
逐级提升提示的具体程度,最大化学生自主思考的机会。
苏格拉底式教学是什么?如何实现?
苏格拉底式教学:不直接传授知识,而是通过提问引导学生自己发现答案。
实现方式:
根据学生mastery等级选择不同的Prompt模板
初学者:用简单的类比和例子
进阶者:引导发现问题关键步骤
熟练者:提出更深层思考问题
掌握者:引导归纳方法论和跨知识点联系
学习状态检测的特征工程?
行为特征包括:
•
响应时间趋势:越来越慢→可能困难/疲劳,越来越快→可能太简单
•
错误率趋势:连续错误≥3→挫败,正确率>90%→可能无聊
•
会话时长:>45分钟→疲劳风险
•
闲置时间:>5分钟无操作→可能分心
状态机:FOCUSED ↔ STRUGGLING → FRUSTRATED,FOCUSED → BORED,FOCUSED → FATIGUED
Beta分布在知识追踪中的作用?
Beta分布 Beta(α, β) 用于表示mastery的不确定性:
•
α ≈ 成功次数 + 1
•
β ≈ 失败次数 + 1
•
均值 = α/(α+β) ≈ 正确率
•
方差 ∝ 1/(α+β):数据越多,方差越小,置信度越高
优点:是二项分布的共轭先验,贝叶斯更新非常方便。
C. 系统设计与工程 (10题)
系统如何处理高并发?
Python版:asyncio事件循环 + FastAPI异步处理,单进程支持数千并发连接 Java版:Spring @Async + ThreadPoolTaskExecutor,多线程处理 Go版:goroutine(每个仅4KB栈内存)+ channel,天然高并发
WebSocket vs HTTP轮询?
本项目用WebSocket:教学交互需要实时推送Agent响应。
数据库设计考虑?
•
学习者模型存PostgreSQL(持久化、支持事务)
•
会话状态存Redis(快速读写、TTL过期)
•
事件历史存事件表(用于审计和回溯)
•
知识图谱可存图数据库(Neo4j)或关系表
如何做Agent的可观测性?
•
每个事件有唯一ID和correlation_id,可追踪完整事件链
•
结构化日志:[Agent名称] learner=XXX, event=XXX, data=XXX
•
OpenTelemetry分布式追踪(生产环境)
•
事件历史查询API(/api/v1/events/{learner_id})
如何测试多Agent系统?
•
单元测试:测试每个Agent的核心逻辑(BKT更新、SM-2计算)
•
集成测试:模拟事件流,验证Agent协作链路
•
端到端测试:模拟学生交互场景,验证完整教学流程
•
混沌测试:随机杀死某个Agent,验证系统降级能力
如何保证Agent的状态一致性?
本项目采用"单写者策略":
•
mastery只由Assessment Agent更新
•
复习计划只由Curriculum Agent更新
•
其他Agent只读取共享状态
•
所有状态变更通过事件通知,保证最终一致性
•
乐观锁(version字段)防止并发写冲突
系统的可扩展性设计?
•
新增Agent:只需实现BaseAgent接口+订阅事件,无需修改现有代码
•
新增知识点:添加到知识图谱即可,Agent逻辑不变
•
水平扩展:EventBus可替换为Kafka/RabbitMQ实现跨进程/跨机器
•
LLM替换:Agent的LLM调用通过抽象层隔离,支持切换模型
性能优化策略?
•
事件总线使用缓冲区,异步非阻塞处理
•
学习者模型缓存在内存,定期批量持久化
•
知识图谱拓扑排序结果缓存,增量更新
•
WebSocket连接池管理,避免资源泄漏
错误处理和容错设计?
•
每个Agent的事件处理用try-catch包裹,不影响其他Agent
•
EventBus安全执行handler,捕获panic/exception
•
重试机制:LLM调用失败自动重试3次,指数退避
•
降级策略:LLM不可用时使用模板回复
Docker部署架构?
代码块
Plain Text
docker-compose.yml
├── python-api (FastAPI服务)
├── frontend (React + Nginx)
├── postgres (数据库)
├── redis (缓存)
└── (可选) java-api / go-api
D. LLM与Prompt Engineering (10题)
苏格拉底式Prompt模板怎么设计的?
按学生mastery等级分级:
•
beginner:最简单的语言+生活类比+最简单的例题
•
developing:引导发现关键步骤+给提示而非答案
•
proficient:提出深层问题+引导发现知识联系
•
mastered:归纳方法论+跨知识点挑战题
每个模板都明确要求"不要直接给答案"。
如何评估Prompt的效果?
•
引导率:非直接给答案的回复占比,目标85%
•
学生后续正确率:引导后学生再做是否能做对
•
对话轮数:到达正确答案需要几轮引导
•
学生满意度:(如有)问卷或评分
LLM幻觉(Hallucination)如何处理?
•
数学解题限定在知识图谱范围内,不做超纲内容
•
答案验证:用规则引擎校验LLM给出的数学解答
•
Prompt中加入约束:"只使用以下知识点:XXX"
•
严重幻觉时降级为模板回复
Prompt中的温度(Temperature)参数如何选择?
•
教学场景用低温度(0.3-0.5):需要稳定、准确的教学内容
•
鼓励/互动用中温度(0.6-0.8):需要一定的创造性和多样性
•
绝不用高温度(>0.9):教育场景不能"胡说八道"
System Prompt和User Prompt的设计原则?
System Prompt:定义Agent角色、行为准则、约束条件(不变的部分) User Prompt:包含当前上下文、学生信息、具体问题(变化的部分)
原则:
•
System Prompt要具体明确,不能太泛
•
User Prompt包含必要的上下文信息
•
使用Few-shot示例展示期望的回答格式
E. 语言对比与选型 (10题)
Python asyncio vs Java Thread vs Go goroutine?
Spring Event vs 自定义EventBus?
Spring Event:
•
优点:与Spring IoC深度集成,@EventListener注解简洁,支持@Async
•
缺点:局限于单JVM,跨服务需要改用MQ
自定义EventBus(Python版):
•
优点:完全控制,灵活定制
•
缺点:需要自己处理线程安全、错误处理
生产环境建议:本地用Spring Event,分布式用Kafka/RabbitMQ。
Go channel和Java BlockingQueue的区别?
•
channel:语言原生支持,select多路复用,支持方向限制(chan<-, <-chan)
•
BlockingQueue:标准库实现,功能完善但语法较冗长
•
channel更适合CSP(通信顺序进程)模型
•
BlockingQueue更适合传统生产者-消费者模型
为什么Python更适合AI/ML项目?
•
最丰富的AI库生态:LangChain/LangGraph/CrewAI/AutoGen都是Python优先
•
LLM SDK优先支持Python:OpenAI、Anthropic等
•
快速原型开发:动态类型+简洁语法
•
数据科学生态:numpy、pandas、scikit-learn
三种语言的错误处理方式对比?
•
Python:try/except + 异步异常传播
•
Java:try/catch + checked exception + CompletableFuture异常
•
Go:返回值错误处理(error),panic/recover用于不可恢复错误
F. 综合与进阶 (10题)
如果要支持100万用户,架构怎么改?
EventBus替换为Kafka(分布式消息队列)
Agent服务化:每个Agent独立部署为微服务
学习者模型分片:按learner_id哈希分片到不同数据库
Redis Cluster做缓存层
Kubernetes编排,HPA自动扩缩容
CDN加速前端静态资源
如果Agent之间出现死锁怎么办?
本项目的事件驱动模式天然避免死锁(异步非阻塞)。但可能出现活锁:
•
两个Agent互相触发事件,形成无限循环
•
解决:事件链长度限制 + correlation_id追踪 + 去重
知识追踪还有哪些模型?BKT的局限?
•
DKT (Deep Knowledge Tracing):用LSTM/Transformer建模学习过程
•
IRT (Item Response Theory):基于题目难度和区分度的静态模型
•
SPARFA:稀疏因子分析
•
BKT局限:假设知识点独立(实际有关联),参数固定(不随时间变化)
这个项目有哪些可以改进的地方?
接入真实LLM,替代模板回复
添加RAG(检索增强生成),用教材内容辅助教学
学习者模型持久化到数据库
知识图谱可视化(前端展示学习路径)
用DKT替代BKT提高预测精度
A/B测试框架评估不同教学策略效果
多语言/多学科支持
如何衡量这个系统的效果?
A/B测试对比实验组(使用本系统)和对照组(传统教学):
•
知识保留率(1周后测试成绩对比)
•
学习效率(达到同等水平所需时间)
•
引导率(非直接给答案的比例)
•
学生留存率(继续使用的比例)
•
学生满意度(NPS评分)
事件溯源(Event Sourcing)在教育系统中的价值?
•
完整记录学生学习轨迹,可回溯任意时刻的状态
•
支持"时间旅行"Debug:回放事件重现问题
•
数据分析:挖掘学习模式和行为规律
•
审计合规:教育领域需要记录教学过程
如何处理冷启动问题(新学生没有数据)?
•
BKT初始mastery设为P(L₀)=0.1(保守估计)
•
入学测试:通过几道题快速定位水平
•
协同过滤:根据相似学生的学习轨迹推荐
•
分层默认值:按年级/学科设定不同的初始参数
RAG如何与多Agent结合?
Tutor Agent可以集成RAG:
学生提问 → 从教材向量库检索相关内容
将检索到的内容作为上下文注入Prompt
LLM基于教材内容生成苏格拉底式引导
这样保证教学内容基于教材,减少幻觉
Agent的安全性考虑?
•
Prompt注入防御:过滤学生输入中的恶意指令
•
内容安全:LLM输出过滤(不输出有害/不当内容)
•
数据隐私:学习者数据加密存储,GDPR合规
•
API鉴权:JWT/OAuth2保护接口
未来多Agent系统的发展方向?
•
Agent自主进化:Agent能根据教学效果自动优化策略
•
跨模态Agent:支持语音、图像、视频教学
•
Agent市场:像插件一样安装新Agent能力
•
Agent协议标准化:A2A (Agent-to-Agent) 协议、MCP等
•
端侧Agent:在手机/Edge设备上运行轻量Agent
四、面试常见项目问题及回答
Q1: "介绍一下你这个项目"
📌
Q2: "遇到最大的技术难点是什么?"
🎼
最大的难点是多Agent状态一致性。5个Agent并发处理,如何保证学习者模型的一致性? 我参考了EACL 2026的IntelliCode论文,采用了单写者策略: 每个数据维度只有一个Agent有写权限,其他Agent通过事件总线订阅变更通知。 结合乐观锁和事件溯源,实现了既高效又一致的状态管理。
Q3: "为什么用这个技术栈?"
⚽
选LangGraph是因为它原生支持StateGraph状态机编排,非常适合我们的Mesh架构。
选FastAPI因为异步支持好,原生WebSocket,API文档自动生成。
选PostgreSQL因为需要持久化学习者模型,支持JSON列存储知识状态。
Java版用Spring AI是因为企业级Java项目的主流选择。 Go版用标准库是因为Go的goroutine+channel天然适合Agent并发。
Q4: "如果让你重新做,会改什么?"
🥛
三个改进:
第一,接入真实LLM而不是模板回复,让教学更智能;
第二,用DKT(深度知识追踪)替代BKT,利用Transformer建模知识点间的关联;
第三,加入RAG模块,让Tutor Agent能基于教材内容精准教学,减少幻觉。
Q5: "你在团队中的角色是什么?"
💡
我负责整体架构设计和核心模块开发。
具体包括:事件驱动总线的设计、BKT和SM-2算法的实现、Tutor Agent的苏格拉底式Prompt策略设计,以及WebSocket实时通信层。 同时我也做了技术选型决策,对比了Supervisor和Mesh两种架构模式。
五、面试注意事项
Do(要做的)
带数据说话:引导率85%、保留率+35%、延迟<500ms
讲清WHY:为什么选这个架构?为什么用这个算法?
展示深度:提到具体论文(IntelliCode, EACL 2026)
准备追问:面试官一定会追问,准备好第二层、第三层回答
画图辅助:面试时画出架构图和事件流图
Don't(不要做的)
不要只说技术名词:不说"用了LangGraph"就完了,要说怎么用的、为什么用
不要背简历:STAR法需要自然讲述,不是朗读
不要说"我负责了全部":具体说你做了哪个模块
不要回避不会的问题:可以说"这部分我了解的设计方向是XXX,但具体实现还在研究"
不要忽视业务价值:技术是为教育服务的,展示你理解教育场景
简历怎么写
📚
项目名称:多Agent智能教育与个性化学习系统
技术栈:LangGraph / Spring AI / Go / PostgreSQL / React / WebSocket
- 设计5-Agent Mesh+事件驱动架构,Agent间通过EventBus双向异步通信,支持实时状态同步
- Tutor Agent采用苏格拉底式教学Prompt策略,引导率85%(暗示+引导),非直接给答案
- Curriculum Agent基于SM-2间隔重复算法动态调整学习路径,知识保留率提升35%
- Assessment Agent使用贝叶斯知识追踪(BKT)模型,持久化学习者模型,跟踪200+知识点掌握度
- 采用WebSocket实现师生实时交互,Agent响应延迟<500ms,支持1000+并发学习者
STAR 面试法怎么说
面试高频问题速查
技术栈说明
三种语言对比
参考的企业级开源项目