《提示工程架构师:解析 Agentic AI 在智能教育创新应用的关键因素》
副标题:从提示工程到自主学习代理:构建下一代智能教育系统的实践指南
摘要/引言
问题陈述
传统教育体系正面临三大核心挑战:个性化不足(教师难以兼顾每个学生的学习节奏与风格)、规模化困境(优质教育资源集中在少数场景,难以普惠)、反馈滞后(作业批改、学习效果评估往往延迟数天甚至更久)。近年来,AI教育应用虽有所突破(如自适应学习平台、智能题库),但大多停留在“被动响应”阶段——仅能根据预设规则或简单用户输入提供标准化内容,缺乏主动规划能力(如动态调整学习路径)、上下文理解(如关联学生过往学习历史)和持续迭代优化(如根据反馈改进教学策略)的能力。
核心方案
本文提出一种基于 Agentic AI(智能代理) 与 提示工程 深度融合的智能教育系统架构。通过构建具备“自主决策、动态记忆、工具使用、反思迭代”能力的教育代理,结合精细化的提示设计,解决传统AI教育应用的局限性。核心思路是:将教育代理视为“数字化助教”,通过提示工程定义其行为边界与教育目标,依托Agentic架构实现从“被动响应”到“主动引导”的跨越,最终达成“规模化个性化教育”的目标。
主要成果/价值
读完本文后,你将获得:
- 理论认知:理解Agentic AI在教育场景的核心优势,掌握提示工程如何赋能教育代理的关键机制;
- 技术框架:一套可落地的智能教育代理架构(含规划、记忆、工具、反思四大模块);
- 实践能力:通过分步实现案例,掌握用LangChain构建教育代理的核心代码,包括提示设计、记忆管理、工具集成等关键环节;
- 避坑指南:针对教育场景特有的挑战(如学生认知差异、内容准确性),提供提示优化与系统调优策略。
文章导览
本文将从“问题背景→核心概念→技术实现→实践验证→扩展优化”五个维度展开:
- 问题背景:深入分析传统教育与现有AI教育应用的痛点;
- 核心概念:拆解Agentic AI的架构组件与提示工程的关键作用;
- 环境准备:搭建开发环境,配置必要工具与依赖;
- 分步实现:从零构建一个“个性化学习代理”,涵盖提示设计、记忆模块、工具集成等环节;
- 验证与扩展:通过模拟场景验证系统效果,探讨性能优化、常见问题及未来方向。
目标读者与前置知识
目标读者
- 教育科技开发者:希望将AI代理集成到现有教育产品的工程师;
- AI应用工程师:关注Agentic AI落地场景,尤其是教育、培训领域的技术人员;
- 提示工程师:想深入理解“提示工程如何与智能代理结合”的从业者;
- 教育产品设计者:需要技术视角指导智能教育系统架构的产品经理。
前置知识
- 基础编程能力:熟悉Python语法(函数、类、异步编程);
- LLM基础:了解大语言模型(如GPT、Llama)的基本概念,知道Prompt/Completion工作流;
- 工具框架认知:见过LangChain、AutoGPT等Agent框架的基础用法(无需深入经验);
- 教育场景理解:了解学习路径规划、知识点评估、错题反馈等基本教育流程。
文章目录
- 引言与基础
- 问题背景与动机
- 核心概念与理论基础
- 环境准备
- 分步实现:构建个性化学习代理
- 5.1 定义教育代理的核心能力
- 5.2 设计提示工程框架
- 5.3 实现记忆模块(短期+长期)
- 5.4 集成教育工具链
- 5.5 构建反思与迭代机制
- 5.6 部署与API设计
- 关键代码解析与深度剖析
- 结果展示与验证
- 性能优化与最佳实践
- 常见问题与解决方案
- 未来展望与扩展方向
- 总结
- 参考资料
5. 问题背景与动机
传统教育的核心痛点
教育的本质是“个性化引导”,但传统模式受限于三大瓶颈:
- 资源约束:一位教师最多同时关注30-50名学生,无法为每个学生设计专属学习路径;
- 标准化矛盾:统一的教材、考试和进度,忽略了学生的认知水平差异(如有人擅长逻辑推理,有人擅长记忆);
- 反馈闭环断裂:学生完成作业→教师批改→学生收到反馈的周期通常超过24小时,难以形成“学习-反馈-修正”的即时闭环。
现有AI教育应用的局限性
近年来,AI教育工具(如Knewton、Coursera的自适应学习系统)试图解决上述问题,但仍存在明显短板:
技术类型 | 典型应用 | 优势 | 局限性 |
---|---|---|---|
规则引擎 | 智能题库(如作业帮) | 响应快、成本低 | 依赖人工预设规则,无法处理复杂场景 |
传统机器学习 | 学习行为分析平台 | 可量化学习模式 | 泛化能力弱,难以解释“为什么推荐此内容” |
基础LLM应用 | 作文批改、问答机器人 | 自然语言交互友好 | 被动响应,缺乏主动规划与长期记忆 |
核心瓶颈:现有系统本质是“工具”而非“代理”——它们只能执行预设任务(如批改作文、回答问题),无法像人类教师一样:
- 主动分析学生的知识漏洞(如“学生三角函数错误率高,可能是因为勾股定理基础不牢”);
- 动态调整教学策略(如“学生对视频讲解不感兴趣,切换为互动游戏模式”);
- 长期跟踪学习效果(如“三个月前学生的错题,现在是否已掌握”)。
Agentic AI:教育场景的破局点
Agentic AI(智能代理)的核心定义是“具备自主目标、能规划步骤、使用工具、反思结果的AI系统”。在教育场景中,其优势在于:
1. 自主规划能力
教育代理可根据学生目标(如“3个月内掌握高中数学”)和当前水平,自动拆解为子任务(如“第1周:集合与函数→第2周:基本初等函数→…”),并动态调整(如发现学生函数基础薄弱,插入3节补基础课程)。
2. 动态记忆系统
- 短期记忆:记住当前学习会话中的互动(如“学生刚才在指数函数题中混淆了定义域和值域”);
- 长期记忆:存储历史学习数据(如“学生3个月前在三角函数的错题类型”),实现跨会话的连贯性。
3. 工具集成能力
教育代理可调用专业工具解决特定问题,如:
- 调用“公式编辑器”生成数学题;
- 调用“知识图谱”可视化历史事件关系;
- 调用“语音合成工具”将文本转为听力材料。
4. 反思迭代机制
代理可通过“自我提问”优化教学策略,如:
- “刚才讲解微积分时,学生连续两次没理解,是否需要换一种比喻?”
- “推荐的学习资源学生没有打开,是否难度过高或类型不合适?”
6. 核心概念与理论基础
Agentic AI的核心组件
一个完整的Agentic系统需包含四大模块,我们以“教育代理”为例拆解其功能:
1. 规划器(Planner)
作用:将目标拆解为可执行的步骤,并动态调整计划。
教育场景实例:
- 输入:学生目标“一周内掌握一元二次方程”,当前水平“会解基础方程但不会配方”;
- 规划器输出:
步骤1:用30分钟复习基础方程解法(确认无遗忘); 步骤2:用45分钟学习“配方法”原理(结合图形化示例); 步骤3:完成5道基础配方题(实时反馈错误); 步骤4:挑战2道综合应用题(含实际场景); 步骤5:总结常见错误类型,生成错题集。
技术实现:通常通过LLM+提示设计实现,如给GPT-4输入“你是教育规划专家,根据学生情况生成学习计划…”。
2. 记忆系统(Memory)
作用:存储与检索代理与用户的交互数据,分为两类:
- 短期记忆(Working Memory):当前会话中的上下文信息(如最近5轮对话、当前学习进度),通常存储在内存中;
- 长期记忆(Long-Term Memory):跨会话的历史数据(如学生的知识图谱、学习偏好、长期目标),需持久化存储(如向量数据库、关系型数据库)。
教育场景实例:
- 短期记忆:“学生刚才在解x²+5x+6=0时,错将常数项6拆分为2和4(正确应为2和3)”;
- 长期记忆:“学生在过去3个月中,代数题正确率85%,几何题正确率60%,偏好视频讲解(点击量是文本的3倍)”。
3. 工具使用(Tool Use)
作用:调用外部API或工具完成代理自身无法直接处理的任务。教育场景中常用工具包括:
- 知识库检索:从课程数据库中获取相关知识点(如“从高中数学知识库中检索‘一元二次方程判别式’的权威解释”);
- 评估工具:自动生成测验并评分(如“根据学生当前水平生成3道配方法应用题,并给出难度评级”);
- 互动工具:实现多样化教学形式(如“调用绘图工具生成函数图像”“调用语音工具进行听力练习”);
- 外部数据接口:获取实时教育资源(如“调用Khan Academy API获取最新课程视频”)。
4. 反思机制(Reflection)
作用:评估自身行为结果,迭代优化策略。教育场景中表现为:
- 错误分析:“学生连续3道题出错,是否因为我讲解时省略了关键步骤?”
- 策略调整:“学生对文字解释不敏感,下次改用动画演示”;
- 目标校准:“原计划1周完成的内容,学生需要10天,是否调整整体进度?”
技术实现:通过“反思提示”引导LLM自我评估,如:“回顾刚才的教学过程,列出3个可以改进的地方,并说明原因。”
提示工程:Agentic教育系统的“操作系统”
如果说Agentic架构是“硬件”,提示工程就是驱动硬件的“操作系统”。在教育代理中,提示工程的核心作用是:
1. 定义代理角色与边界
通过“系统提示”明确代理的身份、能力范围和伦理准则,例如:
你是一名高中数学个性化学习代理,名为“MathMentor”。你的职责是:
1. 根据学生当前水平和目标,生成每日学习计划;
2. 用通俗语言讲解数学概念,避免使用过于专业的术语;
3. 每讲解一个知识点后,必须通过1道简单题验证学生理解;
4. 禁止直接给出答案,需引导学生自主思考(如“你觉得这一步应该先算什么?”);
5. 若学生情绪低落(如输入“太难了”“不想学”),优先进行鼓励而非继续教学。
2. 结构化输入输出
通过提示模板规范代理与用户的交互格式,例如:
- 学生输入模板:“知识点:[学生当前学习的知识点];操作:[提问/练习/反馈];内容:[具体内容]”
- 代理输出模板:“[理解确认] 我已了解你在[知识点]的问题。[教学步骤] 1. … 2. … [互动检验] 请尝试解决这道题:[题目]”
3. 增强教育场景适配性
针对教育特有的需求设计提示,例如:
- 认知水平适配:“用5年级学生能理解的语言解释‘负数’,可以结合温度(如零下5度)的例子”;
- 学习风格适配:“学生偏好视觉学习,讲解‘二次函数图像’时,先描述图像形状(开口方向、顶点),再讲公式”;
- 错误引导提示:“当学生答错时,先肯定正确部分(如‘你的思路方向是对的’),再指出错误(如‘但这里忽略了x的取值范围’)”。
Agentic教育系统架构图
┌─────────────────────────────────────────────────────────┐
│ 学生(用户) │
└───────────────────────────┬─────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────┐
│ 教育代理(Agent) │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌────────┐ │
│ │ 规划器 │ │ 记忆系统 │ │ 工具使用 │ │ 反思机制│ │
│ │(学习路径)│ │(短期+长期)│ │(知识库/评估)│ │(优化策略)│ │
│ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ └────┬───┘ │
│ │ │ │ │ │
│ └──────────────┼──────────────┼─────────────┘ │
│ │ │ │
│ ┌───────────────────┐ │ ┌──────────┐ │ ┌──────────────┐ │
│ │ 提示工程框架 │◄┘ │ LLM模型 │◄┘ │ 外部工具集 │ │
│ │(角色定义/模板) │───►│(GPT-4等)│───►│(知识库/API) │ │
│ └───────────────────┘ └──────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
7. 环境准备
开发工具链
为构建Agentic教育代理,我们需要以下工具(均为开源或可免费试用):
工具/框架 | 用途 | 版本要求 |
---|---|---|
Python | 核心编程语言 | 3.10+ |
LangChain | Agentic AI开发框架(规划/记忆/工具) | 0.1.0+ |
LLM模型 | 核心推理引擎 | GPT-4(推荐)或Llama 3 70B |
Chroma | 向量数据库(存储长期记忆) | 0.4.15+ |
FastAPI | Web框架(部署代理API) | 0.104.1+ |
Pydantic | 数据模型验证 | 2.4.2+ |
python-dotenv | 环境变量管理 | 1.0.0+ |
环境配置步骤
Step 1:创建虚拟环境
# 创建虚拟环境
python -m venv agentic-edu-env
# 激活环境(Windows)
agentic-edu-env\Scripts\activate
# 激活环境(Mac/Linux)
source agentic-edu-env/bin/activate
Step 2:安装依赖
创建 requirements.txt
文件:
langchain==0.1.5
langchain-openai==0.1.0
chromadb==0.4.18
fastapi==0.104.1
uvicorn==0.24.0
pydantic==2.5.2
python-dotenv==1.0.0
numpy==1.26.0
python-multipart==0.0.6
安装依赖:
pip install -r requirements.txt
Step 3:配置API密钥与环境变量
创建 .env
文件,填入必要的API密钥(根据使用的LLM模型选择):
# OpenAI API(若使用GPT-4/GPT-3.5)
OPENAI_API_KEY=your_openai_api_key
OPENAI_MODEL_NAME=gpt-4
# 或Llama 3 API(如通过Replicate、Together.ai调用)
LLAMA_API_KEY=your_llama_api_key
LLAMA_MODEL_NAME=meta/llama-3-70b-instruct
# Chroma向量数据库(本地模式无需密钥)
CHROMA_PERSIST_DIRECTORY=./chroma_memory
Step 4:准备教育知识库(可选)
为演示工具调用功能,我们需要一个小型教育知识库(以高中数学为例)。创建 data/education_kb/
目录,放入以下文件:
algebra_basics.txt
:代数基础知识(如方程定义、一元一次方程解法);quadratic_equations.txt
:一元二次方程知识点(定义、解法、判别式);student_common_mistakes.txt
:学生常见错误类型(如符号错误、配方步骤遗漏)。
后续步骤中,代理将通过工具检索这些知识。
8. 分步实现:构建个性化学习代理
我们将构建一个名为“MathMentor”的数学学习代理,核心能力包括:
- 分析学生当前数学水平;
- 生成个性化学习路径;
- 实时讲解知识点并提供练习;
- 长期跟踪学习效果并优化策略。
以下是详细实现步骤:
5.1 定义教育代理的核心能力与目标
首先明确代理的角色定位和核心功能,这将指导后续的提示设计和模块开发。
核心能力清单
- 水平评估:通过简短测验判断学生对目标知识点的掌握程度(0-100分);
- 路径规划:根据评估结果和学习目标,生成日/周学习计划;
- 知识点讲解:用通俗语言解释概念,适配学生认知水平;
- 互动练习:生成针对性练习题,提供即时反馈;
- 长期跟踪:记录学习历史,定期复习薄弱点。
目标定义(系统提示初稿)
创建 prompts/system_prompt.py
,定义代理的基础角色:
SYSTEM_PROMPT = """
你是MathMentor,一名专业的高中数学个性化学习代理。你的核心目标是帮助学生高效掌握数学知识,培养自主学习能力。
### 角色要求
1. 专业严谨:所有数学概念、公式、解题步骤必须准确无误;
2. 耐心友好:用鼓励性语言,避免让学生感到挫败(如学生犯错时,先肯定思路,再指出问题);
3. 因材施教:根据学生的反馈调整讲解深度(如学生说“听不懂”,用更简单的例子);
4. 目标导向:始终围绕学生的学习目标(如“3周内掌握一元二次方程”)推进。
### 禁止行为
- 不直接给出答案,需引导学生思考(如“这一步应该先算什么?提示:回忆判别式的公式”);
- 不讨论与数学学习无关的内容(如拒绝回答“今天天气如何”);
- 不使用学生未学过的高级概念解释当前知识点。
"""
5.2 设计提示工程框架
提示工程是Agentic教育系统的“灵魂”,我们需要设计三类核心提示:系统提示(定义角色)、用户提示模板(规范交互格式)、反思提示(驱动迭代优化)。
1. 系统提示优化
基于5.1的初稿,补充教育场景特有的引导逻辑,例如“如何判断学生认知水平”“如何设计练习题难度”:
# prompts/system_prompt.py(优化版)
SYSTEM_PROMPT = """
你是MathMentor,一名专业的高中数学个性化学习代理。你的核心目标是帮助学生高效掌握数学知识,培养自主学习能力。
### 角色要求
1. 专业严谨:所有数学概念、公式、解题步骤必须准确无误;
2. 耐心友好:用鼓励性语言,避免让学生感到挫败(如学生犯错时,先肯定思路,再指出问题);
3. 因材施教:
- 若学生使用“太难了”“听不懂”等反馈,立即切换为更简单的例子(如用“分蛋糕”解释分数);
- 若学生快速正确完成3道题,自动提升下一题难度(如从基础题→应用题);
4. 目标导向:始终围绕学生的学习目标(如“3周内掌握一元二次方程”)推进。
### 核心工作流程
1. **水平评估**:首次对话时,先通过3道基础题评估学生水平(例:“我们先做3道题了解你的基础,好吗?”);
2. **路径生成**:根据评估结果生成学习计划(格式:“【今日计划】1. 知识点讲解(30分钟)→ 2. 基础练习(20分钟)→ 3. 综合应用(25分钟)”);
3. **讲解与练习**:讲解后必须跟进练习(如“现在请尝试解这道题:x²-4x+3=0,用你喜欢的方法”);
4. **反馈与反思**:学生完成练习后,先评分(如“正确率60%”),再分析错误原因(如“你在配方时忘记将常数项移到右边”)。
### 禁止行为
- 不直接给出答案,需引导学生思考(如“这一步应该先算什么?提示:回忆判别式的公式”);
- 不讨论与数学学习无关的内容(如拒绝回答“今天天气如何”);
- 不使用学生未学过的高级概念解释当前知识点。
"""
2. 用户提示模板
设计标准化的用户输入格式,帮助代理快速提取关键信息(如当前知识点、学生反馈)。创建 prompts/user_prompt_templates.py
:
# 用户输入模板:学生发起学习请求
LEARNING_REQUEST_TEMPLATE = """
用户学习请求:
- 目标知识点:{target_knowledge} # 如“一元二次方程的配方法”
- 当前进度:{current_progress} # 如“刚学完定义,不会解方程”
- 可用时间:{available_time} # 如“今天有45分钟”
- 特殊需求:{special_needs} # 如“偏好视频讲解(若无则用文字)”
"""
# 用户输入模板:学生回答练习题
EXERCISE_RESPONSE_TEMPLATE = """
练习反馈:
- 题目ID:{exercise_id} # 练习题唯一标识
- 学生答案:{student_answer} # 学生输入的答案
- 作答时间:{time_spent}分钟 # 完成题目耗时
- 学生自评:{self_evaluation} # 如“感觉这道题很难”“不确定答案是否正确”
"""
3. 反思提示模板
设计反思提示,引导代理评估教学效果并优化策略。创建 prompts/reflection_prompt.py
:
REFLECTION_PROMPT = """
回顾刚才与学生的互动,请从以下维度进行自我评估并提出改进方案:
1. **学生理解度**:学生是否完全理解了讲解内容?(证据:如“连续2次提问同一问题”可能表示未理解)
2. **练习效果**:练习题难度是否匹配学生水平?(如“正确率<50%”可能太难,>90%可能太简单)
3. **时间管理**:是否在学生可用时间内完成了计划内容?(如计划45分钟,实际用了60分钟)
4. **互动体验**:学生是否有积极反馈?(如“太有趣了”vs“好无聊”)
请输出:
- 评估结论(1-2句话总结问题);
- 改进方案(具体可操作的步骤,如“下次讲解时增加动画演示”)。
"""
5.3 实现记忆模块(短期+长期)
记忆是Agentic系统的“大脑”,我们需要同时实现短期记忆(当前会话)和长期记忆(跨会话)。
短期记忆:会话上下文管理
使用LangChain的 ConversationBufferMemory
存储当前会话的交互历史:
# memory/short_term_memory.py
from langchain.memory import ConversationBufferMemory
def init_short_term_memory():
"""初始化短期记忆(会话内上下文)"""
return ConversationBufferMemory(
memory_key="chat_history", # 存储键名,后续可通过{chat_history}在提示中引用
return_messages=True, # 返回Message对象而非字符串,便于处理
input_key="user_input", # 用户输入的键名
output_key="agent_response" # 代理输出的键名
)
长期记忆:向量数据库存储
使用Chroma向量数据库存储长期记忆(如学生水平评估、学习偏好、历史错题)。向量数据库的优势是可通过语义相似度检索相关记忆(如“检索与‘配方法错误’相关的历史记录”)。
创建 memory/long_term_memory.py
:
# memory/long_term_memory.py
import chromadb
from chromadb.config import Settings
from dotenv import load_dotenv
import os
load_dotenv() # 加载.env文件
class LongTermMemory:
def __init__(self):
# 初始化Chroma客户端(本地模式)
self.client = chromadb.Client(
Settings(
persist_directory=os.getenv("CHROMA_PERSIST_DIRECTORY"), # 数据存储路径
chroma_db_impl="duckdb+parquet"
)
)
# 获取或创建记忆集合(类似数据库表)
self.collection = self.client.get_or_create_collection(name="student_memory")
def add_memory(self, student_id: str, memory_content: str, memory_type: str):
"""
添加长期记忆
:param student_id: 学生唯一标识
:param memory_content: 记忆内容(如“2024-05-20:一元二次方程测试得分75分”)
:param memory_type: 记忆类型(如“assessment”“preference”“mistake”)
"""
# 生成唯一ID(学生ID+时间戳)
import uuid
memory_id = f"{student_id}_{uuid.uuid4().hex[:8]}"
# 添加到向量数据库(Chroma会自动生成嵌入向量)
self.collection.add(
documents=[memory_content],
metadatas=[{"student_id": student_id, "type": memory_type, "timestamp": str(uuid.uuid1())}],
ids=[memory_id]
)
# 持久化数据
self.client.persist()
def retrieve_memory(self, student_id: str, query: str, top_k: int = 3):
"""
检索相关记忆
:param student_id: 学生ID
:param query: 检索关键词(如“一元二次方程 常见错误”)
:param top_k: 返回最相关的top_k条记忆
:return: 记忆内容列表
"""
results = self.collection.query(
query_texts=[query],
where={"student_id": student_id}, # 仅检索该学生的记忆
n_results=top_k
)
return results["documents"]
# 初始化长期记忆实例
long_term_memory = LongTermMemory()
5.4 集成教育工具链
教育代理需要调用工具完成特定任务(如检索知识点、生成练习题)。我们使用LangChain的 Tool
和 Toolkit
抽象工具,用 initialize_agent
将工具与LLM绑定。
工具1:知识库检索工具
实现从本地知识库(data/education_kb/
)检索数学知识点的工具:
# tools/knowledge_retrieval.py
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
import os
from dotenv import load_dotenv
load_dotenv()
class KnowledgeBaseTool:
def __init__(self):
# 加载知识库文档
self.loader = TextLoader
self.text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50 # 文档分块大小
)
# 初始化嵌入模型(用于生成文档向量)
self.embeddings = OpenAIEmbeddings(api_key=os.getenv("OPENAI_API_KEY"))
# 加载并处理文档
self.documents = self._load_documents()
self.db = Chroma.from_documents(
documents=self.documents,
embedding=self.embeddings,
persist_directory="./chroma_kb"
)
self.db.persist()
def _load_documents(self):
"""加载data/education_kb/目录下的所有文本文件"""
docs = []
kb_dir = "data/education_kb"
for filename in os.listdir(kb_dir):
if filename.endswith(".txt"):
loader = self.loader(os.path.join(kb_dir, filename))
docs.extend(loader.load_and_split(text_splitter=self.text_splitter))
return docs
def retrieve_knowledge(self, query: str, top_k: int = 2):
"""检索与query最相关的知识点"""
docs = self.db.similarity_search(query, k=top_k)
return "\n\n".join([doc.page_content for doc in docs])
# 初始化知识库工具
knowledge_tool = KnowledgeBaseTool()
工具2:练习题生成与评分工具
实现自动生成数学练习题并评分的工具:
# tools/exercise_generator.py
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
llm = OpenAI(api_key=os.getenv("OPENAI_API_KEY"), temperature=0.7) # 0.7表示中等随机性
class ExerciseTool:
def __init__(self):
# 练习题生成提示模板
self.generate_prompt = PromptTemplate(
input_variables=["knowledge_point", "difficulty", "num_questions"],
template="""
作为数学教师,请生成{num_questions}道关于“{knowledge_point}”的练习题,难度为{difficulty}(1=简单,2=中等,3=困难)。
要求:
- 题目类型为解答题(需写出步骤);
- 每道题包含题干、(可选)图描述、分值(10分/题);
- 最后附上详细参考答案(含步骤分评分标准)。
输出格式:
【题目1】
题干:...
分值:10分
【参考答案】
步骤1:...(5分)
步骤2:...(3分)
步骤3:...(2分)
"""
)
self.generate_chain = LLMChain(llm=llm, prompt=self.generate_prompt)
# 练习题评分提示模板
self.grade_prompt = PromptTemplate(
input_variables=["question", "reference_answer", "student_answer"],
template="""
作为数学阅卷老师,请根据以下信息给学生答案评分(总分10分):
【题目】{question}
【参考答案】{reference_answer}
【学生答案】{student_answer}
评分要求:
- 按步骤给分(参考参考答案的步骤分值);
- 指出学生答案中的正确部分和错误部分;
- 最终得分保留1位小数。
输出格式:
得分:X.X/10分
正确部分:...
错误部分:...
改进建议:...
"""
)
self.grade_chain = LLMChain(llm=llm, prompt=self.grade_prompt)
def generate_exercises(self, knowledge_point: str, difficulty: int = 2, num_questions: int = 1):
"""生成练习题"""
return self.generate_chain.run(
knowledge_point=knowledge_point,
difficulty=difficulty,
num_questions=num_questions
)
def grade_exercise(self, question: str, reference_answer: str, student_answer: str):
"""评分学生答案"""
return self.grade_chain.run(
question=question,
reference_answer=reference_answer,
student_answer=student_answer
)
# 初始化练习工具
exercise_tool = ExerciseTool()
工具3:水平评估工具
实现通过简短测验评估学生水平的工具:
# tools/assessment_tool.py
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI
import os
llm = OpenAI(api_key=os.getenv("OPENAI_API_KEY"), temperature=0.5) # 评估需准确性,降低随机性
class AssessmentTool:
def __init__(self):
# 评估测验生成模板
self.assessment_prompt = PromptTemplate(
input_variables=["knowledge_point"],
template="""
生成3道关于“{knowledge_point}”的基础测验题,用于快速评估学生水平(5分钟内完成)。
题型:选择题(3题),每题4个选项(A/B/C/D),只有1个正确答案。
输出格式:
【测验题】
1. 题干...
A. ... B. ... C. ... D. ...
2. ...
3. ...
【答案】1.A 2.B 3.C
"""
)
self.assessment_chain = LLMChain(llm=llm, prompt=self.assessment_prompt)
# 水平评级模板
self.rating_prompt = PromptTemplate(
input_variables=["num_correct", "total_questions"],
template="""
学生完成了{total_questions}道测验题,正确{num_correct}道。请给出水平评级(1-5星)并说明理由。
评级标准:
- 5星:正确率100%(完全掌握)
- 4星:正确率80%-99%(基本掌握, minor漏洞)
- 3星:正确率60%-79%(部分掌握,需加强练习)
- 2星:正确率40%-59%(基础薄弱,需重新学习核心概念)
- 1星:正确率<40%(未掌握,需从前置知识开始)
输出格式:
评级:X星
理由:...
建议:...(如“重点复习XX知识点”)
"""
)
self.rating_chain = LLMChain(llm=llm, prompt=self.rating_prompt)
def generate_assessment(self, knowledge_point: str):
"""生成评估测验"""
return self.assessment_chain.run(knowledge_point=knowledge_point)
def rate_level(self, num_correct: int, total_questions: int = 3):
"""根据正确率评级水平"""
return self.rating_chain.run(num_correct=num_correct, total_questions=total_questions)
# 初始化评估工具
assessment_tool = AssessmentTool()
绑定工具与Agent
将上述工具整合为工具列表,用LangChain的 initialize_agent
创建教育代理:
# agent/education_agent.py
from langchain.agents import initialize_agent, AgentType
from langchain_openai import OpenAI
from langchain.tools import Tool
from tools.knowledge_retrieval import knowledge_tool
from tools.exercise_generator import exercise_tool
from tools.assessment_tool import assessment_tool
from memory.short_term_memory import init_short_term_memory
from prompts.system_prompt import SYSTEM_PROMPT
import os
from dotenv import load_dotenv
load_dotenv()
# 初始化LLM(使用GPT-3.5-turbo-Instruct,成本较低且足够支持教育场景)
llm = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
model_name="gpt-3.5-turbo-instruct",
temperature=0.6 # 0.6表示中等创造力(讲解需生动,规划需严谨)
)
# 定义工具列表
tools = [
Tool(
name="KnowledgeBaseRetrieval",
func=knowledge_tool.retrieve_knowledge,
description="""
当需要准确的数学知识点定义、公式推导或标准解题步骤时使用。
输入:学生ID和查询关键词(如“一元二次方程 配方法步骤”)
输出:相关知识点文本
"""
),
Tool(
name="ExerciseGenerator",
func=lambda kp, d, n: exercise_tool.generate_exercises(kp, d, n),
description="""
当需要生成练习题时使用。
输入:知识点(如“一元二次方程”)、难度(1-3)、题目数量(1-5)
输出:包含题干、参考答案的练习题
"""
),
Tool(
name="ExerciseGrading",
func=lambda q, ra, sa: exercise_tool.grade_exercise(q, ra, sa),
description="""
当需要给学生答案评分时使用。
输入:题目文本、参考答案、学生答案
输出:得分、正确/错误分析、改进建议
"""
),
Tool(
name="LevelAssessment",
func=lambda kp: assessment_tool.generate_assessment(kp),
description="""
当需要评估学生当前水平时使用(首次接触新知识点时必用)。
输入:知识点(如“一元二次方程”)
输出:3道选择题测验题及答案
"""
),
Tool(
name="LevelRating",
func=lambda c, t: assessment_tool.rate_level(c, t),
description="""
当需要根据测验正确率评级学生水平时使用。
输入:正确题数、总题数(默认3)
输出:5星评级、理由、学习建议
"""
)
]
# 初始化短期记忆
short_term_memory = init_short_term_memory()
# 创建教育代理
education_agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION, # 支持对话记忆+工具调用
memory=short_term_memory,
system_message=SYSTEM_PROMPT,
verbose=True # 调试模式:打印思考过程
)
5.5 构建反思与迭代机制
代理需要根据互动结果反思并优化策略。我们通过“定期触发反思提示”实现这一机制。
# agent/reflection_mechanism.py
from prompts.reflection_prompt import REFLECTION_PROMPT
from langchain_openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
reflection_llm = OpenAI(temperature=0.5) # 反思需逻辑性,降低随机性
def run_reflection(chat_history: str):
"""
运行反思机制
:param chat_history: 最近的对话历史(短期记忆内容)
:return: 反思结论与改进方案
"""
reflection_input = f"对话历史:{chat_history}\n\n{REFLECTION_PROMPT}"
reflection_result = reflection_llm.predict(reflection_input)
return reflection_result
def periodic_reflection(agent, trigger_condition: str = "after_exercise"):
"""
定期触发反思(如练习后、会话结束时)
:param agent: 教育代理实例
:param trigger_condition: 触发条件("after_exercise"/"end_session")
"""
if trigger_condition == "after_exercise":
# 获取最近的练习反馈(从短期记忆中提取)
chat_history = agent.memory.load_memory_variables({})["chat_history"]
# 检查是否包含练习反馈
if any("练习反馈" in msg.content for msg in chat_history):
reflection_result = run_reflection(chat_history)
print(f"【反思结果】\n{reflection_result}")
# 将反思结果存入长期记忆(供未来优化使用)
from memory.long_term_memory import long_term_memory
long_term_memory.add_memory(
student_id="test_student_001", # 实际应用中需替换为真实学生ID
memory_content=f"反思:{reflection_result}",
memory_type="reflection"
)
# 其他触发条件(如会话结束)可类似实现
5.6 部署与API设计
使用FastAPI将代理封装为API服务,供前端或其他系统调用。
创建 main.py
:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from agent.education_agent import education_agent
from agent.reflection_mechanism import periodic_reflection
from memory.long_term_memory import long_term_memory
from prompts.user_prompt_templates import LEARNING_REQUEST_TEMPLATE, EXERCISE_RESPONSE_TEMPLATE
app = FastAPI(title="MathMentor API")
# 数据模型:学习请求
class LearningRequest(BaseModel):
student_id: str
target_knowledge: str
current_progress: str = ""
available_time: str = "30分钟"
special_needs: str = ""
# 数据模型:练习反馈
class ExerciseResponse(BaseModel):
student_id: str
exercise_id: str
student_answer: str
time_spent: int
self_evaluation: str = ""
@app.post("/start_learning")
async def start_learning(request: LearningRequest):
"""开始学习会话:评估水平并生成计划"""
try:
# 格式化用户输入
user_input = LEARNING_REQUEST_TEMPLATE.format(
target_knowledge=request.target_knowledge,
current_progress=request.current_progress,
available_time=request.available_time,
special_needs=request.special_needs
)
# 代理处理请求(首次调用会触发水平评估工具)
response = education_agent.run(input=user_input)
# 记录学习目标到长期记忆
long_term_memory.add_memory(
student_id=request.student_id,
memory_content=f"学习目标:{request.target_knowledge},可用时间:{request.available_time}",
memory_type="goal"
)
return {"agent_response": response}
except Exception as e:
raise HTTPException(status_code=500, detail=f"学习会话启动失败:{