教学 Agent 设计:不是回答所有问题,而是引导学生思考 教学 Agent 设计不是回答所有问题而是引导学生思考一、个性化深度引言如果教学 Agent 只是一个更友好的搜索引擎学生问什么它就答什么那它的价值约等于一个免费的家教——帮你解答作业但不会提升你的能力。真正的教学 Agent 需要具备教的能力而不只是答的能力。教意味着知道在什么时候不给答案比给答案更好知道如何拆解一个复杂问题为可管理的子问题知道如何判断学生是懂了还是假装懂了知道何时重复、何时推进、何时切换策略见证奇迹的时刻不在于 Agent 给出的答案有多全面而在于它问回给学生的那个问题——那个问题让学生从等答案切换到想答案。二、个性化原理剖析教学 Agent 的架构需要三个核心模块三个核心模块1. 意图识别层区分学生的三类提问——求解类这道题怎么做、概念类什么是二次函数、探究类为什么二次函数的图像是抛物线。求解类问题需要拒绝直接给答案。概念类问题需要先评估理解程度再回答。探究类问题需要提供研究框架而非结论。2. 教学策略引擎四种核心策略类比法将新概念与学生已知概念关联。如果学生已经学过一次函数可以通过类比引入二次函数。拆解法将复杂问题分解为 3-5 个可以独立解决的子问题。反例法展示常见误解让学生在纠正错误中强化正确理解。脚手架法初期给出较多支持具体提示、分步引导随着学生掌握程度提升逐步撤出支持。3. 学生状态评估通过学生的回答质量、回答速度、是否主动追问等信号推断学生的知识掌握状态决定下一步教学策略。三、个性化代码实践教学 Agent 的核心编排逻辑from enum import Enum from typing import List, Dict, Optional from dataclasses import dataclass, field class QuestionType(Enum): SOLUTION_SEEKING 求解 # 这道题怎么做 CONCEPT_QUERY 概念 # 什么是... EXPLORATION 探究 # 为什么... class TeachingStrategy(Enum): ANALOGY 类比法 DECOMPOSITION 拆解法 COUNTEREXAMPLE 反例法 SCAFFOLDING 脚手架法 class MasteryState(Enum): MASTERED 已掌握 LEARNING 正在学 CONFUSED 困惑 dataclass class KnowledgeNode: 知识图谱节点 concept: str prerequisites: List[str] field(default_factorylist) mastery: MasteryState MasteryState.CONFUSED evidence_count: int 0 # 答题证据数 class TeachingAgent: 教学Agent编排器 设计原因将教学逻辑与LLM调用分离。 策略引擎决定怎么教LLM负责教什么内容。 两者解耦后可以独立优化。 def __init__(self, llm_client): self.llm llm_client self.knowledge_graph {} # 学生知识图谱 self.interaction_history [] self.scaffold_level 3 # 脚手架层级 1最大支持, 5独立 def handle_question(self, student_input: str, topic: str) - str: 处理学生的提问 # Step 1: 意图识别 qtype self._classify_question(student_input) # Step 2: 根据问题类型采取不同策略 if qtype QuestionType.SOLUTION_SEEKING: return self._handle_solution_seeking(student_input, topic) elif qtype QuestionType.CONCEPT_QUERY: return self._handle_concept_query(student_input, topic) else: return self._handle_exploration(student_input, topic) def _handle_solution_seeking(self, question: str, topic: str) - str: 处理求解类问题 设计原因求解类是最常见的提问类型 也是教学Agent需要最谨慎处理的一类。 原则 1. 先拆解问题让学生说出自己卡在哪一步 2. 根据学生反馈决定引导深度 3. 只在多次失败后才给出部分解答 # 拆解问题为步骤 steps self._decompose_problem(question) prompt f学生问了一道求解题但你不应该直接回答。 【题目】{question} 将这道题拆解为以下步骤 {self._format_steps(steps)} 请执行以下操作 1. 让学生说出目前卡在哪一步 2. 不要告诉学生完整答案 3. 如果学生说都卡住了或完全不会给他第一个步骤的提示 4. 记住使用脚手架法先大后小先方向后细节 return self.llm.generate(prompt) def _handle_concept_query(self, question: str, topic: str) - str: 处理概念类问题 设计原因不直接给定义而是先检测学生的已有理解。 如果学生已有正确但不完整的理解在此基础上补充。 如果理解有偏差先用反例纠正误解。 # 检查学生的知识图谱中是否有这个概念 existing_knowledge self._get_related_concepts(topic) prompt f学生问了一个概念问题。不要直接给出标准定义。 【问题】{question} 【学生已掌握的相关概念】{existing_knowledge} 请按以下步骤操作 1. 先让学生用自己的话描述他对这个概念的理解 2. 根据学生的描述针对性地补充或纠正 3. 用类比法连接已有知识和新概念 4. 用1-2个例子来巩固理解 return self.llm.generate(prompt) def _handle_exploration(self, question: str, topic: str) - str: 处理探究类问题 设计原因这类问题没有标准答案。 Agent的角色是提供思维框架而非结论。 prompt f学生提了一个探究性问题。这不是有标准答案的。 【问题】{question} 请 1. 认可学生提出这个问题的价值 2. 提供2-3个可能的思考方向 3. 不要给出任何结论性判断 4. 鼓励学生在这几个方向上自己探索 return self.llm.generate(prompt) def process_student_feedback(self, feedback: str) - Dict: 处理学生反馈并调整教学策略 设计原因学生的每轮反馈都是评估掌握状态的信号。 根据信号强度决定下一步 - 独立解决 → 提升脚手架层级减少帮助 - 在提示下解决 → 保持当前层级 - 多个提示后仍失败 → 降低脚手架层级增加帮助 # 评估掌握的信号 mastery_signals { strong: [我明白了, 原来如此, 这不就是], moderate: [哦, 嗯, 好像是], weak: [还是不懂, 不明白, 太难了, 不会], } signal_strength moderate for strength, keywords in mastery_signals.items(): for kw in keywords: if kw in feedback: signal_strength strength break # 调整脚手架层级 if signal_strength strong: self.scaffold_level min(5, self.scaffold_level 1) elif signal_strength weak: self.scaffold_level max(1, self.scaffold_level - 1) # 更新知识图谱 self._update_knowledge_graph(feedback) return { signal_strength: signal_strength, scaffold_level: self.scaffold_level, next_strategy: self._select_strategy(signal_strength) } def _classify_question(self, text: str) - QuestionType: 问题类型分类 # 简单规则分类 if any(kw in text for kw in [怎么做, 怎么解, 答案, 步骤]): return QuestionType.SOLUTION_SEEKING elif any(kw in text for kw in [什么是, 是什么, 定义]): return QuestionType.CONCEPT_QUERY else: return QuestionType.EXPLORATION def _decompose_problem(self, question: str) - List[str]: 使用LLM拆解问题步骤 prompt f将以下问题拆解为3-5个关键步骤不要给出解答只列步骤名\n{question} response self.llm.generate(prompt) return [s.strip() for s in response.split(\n) if s.strip()] def _get_related_concepts(self, topic: str) - List[str]: 获取学生已掌握的关联概念 related [] if topic in self.knowledge_graph: node self.knowledge_graph[topic] for prereq in node.prerequisites: if prereq in self.knowledge_graph and \ self.knowledge_graph[prereq].mastery MasteryState.MASTERED: related.append(prereq) return related def _select_strategy(self, signal_strength: str) - TeachingStrategy: 根据信号选择教学策略 if signal_strength weak: return TeachingStrategy.SCAFFOLDING elif signal_strength moderate: return TeachingStrategy.ANALOGY else: return TeachingStrategy.DECOMPOSITION def _update_knowledge_graph(self, feedback: str): 更新学生知识图谱 pass def _format_steps(self, steps: List[str]) - str: return \n.join([f{i1}. {s} for i, s in enumerate(steps)])关键设计教学逻辑与 LLM 分离策略引擎决定教学策略LLM 执行内容生成脚手架层级动态调整根据学生反馈实时升降类似自适应学习的难度调节三类提问的差异化处理求解型、概念型、探究型对应不同的教学策略知识图谱持续更新每次交互都更新学生的知识状态四、个性化边界权衡设计选择方案A方案B推荐策略问题拆解Agent 自动拆解让学生自己拆解先让学生尝试1次失败后自动拆解答案控制永远不给完整答案在确认学生理解后给3轮引导后仍未解出给出部分解答反向练习策略选择规则引擎LLM 决策规则做快速决策LLM 做复杂情境判断错误纠正立即指出错误等待学生自己发现小错误等学生发现关键概念错误立即纠正进度推进系统控制学生控制混合系统推荐节奏学生可手动调整见证奇迹的时刻在于发现好的教学 Agent 最难实现的功能不是回答准确而是适时闭嘴。当学生正处于深度思考中时Agent 的沉默比任何提示都更有价值。核心 Trade-off个性化和规模化。理想的教学是一对一每个学生的教学路径都是独特的。但 LLM 调用的成本和延迟限制了实时个性化。一个工程上的折中是预计算——将常见路径预先生成并缓存实时交互中只做快速检索和拼接。另一个关键边界教学 Agent 永远无法替代真实课堂中的眼神交流。AI 可以判断学生答错了但无法观察到学生在回答过程中的犹豫、迷茫或恍然大悟的微表情——这些信号对教学决策至关重要。五、总结教学 Agent 的核心使命是引导学生思考而非回答问题。三类提问求解型、概念型、探究型需要差异化的处理策略。脚手架法通过动态层级调整实现从帮助到放手的渐进过渡提升幅度取决于学生反馈信号。教学逻辑与 LLM 内容生成应当分离策略引擎决定教学策略LLM 只负责内容生成。个性化与规模化的张力可以通过预计算常见路径来缓解。教学 Agent 在非语言信号犹豫、表情观察上的能力为零这是人机协作的关键分界线。