两个学生在分数测验里都拿了40分。Asha做错,是因为她找不到最小公倍数——这是另一个知识点里的技能,比这道题低了两层。Ben做错,是因为他在做等值分数时只改了分母。
分数一样,问题相反。一个聊天式辅导工具看到两个40%,把题目再讲一遍,然后到第二天把这两个人都忘了。
这就是Unlearn要解决的问题。它做的事情可以拆成三步:找到真正断掉的那个先修技能,下一次会话还记得,并且把每一条判断背后的数据库查询亮出来。
为什么是图
值得追问的不是"哪道题答错了",而是"为什么错"。而"为什么"本身是一条连接链:错误选项指向某个误解,误解出现在某个技能上,那个技能又依赖另一个技能,再往上连到学生、连到班级。
这条链天然是图结构。项目用的是Eedi误解图谱(CC BY 4.0),包含8,117条真实误解和2,258个数学技能,全部来自真实教学场景。作者从中切出40个技能组成的分数专题,手工核对了57条"这个技能依赖那个技能"的边,配上120道选择题——每道题的每个错误选项都标注了它暴露的误解——再加8种教学策略。
所有数据都放在FalkorDB里。每个班级拥有自己的图,从模板用GRAPH.COPY复制出来,一个班的记忆不会泄漏到另一个班。
根因是怎么被找出来的
一个诊断代理先问几道自适应的问题。答对,就排除该技能及其下游全部技能;答错,就增加一条证据。然后一条查询沿着先修链向下走最多四步,按加权误解证据给未掌握技能排序——证据相同时深度优先,因为断得最深的那个技能才是真正的原因。
对Asha,查询落在"最小公倍数",比那道分数题低两层。对Ben,落在"等值分数"。图面板会把这条路径用琥珀色点亮。
记忆不写在提示词里,而是写回图里。每一次作答、诊断和辅导尝试都变成节点和边。Asha下次回来,辅导代理开口就是"上次你……",直接来自一条召回查询。代理之间通过同一张图里的任务节点交接工作,辅导代理还会更新某种教学策略的成功率,从而学会哪种讲法更有效。
老师仍然握着决定权
教师视图把图算法当工具用:algo.WCC把持有相同高置信误解的学生分到一组,PageRank找出所有技能都依赖的关键技能,介数中心性找出跨主题扩散的误解。教师代理只能提出建议——重新分组、布置这份练习——在人类点击批准之前,什么都不会改变。
聊天入口也做了约束。模型只能调用固定的图工具,不能直接写Cypher;它说出的每一个名字都要和工具返回的行核对。一旦编造,回答作废,改由普通模板作答。同一批工具还通过MCP对外暴露。
它真的有效吗
作者在90名模拟学生上比较了四种方案,三个随机种子,题目相同,基线统一用本地模型(qwen 27B,通过Ollama运行)。括号内是95%自助法区间,根因识别的差距区间不重叠。
需要说清楚的部分:学生是模拟的,而且模拟器用的选项到误解映射和Unlearn是同一份,这对Unlearn有利。所以作者做了压力测试——把20%的答案替换成随机噪声后,Unlearn仍然超过所有基线的干净成绩;噪声到40%时,它不再全面领先。这些数字应当看作上限,而不是课堂实测结果。
作者还试过把整张图塞进模型提示词(30名学生规模):根因识别率40%,同一批学生上Unlearn是63%,但30名学生的样本区间有重叠,所以这个结论不作数。
过程中坏掉的东西
- 自己的数据。作者逐条复核了手写的先修边和干扰项,发现11处问题(2条错误边、9个误导性选项),修完后重跑了整个评测。
- 一个基线被打分不公。"图放进提示词"的基线只被计入来自短名单的答案,修正后它的分数上升了。
- FalkorDB的竞态。复制班级图时另一个进程正在重建它,抛出"key is already set";免费层上GRAPH.COPY还失败过一次,报"could not fork"。两处都加了重试并记录在案。
- 一次界面回归:只要有一条慢查询超时,教师标签页就整页空白,因为四张卡片是一起加载的。现在各自独立加载。
- 聊天找不到"Rosa",因为工具要的是学生ID而不是名字,它还很自信地说没有记录。加了名字查询后修复。
- 免费层的现实:Gemini免费额度消耗很快,线上站点会回退到录制答案和模板答案。
下一步
误解图谱是真的,学生不是。下一步是在真实学生作答上验证,比如Eedi的NeurIPS 2020教育挑战数据,并把范围从分数扩出去。
技术栈:FalkorDB 4.20.7、Python/FastAPI、Cytoscape.js、fastembed、Ollama / Gemini、MCP、Render免费层。总成本:₹0。
热门跟贴