LangGraph中的自适应教学代理:学习者状态监测、路径规划功能以及人工审核机制。
一种LangGraph辅导系统的设计,能够追踪学习者状态、在补习与进阶学习之间进行路径规划、利用RAG为答案提供依据,并将复杂问题转交人工审核员处理。
来源: From Chatbot to Learning System: A Scientific Blueprint for a LangGraph Adaptive Teaching Agent
语言模型几乎可以流畅地解释任何主题,但流畅度并不能衡量真正的学习效果。学生可能读过关于检索增强生成技术的详尽阐述,点头表示理解,却依然无法区分检索与微调的差异,也识别不出那些没有依据的引用。所欠缺的并非文本生成能力,而是教学控制能力——即收集能证明学生已理解内容的证据、选择合适的干预措施,并检查这些措施是否有效。
这是一份基于LangGraph构建的自适应教学智能体的设计草图,LangGraph是一个具备状态功能的系统,能够追踪学习目标、学习者的反应、错误概念、评估依据以及后续行动。它将当前的智能体开发技术与传统的教育理念相结合,即形成性评估与掌握学习法。其目的并非取代教育者,而是让诊断、讲解、练习、评估、调整和进阶这一形成性循环变得更加清晰、可观察且可验证。需要注意的是:这仅是一项技术设计,并不能证明某种特定的智能体就能提升学习效果。实际应用还需要合理的实验设计、无障碍性评估、隐私保护措施以及教师管理机制。
生成答案与适应学习者
以回复为主的聊天机器人接收提示后直接给出答案。这固然方便,但却无法可靠地判断学习者是否理解了内容、错误是否依然存在,或是下一步该做什么。它看似具有教学功能,实际上不过是高级的自动补全工具而已。
自适应辅导系统则基于不同的单元——学习环节来运作。每个学习环节都始于一个可衡量的目标,通过收集学习者的回答作为证据,依据评估标准对其进行解读,进而选择相应的教学措施,并记录整个过程,这意味着状态必须在所有这些步骤中保持一致。
这种设计体现了形成性评估中的一个基本理念,即教学与评估相互关联,对学习者理解程度的了解将决定下一步的教学安排。它也与掌握学习理念相呼应,后者会在学习者进入依赖先前知识的主题之前提供纠错练习和额外时间。这些理念的出现时间比生成式AI早数十年。新的之处在于,现在可以将这些反馈机制体现在可见的软件中,而无需将其隐藏在冗长的提示语中。
为何图表优于提示语链
其核心是一个有向图G = (V, E)。节点代表有限的教学行为,边表示节点之间的转换关系,而条件边则承载着教育决策:在充分证明掌握程度后继续前进,针对明确的误解进行纠错,或在情况不确定或风险较高时采取其他措施。
LangGraph 能够发挥作用,是因为它将应用程序构建在共享状态、读取和更新该状态的节点以及明确的转换关系之上。这种方式比单纯依靠一条模糊的指令来充当指导老师更适用于学习工作流,同时还能让你向系统提出具体问题。是哪些证据触发了补救措施?应用了哪个评分标准版本?有风险的任务是否被提交给了人工审核员?智能体是否陷入了无限循环?学习者状态处于核心位置,节点应当有意识地更新这一状态,而非将之前的对话视为无结构的记忆堆砌。
最简化的学习者状态
仅保留当前目标及其管理要求所需的信息。状态不应发展成一份含糊不清的个人数据档案。以下六个字段即可涵盖基本内容:
learning_goal,即该学习环节的可观察目标,例如区分 RAG 和微调技术。learner_answer,即学习者提交的答案,例如书面解释或代码评析。misconceptions,指具体诊断出的错误,比如误以为引用内容会自动被验证。rubric_score,为透明的评估指标,例如基于标准评分表的0.65分。attempts,用于防止无止境的重复尝试,比如针对同一目标进行两次尝试。next_action用于明确后续处理方式(补救或继续),而needs_human_review则是安全与不确定性标志,用于标识模糊或敏感的情况。
下面的示例使用了确定性路由方式,以便让教学思路更清晰易懂。在实际应用中,模型或许可以协助生成反馈或指出可能的误解,但路由转换的标准仍需能够独立核查。
from typing import Literal
from typing_extensions import TypedDict
class TutorState(TypedDict):
learning_goal: str
learner_answer: str
misconceptions: list[str]
rubric_score: float
attempts: int
needs_human_review: bool
next_action: str
def choose_next_action(state: TutorState) -> Literal[
"advance", "remediate", "human_review"
]:
"""Route using visible, reviewable instructional policy."""
if state["needs_human_review"]:
return "human_review"
if state["rubric_score"] >= 0.80 and not state["misconceptions"]:
return "advance"
return "remediate"
该阈值并非通用标准,需根据具体目标进行选定与验证。重要的是规则必须被明确界定、设有版本控制且可被测试。系统不会将学习者视为能力薄弱,只会指出其表现尚未达到既定标准。
教学图谱
这是一个简化的LangGraph框架,其中诊断、解释、练习、评估、补救、进阶以及人工审核均作为独立节点存在。在实际系统中,每个节点都会依赖经过审核的内容、评分标准以及从外部传入的模型或检索服务,而非硬编码的回复。
from langgraph.graph import END, START, StateGraph
def diagnose(state: TutorState) -> dict:
# Replace with a rubric-guided classifier or instructor-approved LLM call.
answer = state["learner_answer"].lower()
misconception = "citations are automatically verified" in answer
return {
"misconceptions": (
["Confuses generated citations with source verification"]
if misconception else []
)
}
def explain(state: TutorState) -> dict:
# In production: retrieve approved sources, then generate grounded feedback.
return {"next_action": "practice"}
def practice(state: TutorState) -> dict:
# In production: generate a new, equivalent item—not the same question again.
return {"attempts": state["attempts"] + 1}
def evaluate(state: TutorState) -> dict:
# Placeholder for a criterion-referenced evaluator with stored evidence.
return {"next_action": choose_next_action(state)}
def route_after_evaluation(state: TutorState) -> str:
return choose_next_action(state)
builder = StateGraph(TutorState)
builder.add_node("diagnose", diagnose)
builder.add_node("explain", explain)
builder.add_node("practice", practice)
builder.add_node("evaluate", evaluate)
builder.add_node("remediate", explain)
builder.add_node("advance", lambda state: {"next_action": "complete"})
builder.add_node("human_review", lambda state: {"next_action": "review"})builder.add_edge(START, "diagnose")
builder.add_edge("diagnose", "explain")
builder.add_edge("explain", "practice")
builder.add_edge("practice", "evaluate")
builder.add_conditional_edges(
"evaluate",
route_after_evaluation,
{
"advance": "advance",
"remediate": "remediate",
"human_review": "human_review",
},
)
builder.add_edge("remediate", "practice")
builder.add_edge("advance", END)
builder.add_edge("human_review", END)tutor_graph = builder.compile()
有两个设计是经过刻意考虑的。该循环会将修正建议反馈到新的练习机会中,而不仅仅是更长的解释文字。当出现超出规则范围的情况时,停止条件会终止自动处理流程,并将案例转交给教师或其他授权审核人员。
RAG的适用场景
对于内容繁重的学科,解释环节不应仅依赖模型内部的知识。它应当从经过审核、有版本控制的教材中提取相关内容,将其传递给模型,并要求模型提供学习者可以核实的引用信息。这正是RAG在此处的正确作用:将解释内容建立在精心整理的知识库之上。
这并不会让智能体默认就变得正确。仍然需要来源选择规则、引用验证、防止提示注入的措施,以及针对无法证实的主张的检测。一个实用的安全规则是,当检索质量较差时,让智能体说明证据不足,而非用一个看似可靠的叙述来填补空白。
评估优先
仅有图表并不能让自适应智能体具备可信度,可量化的教学行为与安全表现才能。需从四个层面进行评估:学习层面(通过前后概念检测或迁移任务来判断理解是否有所提升);教学方法层面(通过专家对反馈和路径选择的审查来判断干预措施是否恰当);系统层面(通过路径准确性、循环率和延迟时间来判断图表是否遵循规则);以及安全层面(通过升级召回测试以及隐私和注入测试来判断其是否能在出错时安全应对)。
在优化界面之前,先准备一套包含正确解释、常见误解、模棱两可的答案、具有对抗性的指令以及需要人工审核的案例的小型案例集。下面的测试无法判定教育效果,但能够发现基本故障,即与既定策略相悖的路由处理方式。
import pytest
@pytest.mark.parametrize(
"state, expected",
[
({
"learning_goal": "Differentiate RAG and fine-tuning",
"learner_answer": "A correct distinction",
"misconceptions": [],
"rubric_score": 0.92,
"attempts": 1,
"needs_human_review": False,
"next_action": "",
}, "advance"),
({
"learning_goal": "Differentiate RAG and fine-tuning",
"learner_answer": "Citations are automatically verified",
"misconceptions": ["Citation-verification error"],
"rubric_score": 0.45,
"attempts": 1,
"needs_human_review": False,
"next_action": "",
}, "remediate"),
],
)
def test_routing_policy(state, expected):
assert choose_next_action(state) == expected
在此,智能代理开始呈现出类似规范化的软件工程特征。断言、测试用例、代码版本、追踪日志以及决策记录并非多余的官僚流程,它们将令人印象深刻的演示转化为一个可问责的系统。
监督作为一项功能
教育并非单纯的技术优化问题。系统不应自行给出具有重大影响的评分,推断学习者的敏感特征,或就学习进展提出决定性建议。它应当将形成性反馈与正式评估区分开来,并公开展示自身的不确定性。
可将人工监督作为交接条件纳入图表中:评估者不确定、多次尝试仍失败、学术诚信可能存疑、可访问性存在障碍、提示内容涉及安全问题,或者学习者显然比其他生成的段落更需要人工判断。在调用任何模型之前,都应将这些情况写入规范中。真正的问题在于哪些教学决策可以委托处理、哪些需要审核,以及每种转换依据什么证据,而非代理是否具备教学能力。通过这样的框架,教育者能保持对学习设计的掌控权,而工程师则能获得可测试的需求说明。
下一步方向
其价值在于将学习视为一个受控的反馈循环:从目标出发,根据学习者的表现推断问题所在,选择合适的应对措施,检验结果并负责地调整方向。关于变革教育的各种设想应暂缓提出。先围绕一个具体的学习目标构建一个小型且透明的系统,测试其处理流程,研究其对理解程度的影响,再与教师及学习者共同优化该系统。这比让聊天机器人显得有用要困难得多,但这也是教育类人工智能应当达到的标准。