ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从Chatbot到Tutor:DeepTutor教学智能体核心设计与实现

从Chatbot到Tutor:DeepTutor教学智能体核心设计与实现 很多团队做大模型应用第一步都会从“聊天机器人”开始。等接入模型、调好 Prompt、跑通对话之后却发现一个尴尬的问题用户问什么都能答但用户什么都没学会。尤其是教育、培训、企业知识问答这类场景。模型能给答案却不能判断学习者是真的理解了还是只是复制粘贴模型能生成一大段解释却不知道学习者卡在哪个概念上模型能保持礼貌却不会像老师一样追问、引导、纠正。这也是为什么“AI Tutor”这类项目会越来越多。它们的核心不是“更聪明的对话”而是“把教学过程变成可设计、可追踪、可评估的工程系统”。HKUDS 这个开源方向下的 DeepTutor就是沿着这个思路出现的。从项目名称看“Deep”对应深度学习与深度理解“Tutor”对应教学与辅导它的核心定位很清晰用大语言模型构建一个真正意义上的智能教学 Agent而不是一个只会回答问题的聊天框。这篇文章我会从真实痛点切入讲清楚 DeepTutor 这类教学智能体的核心概念、设计思路、落地实现和常见坑点并给出一套最小可运行的 Agent 骨架代码。无论你是在做教育产品、企业培训系统还是想把 LLM 接入到带“教学过程”的业务场景这篇文章都值得收藏。1. 这篇文章真正要解决的问题先说结论DeepTutor 这类项目真正要解决的不是“模型会不会答”而是“模型会不会教”。这两个问题差别非常大。“会答”只要做好一件事把用户的问题映射到正确答案上。RAG 检索、Prompt 优化、模型微调都是为了提升这个映射的准确率。“会教”则要复杂得多。一个合格的教学流程至少要包括诊断判断学习者当前的知识水平找到卡点在哪里。引导不直接给答案而是通过提问让学习者自己推出结论。反馈针对错误给出具体、可操作的改进建议而不是一句“回答错误”。评估判断学习者是否真的掌握了知识点而不是背下了答案。记忆在后续对话中记住这个学习者容易错什么、擅长什么。也就是说课堂教学本身是一条完整的工作流而大多数 LLM 应用接入方式只是这条工作流里的“检索生成”一环。DeepTutor 的价值就是试图把教学过程完整地搬到 LLM Agent 里。它不是单个 Prompt 能替代的需要状态管理、知识检索、教学策略决策、反馈生成等多个模块协同工作。什么样的读者最需要读这篇文章正在做在线教育、企业培训、面试辅导、编程教学类产品的开发者。已经接入了 LLM发现“能答但不会教”问题的技术负责人。想了解 RAG、Agent、教学评估如何落到真实业务场景的算法工程师。对 HKUDS 开源项目感兴趣想找一个教育方向项目作为学习范式的同学。读完之后你会理解教学 Agent 和普通 Chatbot 在架构上的本质差异同时拿到一个最小可运行的实现骨架知道从哪里开始动手。2. DeepTutor 是什么从 Chatbot 到 Tutor 的本质差异DeepTutor 是 HKUDS香港大学数据科学实验室相关开源生态中面向智能教学方向的项目。由于项目仍然在快速迭代中本文以解释其核心设计思想和通用实现路径为主你可以把它理解为“教学场景下的大模型 Agent 框架”。要理解 DeepTutor首先要理解为什么普通的 Chatbot 不适合直接当老师。2.1 Chatbot 和 Tutor 的区别维度普通 ChatbotTutor目标高效回答问题让学习者掌握知识回答方式直接给出答案引导、提问、留白用户状态每个对话独立持续跟踪学习进度错误处理告知“不对”分析错误原因并给出练习评估机制无形成性评估 总结性评估教学策略无根据难度和学情动态调整用一句话概括Chatbot 的优化目标是“答对”Tutor 的优化目标是“教会”。这个差异决定了系统设计完全不同。Chatbot 只需要一个 QA 链路Tutor 需要一条教学链路。2.2 教学链路的核心环节一个完整的 AI Tutor 系统至少需要以下模块学情诊断模块负责判断学习者当前水平。实现方式可以很简单会话开始时收集用户背景也可以很复杂通过前置测试题动态评估。知识检索模块对应 RAG。教学场景下检索的目标是“找到适合当前学习者理解水平的知识片段”而不是“找到最相关的文本”。同样一个知识点对初学者和进阶者应该检索不同深度的材料。教学策略模块这是 Tutor 和 Chatbot 最核心的差异。它根据学情、知识点难度、对话历史决定当前采用什么教学动作直接讲解当学习者完全没概念时。苏格拉底式追问当学习者在关键点卡住时。举例子类比当学习者的错误属于概念混淆时。出练习题当需要巩固时。反馈生成模块负责对学习者的回答进行评价。优秀的教学反馈不是“对/错”而是指出对在哪里、错在哪里、下一步怎么改、是否需要回顾某个前置知识点。学习状态存储记录学习者的知识掌握度、错误类型、学习偏好。这一步往往被忽视但它决定了一个 Tutor 是“有记忆的老师”还是“每次都重新认识的陌生人”。DeepTutor 这类项目的核心贡献就是把这五个模块在工程上集成起来让开发者不必从零搭建。2.3 一个关键判断从目前 HKUDS 开源生态的方向看这类项目的判断是大模型教育应用的下半场拼的不是模型推理能力而是教学工程能力。也就是说哪怕你用的是同一个基座模型只要你的教学链路设计得更合理学习效果就可以明显更好。这给了中小团队一个机会——不需要从头训练教育大模型而是用工程化手段把已有模型的教学能力发挥出来。3. DeepTutor 的核心设计思路与适用场景3.1 核心设计思路从公开信息和同类项目的通用架构来看DeepTutor 的设计思路可以概括为“一个记忆、两条链路、三类接口”。一个记忆学习状态记忆系统保存每个学习者的知识图谱状态。哪些知识点已掌握、哪些概念容易混淆、哪些错误反复出现。这个记忆是教学个性化最底层的支撑。两条链路教学链路 评估链路教学链路负责“教”评估链路负责“验”。教学链路根据学情选择讲解、提问或举例评估链路通过练习和追问判断是否进入下一个知识点。两条链路互相交替形成完整的学习闭环。三类接口交互接口、知识接入接口、评估输出接口交互接口负责多轮对话管理支持打断、追问、换话题。知识接入接口负责接入课程资料、教材、题库、代码仓库。评估输出接口负责把学习报告、错题分析、掌握度数据输出给上层业务系统。这个设计的好处是教学策略和具体模型解耦。哪怕以后换一个更强大的基座模型教学流程、记忆结构、评估维度都不需要重写。3.2 适用场景从教学 Agent 的通用能力出发DeepTutor 这类项目适合以下场景编程教学这是最典型的 AI Tutor 场景。学习者写代码、系统检查、给出提示、要求修改、再次检查。整个过程和教师逐行 review 代码非常相似。学科辅导数学、物理等理科辅导。系统需要识别学习者的推导过程哪里出错并针对性地给出前置知识点回顾。企业培训与新员工 onboarding新员工提问、系统回答、然后追问确认理解、最后生成培训报告。这比单纯的企业知识库问答要深入得多。面试模拟与口语练习系统扮演面试官或对话伙伴根据用户的回答动态调整追问难度并在结束后给出结构化反馈。需要提醒的是DeepTutor 这类 Agent 并不适合所有问答类场景。如果你只是需要一个“能查到答案的文档助手”那普通 RAG 就足够引入完整教学链路反而会增加复杂度和响应延迟。4. 环境准备与基础配置下面开始落地。由于 DeepTutor 项目仍在快速迭代本文不把配置细节写死而是给出一个通用的教学 Agent 实现路径。核心思路是可以复用的你拿到任何教学 Agent 项目里都能对应上。4.1 环境要求建议环境如下具体版本请以实际项目为准Python 3.10 及以上。一个可调用的 LLM API 或本地推理服务OpenAI 兼容接口即可。向量数据库如 Chroma 或 Milvus用于知识检索。基础依赖openai、langchain可选、pydantic、fastapi。这里有一个原则不要把代码强绑定在某一家模型提供方上。用 OpenAI 兼容接口封装一层后面换模型只需要改 base_url 和 api_key。4.2 安装依赖python -m venv venv source venv/bin/activate pip install openai pydantic fastapi uvicorn chromadb如果是本地开发建议把模型服务地址配置到环境变量里export LLM_API_KEYyour-api-key export LLM_BASE_URLhttps://api.openai.com/v1 export LLM_MODELgpt-4o-mini4.3 项目目录结构一个清晰的教学 Agent 项目建议按模块拆分tutor-agent/ ├── main.py # FastAPI 入口 ├── config.py # 配置管理 ├── memory/ │ ├── student_state.py # 学习状态 │ └── knowledge_tracker.py # 知识掌握度追踪 ├── strategy/ │ ├── tutor_agent.py # 核心 Agent │ └── teaching_actions.py # 教学动作枚举 ├── retrieval/ │ └── knowledge_base.py # RAG 检索 └── evaluation/ └── feedback.py # 反馈生成与评估后面我会用这个结构写一个最小实现。5. 核心流程拆解一个教学回合是怎么完成的在写代码之前先理解核心流程。一个教学回合不是“用户提问 → 模型回答”这样一步完成而是分为七个阶段。5.1 输入解析显式意图 vs 隐式意图用户发来“什么是动态规划”这是显式提问。但用户发来“我这里报错了帮我看看”这是隐式意图系统需要判断这是想要我直接改代码还是希望我解释为什么错这一阶段系统要做的是识别用户输入类型提问、答题、求助、闲聊。抽取关键实体知识点名称、代码文件、错误信息。判断学习者情绪和认知状态是困惑、自信还是不耐烦。5.2 学情检索这个学生现在什么水平从学习状态存储中读取该学生的历史掌握知识点。最近连续出错的题型。当前学习进度。比如一个刚学完变量类型的用户突然问“装饰器是什么”那系统应该判断知识跳跃过大需要先检查前置基础。5.3 知识检索找到教学内容从知识库中检索相关知识片段。教学场景的检索和普通 RAG 有一个区别检索结果需要按认知难度排序而不是按相关度排序。如果学习者是初学者优先检索“入门解释”“类比示例”。如果学习者是进阶者优先检索“原理推导”“工程实践”。5.4 策略决策选择教学动作这是 Teacher Agent 特有的模块。它根据前几步的结果选择当前教学动作EXPLAIN直接讲解。PROBE反问引导。EXAMPLE举例说明。EXERCISE出题练习。REVIEW回顾前置知识。PRAISE确认和鼓励。这里有一个关键原则不要总是在 EXPLAIN 上。如果学习者连续三次做题错误应该转向 REVIEW 而不是继续讲解新内容。5.5 生成回答结构化的教学输出生成回答时系统会按教学模板组织输出如果采用 PROBE 策略回答就是一个引导性问题不给答案。如果采用 EXPLAIN 策略回答应该包含直觉解释、技术定义、示例、常见误区。5.6 学习状态更新记住这个回合根据学习者的回答判断掌握度更新知识图谱。这一步被很多初版实现忽略但它是长期教学效果的胜负手。没有状态更新的系统下次对话还会犯同样的错误。5.7 评估与结束是否需要切换知识主题判断当前知识点是否达到“掌握”阈值。达到则建议进入下一主题未达到则继续在当前主题内循环。整个流程可以用一句话概括输入诊断 → 检索匹配 → 策略决策 → 教学输出 → 状态回写。6. 完整示例一个最小可运行的教学 Agent 骨架下面代码不是 DeepTutor 的官方源码而是按照上述设计思路实现的最小骨架。你可以把它作为理解教学 Agent 的起点也可以在此基础上扩展成你自己的 Tutor 服务。6.1 配置模块# 文件路径config.py import os class Config: 全局配置所有配置项均可通过环境变量覆盖。 LLM_API_KEY os.getenv(LLM_API_KEY, your-api-key) LLM_BASE_URL os.getenv(LLM_BASE_URL, https://api.openai.com/v1) LLM_MODEL os.getenv(LLM_MODEL, gpt-4o-mini) ENABLE_RAG os.getenv(ENABLE_RAG, true).lower() true VECTOR_DB_PATH os.getenv(VECTOR_DB_PATH, ./data/vector_db) config Config()6.2 教学动作枚举# 文件路径strategy/teaching_actions.py from enum import Enum class TeachingAction(str, Enum): 教学动作类型。每个动作决定了 Agent 当前回合的互动方式。 EXPLAIN explain # 直接讲解 PROBE probe # 苏格拉底式提问 EXAMPLE example # 举例类比 EXERCISE exercise # 出题练习 REVIEW review # 回顾前置知识 PRAISE praise # 正向确认6.3 学习状态追踪# 文件路径memory/student_state.py from dataclasses import dataclass, field dataclass class StudentState: 学生学习状态。保存知识点掌握度、连续错误次数和对话历史。 student_id: str mastery: dict field(default_factorydict) # 知识点 - 掌握度 0-1 consecutive_errors: dict field(default_factorydict) # 知识点 - 连续错误次数 last_topic: str def record_answer(self, topic: str, correct: bool) - None: if correct: self.mastery[topic] min(1.0, self.mastery.get(topic, 0) 0.2) self.consecutive_errors[topic] 0 else: self.mastery[topic] max(0.0, self.mastery.get(topic, 0) - 0.1) self.consecutive_errors[topic] self.consecutive_errors.get(topic, 0) 1 def should_review(self, topic: str, threshold: int 2) - bool: 连续错误超过阈值时建议回顾前置知识。 return self.consecutive_errors.get(topic, 0) threshold def mastery_level(self, topic: str) - float: return self.mastery.get(topic, 0.0)6.4 知识检索模块# 文件路径retrieval/knowledge_base.py class SimpleKnowledgeBase: 简化的知识库检索模块。 生产环境中可以替换为向量数据库这里先用关键词匹配演示流程。 def __init__(self): self.docs { dynamic_programming: { beginner: 动态规划就像填表格。你把一个大问题拆成很多小问题 先解决最小的那个然后一步一步往上填最后得到大问题的答案。, advanced: 动态规划的核心是状态定义、状态转移方程和边界条件。 重叠子问题和最优子结构是使用动态规划的两个必要条件。, }, recursion: { beginner: 递归就是一个函数调用自己但每次调用的问题规模都会变小 直到某个最简情况直接返回。, advanced: 递归的实现依赖系统调用栈。需要注意递归深度限制 并考虑是否可以用尾递归或迭代改写。, }, } def retrieve(self, topic: str, level: str beginner) - str: 按主题和难度检索教学片段。 if topic not in self.docs: return 知识库中暂时没有这个主题的资料。 level_key level if level in self.docs[topic] else beginner return self.docs[topic][level_key]6.5 教学 Agent 核心# 文件路径strategy/tutor_agent.py from openai import OpenAI from config import config from memory.student_state import StudentState from retrieval.knowledge_base import SimpleKnowledgeBase from strategy.teaching_actions import TeachingAction class TutorAgent: 教学 Agent 核心。负责决策当前教学动作、调用 LLM 生成内容。 def __init__(self): self.client OpenAI(api_keyconfig.LLM_API_KEY, base_urlconfig.LLM_BASE_URL) self.kb SimpleKnowledgeBase() self.students: dict[str, StudentState] {} def _get_student(self, student_id: str) - StudentState: if student_id not in self.students: self.students[student_id] StudentState(student_idstudent_id) return self.students[student_id] def _decide_action(self, student: StudentState, topic: str, user_input: str) - TeachingAction: 教学策略决策。这是 Tutor 和 Chatbot 的核心区别。 - 连续错误超过阈值回顾前置知识。 - 知识点掌握度不足优先讲解或举例。 - 掌握度较高尝试出题验证。 if student.should_review(topic): return TeachingAction.REVIEW mastery student.mastery_level(topic) if mastery 0.0: return TeachingAction.EXPLAIN elif mastery 0.5: return TeachingAction.EXAMPLE elif mastery 0.8: return TeachingAction.PROBE else: return TeachingAction.EXERCISE def _build_prompt(self, action: TeachingAction, topic: str, knowledge: str, user_input: str) - str: 根据教学动作构建不同结构的 Prompt。 if action TeachingAction.EXPLAIN: return ( f你是耐心的编程导师。请用通俗语言讲解「{topic}」。\n f参考知识片段{knowledge}\n f要求先给直觉解释再给技术定义最后给一个简短示例。\n f学生刚才说{user_input} ) elif action TeachingAction.PROBE: return ( f你是苏格拉底式导师。不要直接告诉学生答案。\n f针对「{topic}」提出一个引导性问题 f让学生自己发现问题所在。\n学生刚说{user_input} ) elif action TeachingAction.EXAMPLE: return ( f你是擅长用类比讲解的导师。关于「{topic}」 f请给出一个生活化类比再对应到技术概念。 f参考知识片段{knowledge} ) elif action TeachingAction.REVIEW: return ( f学生反复在「{topic}」上出错请判断其可能缺失的前置知识 f并先用一个简单问题帮其巩固基础。不要引入新概念。 ) elif action TeachingAction.EXERCISE: return ( f请出一道关于「{topic}」的难度适中的练习题 f不要先给答案让学生尝试作答。 ) return ( f请对学生在「{topic}」上的回答给予具体反馈 先肯定正确部分再指出错误原因最后给出下一步建议。\n学生回答 user_input ) def chat(self, student_id: str, topic: str, user_input: str) - str: 一个完整的教学回合。 student self._get_student(student_id) student.last_topic topic # 1. 检索知识 knowledge self.kb.retrieve(topic) # 2. 策略决策 action self._decide_action(student, topic, user_input) # 3. 构建 Prompt 并调用 LLM prompt self._build_prompt(action, topic, knowledge, user_input) response self.client.chat.completions.create( modelconfig.LLM_MODEL, messages[{role: user, content: prompt}], temperature0.7, ) return response.choices[0].message.content def submit_answer(self, student_id: str, topic: str, user_answer: str, is_correct: bool) - str: 学习者提交练习答案后调用。 这一步会更新学习状态决定下一回合的教学动作。 student self._get_student(student_id) student.record_answer(topic, is_correct) if is_correct: return self.chat(student_id, topic, 我已经答对了) return self.chat(student_id, topic, user_answer)6.6 FastAPI 入口# 文件路径main.py from fastapi import FastAPI from pydantic import BaseModel from strategy.tutor_agent import TutorAgent app FastAPI(titleTutor Agent API) agent TutorAgent() class ChatRequest(BaseModel): student_id: str topic: str message: str class AnswerRequest(BaseModel): student_id: str topic: str answer: str is_correct: bool app.post(/chat) def chat(req: ChatRequest): 普通教学对话。 return {reply: agent.chat(req.student_id, req.topic, req.message)} app.post(/submit_answer) def submit_answer(req: AnswerRequest): 学习者提交练习答案系统记录学习状态。 return {reply: agent.submit_answer(req.student_id, req.topic, req.answer, req.is_correct)} app.get(/student/{student_id}/state) def get_student_state(student_id: str): 查看学习状态方便调试。 student agent._get_student(student_id) return { student_id: student.student_id, mastery: student.mastery, consecutive_errors: student.consecutive_errors, last_topic: student.last_topic, }7. 运行结果与效果验证7.1 启动服务uvicorn main:app --reload --port 80007.2 测试教学对话curl -X POST http://localhost:8000/chat \ -H Content-Type: application/json \ -d { student_id: stu_001, topic: dynamic_programming, message: 动态规划是什么完全不懂 }对完全不懂的学生策略决策会进入EXPLAIN返回直接讲解内容。再次对话当学生掌握度提升后直接提问curl -X POST http://localhost:8000/chat \ -H Content-Type: application/json \ -d { student_id: stu_001, topic: dynamic_programming, message: 我理解了一些这个状态转移方程怎么写 }此时掌握度应该在 0.2 到 0.4 之间策略会进入EXAMPLE或PROBE返回内容会从“直接讲解”变为“引导性提问”或“类比举例”。7.3 提交练习答案curl -X POST http://localhost:8000/submit_answer \ -H Content-Type: application/json \ -d { student_id: stu_001, topic: dynamic_programming, answer: int dp[n1]; dp[0]0; dp[1]1;, is_correct: true }7.4 如何判断教学 Agent 真的在工作运行成功不等于教学成功。以下四个维度可以用来验证效果策略是否发生变化连续提交正确答案后Agent 是否从“讲解”切换到“出题”curl http://localhost:8000/student/stu_001/state观察mastery和consecutive_errors字段变化。如果提交多次错误答案后返回内容仍然是“继续讲解新知识”说明策略决策逻辑有问题。提问质量是否高于直接回答把 Agent 的回复放到实际学习场景里判断如果它只是把搜索结果换个说法复述一遍说明教学策略基本没生效。真正有效的 Tutor 回复应该有引导性甚至会让学习者停下来思考。是否记住了历史状态两次对话之间Agent 是否知道学生上次错在哪里。如果换一个学生 ID状态应该是独立的如果同一个学生 ID 的连续错误次数在增长但教学动作不变说明状态没有驱动决策。是否发生了错误累积如果学习者连续三次答错Agent 应该降低难度或切换策略而不是在同一个难度上反复输出。如果服务启动失败优先检查# 查看依赖是否正确 pip list | grep -E openai|fastapi|uvicorn # 查看模型接口是否可连通 curl $LLM_BASE_URL/models -H Authorization: Bearer $LLM_API_KEY8. 常见问题与排查思路问题现象可能原因排查方式解决方案API 调用返回 401API Key 未设置或已失效检查环境变量LLM_API_KEY重新设置环境变量确认 key 有效返回内容与教学主题无关知识检索召回错误打印knowledge变量检查检索结果优化知识库文档分块和检索逻辑不管学生答对答错都返回同样风格策略决策没有生效在_decide_action中加入日志输出 action 值检查掌握度阈值逻辑确认状态更新在执行连续答错后仍然讲解新知识consecutive_errors没有累加查看/student/{id}/state接口输出确认record_answer被正确调用响应速度太慢模型调用时间过长或 RAG 检索太重分段计时统计模型调用耗时使用流式输出或对知识库做缓存本地模型返回格式不稳定模型指令遵循能力弱检查原始返回内容降低 prompting 复杂度或换更强模型多轮对话上下文丢失没有维护对话历史检查 messages 是否每次都从空开始在 StudentState 中加入对话历史字段生产环境并发高时状态错乱StudentState 存在内存中进程间不共享查看是否有多个 worker 进程将状态存储迁移到 Redis 或数据库这里要特别强调一个容易被忽视的问题当状态存储只存在于内存时一旦服务重启所有学习记录都会丢失。生产环境必须把 StudentState 持久化到 Redis 或关系型数据库同时做好用户维度的隔离。9. 最佳实践与工程建议9.1 教学策略不要写死在 Prompt 里初版实现最容易犯的错误是把“你是老师请先引导再讲解”全部塞进 Prompt。这种做法在单轮对话里看起来没问题但一旦需要根据学习状态动态调整策略Prompt 会变得不可维护。更稳妥的做法是把策略拆成代码逻辑先判断状态再选择教学动作最后才根据动作类型拼接 Prompt。这样每个动作的 Prompt 是独立的可以单独测试和优化。9.2 不要迷信“直接给答案”教学 Agent 和知识问答的一个核心区别是系统需要在“给答案”和“让学习者自己发现”之间做权衡。一个可参考的反馈原则是学生完全不知道直接讲解给直觉和例子。学生知道但说不清先引导再补充。学生做错了但思路接近先肯定思路再指出偏差。学生反复错不要继续讲新内容先回到前置知识。这个原则应该固化在代码逻辑里而不是靠模型每次临时判断。9.3 RAG 的教学化改造普通的 RAG 适合“找到最相关的内容”但教学场景需要“找到最适合当前学生水平的内容”。这意味着你的知识库文档需要维护“难度”维度或者按“入门 / 进阶 / 高级”分层。推荐做法是同一知识点准备多个难度版本的解释。检索阶段先根据学情确定难度再在对应难度层内做相似度检索。如果学生的连续错误率上升自动降低检索难度层级。9.4 评估机制必须从一开始就设计很多人把评估当成上线后的功能这是错误的。没有评估机制你无法回答两个根本问题学生的学习效果是否真的变好了当前的教学策略是否比上一个版本更好建议从第一天就记录三类数据过程数据每个回合的 action 类型、模型输出、学生反馈。掌握度数据每次record_answer前后的 mastery 变化。业务数据练习完成率、平均学习时长、重复提问次数。有了这些数据你才能持续迭代教学策略而不是凭感觉调 Prompt。9.5 安全边界教学场景涉及未成年人时需要特别注意内容安全。建议做到所有模型输出经过内容过滤后再返回给客户端。知识库内容经过人工审核不允许未经审核的资料进入检索链路。对模型返回的答案做“知识范围限制”避免模型在没有依据的情况下编造知识点。上传的学习者数据需要脱敏存储遵循最小必要原则。9.6 使用向量数据库时的注意事项如果数据量增大需要切换到真正的向量数据库。这时候建议文档切块长度控制在一个知识点的粒度不要切得太碎。同一个知识点保持多个难度版本并打上元数据标签。检索结果按“难度匹配度 相似度”两个维度排序。定期更新向量索引因为知识库内容会变。10. 总结与后续学习方向这篇文章的核心判断是大模型教育应用的关键壁垒不在模型本身而在教学工程能力。DeepTutor 所代表的这类 AI Tutor 项目本质上就是把“教学”从一种隐性的人类技能转变成一种可设计、可追踪、可评估的工程系统。你从这篇文章里应该带走三样东西第一理解 Tutor 和 Chatbot 的架构差异。Tutor 需要学情诊断、教学策略、状态记忆、评估反馈这不是一个 Prompt 能解决的。第二掌握教学 Agent 的最小实现路径。从代码层面看核心是策略决策模块和状态更新模块。前者决定“怎么教”后者决定“记住学生是谁”。第三知道从哪里开始优化一个教学系统。先记录过程数据再分析策略有效性然后优化知识检索难度匹配最后才轮到调 Prompt。如果你正在开发教育类产品下一步建议先跑通上面的最小骨架然后按下面的顺序逐步扩展把 StudentState 从内存迁移到 Redis支持真实用户持久化。接入真正的向量数据库替换关键词检索。为你的课程资料建立“难度分层”的知识索引。增加练习题的自动批改和错误类型分类。设计一套 AB 测试方案对比不同教学策略的学习效果。DeepTutor 项目和整个 HKUDS 开源生态值得持续关注。教育场景是大模型落地最复杂的领域之一因为它既要求模型的认知能力又要求系统的工程能力。谁能把这两者结合好谁就能真正做出“会教”的 AI。
返回列表