《提示工程架构师:解析 Agentic AI 在智能教育创新应用的关键因素》

《提示工程架构师:解析 Agentic AI 在智能教育创新应用的关键因素》

副标题:从提示工程到自主学习代理:构建下一代智能教育系统的实践指南

摘要/引言

问题陈述

传统教育体系正面临三大核心挑战:个性化不足(教师难以兼顾每个学生的学习节奏与风格)、规模化困境(优质教育资源集中在少数场景,难以普惠)、反馈滞后(作业批改、学习效果评估往往延迟数天甚至更久)。近年来,AI教育应用虽有所突破(如自适应学习平台、智能题库),但大多停留在“被动响应”阶段——仅能根据预设规则或简单用户输入提供标准化内容,缺乏主动规划能力(如动态调整学习路径)、上下文理解(如关联学生过往学习历史)和持续迭代优化(如根据反馈改进教学策略)的能力。

核心方案

本文提出一种基于 Agentic AI(智能代理)提示工程 深度融合的智能教育系统架构。通过构建具备“自主决策、动态记忆、工具使用、反思迭代”能力的教育代理,结合精细化的提示设计,解决传统AI教育应用的局限性。核心思路是:将教育代理视为“数字化助教”,通过提示工程定义其行为边界与教育目标,依托Agentic架构实现从“被动响应”到“主动引导”的跨越,最终达成“规模化个性化教育”的目标。

主要成果/价值

读完本文后,你将获得:

  • 理论认知:理解Agentic AI在教育场景的核心优势,掌握提示工程如何赋能教育代理的关键机制;
  • 技术框架:一套可落地的智能教育代理架构(含规划、记忆、工具、反思四大模块);
  • 实践能力:通过分步实现案例,掌握用LangChain构建教育代理的核心代码,包括提示设计、记忆管理、工具集成等关键环节;
  • 避坑指南:针对教育场景特有的挑战(如学生认知差异、内容准确性),提供提示优化与系统调优策略。

文章导览

本文将从“问题背景→核心概念→技术实现→实践验证→扩展优化”五个维度展开:

  1. 问题背景:深入分析传统教育与现有AI教育应用的痛点;
  2. 核心概念:拆解Agentic AI的架构组件与提示工程的关键作用;
  3. 环境准备:搭建开发环境,配置必要工具与依赖;
  4. 分步实现:从零构建一个“个性化学习代理”,涵盖提示设计、记忆模块、工具集成等环节;
  5. 验证与扩展:通过模拟场景验证系统效果,探讨性能优化、常见问题及未来方向。

目标读者与前置知识

目标读者

  • 教育科技开发者:希望将AI代理集成到现有教育产品的工程师;
  • AI应用工程师:关注Agentic AI落地场景,尤其是教育、培训领域的技术人员;
  • 提示工程师:想深入理解“提示工程如何与智能代理结合”的从业者;
  • 教育产品设计者:需要技术视角指导智能教育系统架构的产品经理。

前置知识

  • 基础编程能力:熟悉Python语法(函数、类、异步编程);
  • LLM基础:了解大语言模型(如GPT、Llama)的基本概念,知道Prompt/Completion工作流;
  • 工具框架认知:见过LangChain、AutoGPT等Agent框架的基础用法(无需深入经验);
  • 教育场景理解:了解学习路径规划、知识点评估、错题反馈等基本教育流程。

文章目录

  1. 引言与基础
  2. 问题背景与动机
  3. 核心概念与理论基础
  4. 环境准备
  5. 分步实现:构建个性化学习代理
    • 5.1 定义教育代理的核心能力
    • 5.2 设计提示工程框架
    • 5.3 实现记忆模块(短期+长期)
    • 5.4 集成教育工具链
    • 5.5 构建反思与迭代机制
    • 5.6 部署与API设计
  6. 关键代码解析与深度剖析
  7. 结果展示与验证
  8. 性能优化与最佳实践
  9. 常见问题与解决方案
  10. 未来展望与扩展方向
  11. 总结
  12. 参考资料

5. 问题背景与动机

传统教育的核心痛点

教育的本质是“个性化引导”,但传统模式受限于三大瓶颈:

  • 资源约束:一位教师最多同时关注30-50名学生,无法为每个学生设计专属学习路径;
  • 标准化矛盾:统一的教材、考试和进度,忽略了学生的认知水平差异(如有人擅长逻辑推理,有人擅长记忆);
  • 反馈闭环断裂:学生完成作业→教师批改→学生收到反馈的周期通常超过24小时,难以形成“学习-反馈-修正”的即时闭环。

现有AI教育应用的局限性

近年来,AI教育工具(如Knewton、Coursera的自适应学习系统)试图解决上述问题,但仍存在明显短板:

技术类型典型应用优势局限性
规则引擎智能题库(如作业帮)响应快、成本低依赖人工预设规则,无法处理复杂场景
传统机器学习学习行为分析平台可量化学习模式泛化能力弱,难以解释“为什么推荐此内容”
基础LLM应用作文批改、问答机器人自然语言交互友好被动响应,缺乏主动规划与长期记忆

核心瓶颈:现有系统本质是“工具”而非“代理”——它们只能执行预设任务(如批改作文、回答问题),无法像人类教师一样:

  1. 主动分析学生的知识漏洞(如“学生三角函数错误率高,可能是因为勾股定理基础不牢”);
  2. 动态调整教学策略(如“学生对视频讲解不感兴趣,切换为互动游戏模式”);
  3. 长期跟踪学习效果(如“三个月前学生的错题,现在是否已掌握”)。

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+
LangChainAgentic AI开发框架(规划/记忆/工具)0.1.0+
LLM模型核心推理引擎GPT-4(推荐)或Llama 3 70B
Chroma向量数据库(存储长期记忆)0.4.15+
FastAPIWeb框架(部署代理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 定义教育代理的核心能力与目标

首先明确代理的角色定位和核心功能,这将指导后续的提示设计和模块开发。

核心能力清单
  1. 水平评估:通过简短测验判断学生对目标知识点的掌握程度(0-100分);
  2. 路径规划:根据评估结果和学习目标,生成日/周学习计划;
  3. 知识点讲解:用通俗语言解释概念,适配学生认知水平;
  4. 互动练习:生成针对性练习题,提供即时反馈;
  5. 长期跟踪:记录学习历史,定期复习薄弱点。
目标定义(系统提示初稿)

创建 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的 ToolToolkit 抽象工具,用 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"学习会话启动失败:{
### 使用 BouncyCastle 实现 SM2 加解公钥私钥导出 #### 安装依赖库 为了使用 BouncyCastle 库,在项目中引入相应的 Maven 或 Gradle 依赖: 对于 Maven 用户,可以在 `pom.xml` 文件中加入如下配置: ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.70</version> </dependency> ``` 对于 Gradle 用户,则应在 `build.gradle` 中添加: ```gradle implementation 'org.bouncycastle:bcpkix-jdk15on:1.70' ``` #### 钥对生成与导出 下面展示如何利用 BouncyCastle 创建一对新的 SM2 公钥/私钥,并将其序列化为 PKCS#8 和 X.509 编码格式。 ```java import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.crypto.ec.CustomNamedCurves; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.openssl.PEMWriter; import java.io.StringWriter; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; public class Sm2KeyGen { static { Security.addProvider(new BouncyCastleProvider()); } public static void main(String[] args) throws Exception { // 获取椭圆曲线参数 (SM2 默认采用标准中的 sm2p256v1 曲线) final X9ECParameters ecParams = CustomNamedCurves.getByName("sm2p256v1"); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", "BC"); keyGen.initialize(ecParams, new SecureRandom()); KeyPair pair = keyGen.generateKeyPair(); PrivateKey privateKey = pair.getPrivate(); PublicKey publicKey = pair.getPublic(); StringWriter swPriv = new StringWriter(); try (PEMWriter pwPriv = new PEMWriter(swPriv)) { pwPriv.writeObject(privateKey); } System.out.println("Private Key:\n" + swPriv.toString()); StringWriter swPub = new StringWriter(); try (PEMWriter pwPub = new PEMWriter(swPub)) { pwPub.writeObject(publicKey); } System.out.println("Public Key:\n" + swPub.toString()); } } ``` 这段程序首先初始化了一个安全随机数发生器来确保生成的钥具有足够的熵值[^1]。接着通过指定椭圆曲线名称获取到了适用于 SM2 的具体参数集。最后借助于 BouncyCastle 提供的帮助类完成了钥对象到字符串形式的转换过程[^2]。 #### 数据加密与解操作 接下来介绍怎样运用上述产生的钥完成基本的数据加解流程。这里选用的是 ECIES(Elliptic Curve Integrated Encryption Scheme),它是一种基于椭圆曲线上离散对数难题构建的安全协议框架之一。 ```java import org.bouncycastle.jce.ECNamedCurveTable; import org.bouncycastle.jce.spec.ECPublicKeySpec; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.util.encoders.Hex; import javax.crypto.Cipher; import java.security.*; import java.security.spec.*; public class Sm2EncryptDecrypt { private static final String ALGORITHM_NAME = "SM2"; public static byte[] encrypt(byte[] plainTextBytes, PublicKey pubKey) throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM_NAME, "BC"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); return cipher.doFinal(plainTextBytes); } public static byte[] decrypt(byte[] encryptedData, PrivateKey privKey) throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM_NAME, "BC"); cipher.init(Cipher.DECRYPT_MODE, privKey); return cipher.doFinal(encryptedData); } public static void main(String[] args) throws Exception { // 假设已经获得了有效的公钥私钥实例... PublicKey pubKey = ... ; PrivateKey privKey = ... ; String message = "Hello World!"; byte[] originalMessage = message.getBytes(); byte[] ciphertext = encrypt(originalMessage, pubKey); System.out.printf("Encrypted Text(hex): %s%n", Hex.toHexString(ciphertext)); byte[] decryptedText = decrypt(ciphertext, privKey); System.out.printf("Decrypted Text: %s%n", new String(decryptedText)); } } ``` 此部分代码实现了两个核心方法——`encrypt()` 和 `decrypt()`.前者接收待处理的信息字节数组和平面文本对应的公钥;后者则接受经过加密后的数据流连同匹配的私钥一起传入以恢复原始消息内容[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值