教学 Agent 设计:不是回答所有问题,而是引导学生思考

教学 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_factory=list) 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"{i+1}. {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 在非语言信号(犹豫、表情)观察上的能力为零,这是人机协作的关键分界线。