[论文阅读] 人工智能 + 教学 | 多智能体当“编程老师”?这篇研究让C语言代码知识点标注更精准
多智能体当“编程老师”?这篇研究让C语言代码知识点标注更精准
一、论文信息
| 信息类别 | 具体内容 |
|---|---|
| 论文原标题 | 基于多智能体协作的学生代码知识点自动标注方法——以C语言为例 |
| 主要作者 | 刘佳琦、高志泽樟、孟宪佳、孙霞(通信作者)、冯筠(通信作者) |
| 研究机构 | 西北大学计算机学院(西安,710127) |
| APA引文格式 | Liu, J. Q., Gao, Z. Z. Z., Meng, X. J., Sun, X., & Feng, Y. (2025). Automatic Knowledge Point Annotation for Student Code Based on Multi-Agent Collaboration: A Case Study of C Language. Computer Science. https://link.cnki.net/urlid/50.1075.TP.20250911.1012.016 |
| 网络首发信息 | 2025年9月11日网络首发,收录于《计算机科学》(ISSN 1002-137X,CN 50-1075/TP) |
二、一段话总结
针对传统“习题导向”知识点标注忽略学生编程个体差异、单智能体难以处理大规模代码分析的问题,西北大学团队提出多智能体协作的C语言代码知识点自动标注方法:构建“语句层-代码块层-函数层”三层次知识点体系,设计“知识点标注-任务分析-整合反馈”三个智能体(带自检迭代机制),基于363份大一新生C语言代码实验。结果显示,该方法(尤其Proposed-MAS-R版本)在完整性、准确性等五维度评分均优于直接用LLM的基线方法,被选为最佳方案比例达49.86%,且与人类专家评审高度一致,最终实现代码知识点的自动化、可解释标注,为编程教学个性化评估提供技术支撑。
三、思维导图
四、研究背景:编程教学中的“标注困境”
1. 传统知识点标注的“两大盲区”
想象一个场景:老师布置“求1到100求和”的C语言题,学生A用for循环写对了,学生B用while循环但少加了1(结果错),学生C直接写死答案(结果对但没用到循环)。
传统“习题导向”标注会认为:这道题关联“循环结构”知识点,学生A掌握、B/C没掌握——但这明显不准:
- 盲区1:忽略个体差异:学生A用
for、B用while,都是对“循环结构”的不同应用,但传统方法只记“循环”这个标签,看不到差异; - 盲区2:忽略细节价值:学生B虽然结果错,但
while循环的语法用对了,传统方法因“结果错”直接否定,没发现他其实掌握了部分知识点。
这就是论文指出的核心问题:传统方法以“习题”为核心,只关注“题对应什么知识点”,不关注“学生代码里实际用了什么知识点”,相当于“看题判掌握,不看过程判对错”。
2. 大规模教学的“技术拦路虎”
随着编程课人数增多(比如一个班100人,每人提交3份代码,就是300份),人工标注根本忙不过来——而且代码写法千差万别:有的变量名乱起但语法对,有的逻辑绕但功能实现,单靠一个“智能系统”(比如直接用ChatGPT分析)也不行:
- 单智能体像“一个老师批所有作业”,容易漏看细节(比如没发现
gets函数的安全问题); - 分析逻辑单一,没法同时兼顾“语法对不对”“功能达不达标”“知识点用得好不好”,反馈总是“泛泛而谈”(比如只说“代码错了”,不说错在“条件判断缺失”)。
正是这些问题,让研究团队想到:能不能用“多个智能体分工协作”,像“教学组”一样一起批代码?这就是研究的起点。
五、创新点:三个“突破传统”的设计
1. 从“盯题”到“盯代码”:标注对象转型
传统方法“先看题,再给题贴知识点标签”,研究反过来“先看代码,从代码里拆知识点”——比如同样是“密码合法性检查”题,有的学生用了if-else,有的用了switch,系统会分别标注“选择结构(if-else)”“选择结构(switch)”,而不是统一标“选择结构”,真正体现学生的实际写法差异。
2. 三层次知识点体系:像“拆积木”一样拆代码
把C语言知识拆成“语句-代码块-函数”三层,就像把一栋房子拆成“砖块-房间-整栋楼”,每个层次对应不同分析重点:
- 语句层(砖块):看单个代码行对不对(比如
int a=5;是不是正确定义变量); - 代码块层(房间):看多个语句的逻辑对不对(比如
for循环里的判断条件有没有写错); - 函数层(整栋楼):看模块化设计好不好(比如自定义的
check_password函数参数传对了吗)。
这种划分让标注更细,不会“一棍子打死”(比如语句对但代码块错,能精准定位问题)。
3. 多智能体“教学组”:分工+自检
设计三个智能体像“老师组”一样协作,还能自己检查纠错:
- 标注智能体(知识点老师):专门找代码里的知识点,比如“这里用了
for循环”; - 分析智能体(功能老师):专门查代码能不能实现题目要求,比如“密码检查没加长度判断,功能不达标”;
- 反馈智能体(总结老师):把前两个老师的结论整理成报告,比如“知识点:
for循环(对);问题:条件判断缺失(错);建议:加if(len<8)判断”; - 自检机制:如果标注智能体漏了知识点,自己会回头重查,直到查全或达到最大迭代次数(比如最多查3次)。
六、研究方法与实验:怎么验证“多智能体”好用?
1. 研究方法:分三步走
第一步:建“三层次知识点库”
先整理C语言核心知识点,比如语句层的“变量定义”(编号1214)、代码块层的“for语句”(编号2440)、函数层的“函数递归”(编号4140),每个知识点都写清楚“是什么、怎么判断对不对”(比如“gets函数属于不安全输入,判断为错”)。
第二步:搭“多智能体系统”
用JSON格式让三个智能体互通数据:
- 标注智能体输出:
{"level":"代码块层","code_snippet":"for(int i=0;i<n;i++)","skill_id":2440,"verification":true}(意思是“代码块层,for循环,知识点2440,用对了”); - 分析智能体输出:
{"status":"不通过","error_type":"条件判断缺失","skill":["2112(选择结构)"]}(意思是“功能不达标,错在条件判断,关联知识点2112”); - 反馈智能体汇总这两个结果,生成带代码片段、错误原因、建议的报告。
第三步:加“自检迭代”
每个智能体做完后,会自己“检查”:比如标注智能体发现漏了“gets函数”这个知识点,就重新分析代码,补充标注;如果检查3次还漏,才停止。
2. 实验设计:公平对比
(1)实验数据:真实学生代码
来源:某大学《C语言程序设计》大一新生作业,共363份,覆盖8道题(比如“密码合法性检查”“数组排序”),其中:
- 功能正确:169份(46.56%);
- 功能错误:194份(53.44%),包括编译错误60份、逻辑错误63份等(覆盖常见新手问题)。
(2)对比方法:4种方案PK
| 方法类型 | 具体方案 |
|---|---|
| 基线方法(LLM) | Baseline:直接用Qwen3-30B模型整体分析代码 |
| 基线改进 | Baseline-R:Baseline+深度思考(让模型多思考一步“有没有漏知识点”) |
| 实验组(多智能体) | Proposed-MAS:用三个智能体协作分析 |
| 实验组改进 | Proposed-MAS-R:Proposed-MAS+深度思考(每个智能体都多思考一步) |
(3)评估标准:5个维度打分
找5个“LLM虚拟专家”(用同一Qwen模型),按1-5分(5分最好)评以下维度:
- 完整性:有没有标全代码里的知识点?
- 准确性:标对了吗?有没有把“错的”标成“对的”?
- 合理性:报告结构清不清晰?有没有废话?
- 错误识别能力:能不能找到代码里的错,还归因到知识点?
- 教育指导性:给的建议能不能帮学生改进?
(4)人类专家验证
为了确认LLM专家的评分靠谱,找3位计算机专业老师(人类专家),双盲评审30份代码(隐去方法标识),对比人类与LLM的评分。
3. 实验结果:多智能体赢了
(1)五维度评分:实验组全领先
| 方法 | 完整性 | 准确性 | 合理性 | 错误识别能力 | 教育指导性 | 被选最佳方案比例 |
|---|---|---|---|---|---|---|
| Baseline | 3.18 | 3.31 | 3.05 | 3.31 | 3.17 | 6.06% |
| Baseline-R | 3.96 | 4.14 | 3.69 | 3.51 | 3.86 | 20.11% |
| Proposed-MAS | 4.15 | 4.52 | 4.17 | 3.75 | 3.97 | 23.97% |
| Proposed-MAS-R | 4.36 | 4.59 | 4.41 | 3.83 | 4.17 | 49.86% |
关键结论:Proposed-MAS-R(多智能体+深度思考)在所有维度都拿了最高分,近一半(49.86%)被选为“最佳方案”,比Baseline(6.06%)高8倍多。
(2)人类与LLM评审一致
人类专家给Proposed-MAS-R的“错误识别能力”评3.80分,LLM评3.83分,差异仅0.03;“最佳方案”选择率人类评50%,LLM评49.86%,几乎一样——说明LLM的评分靠谱,多智能体的优势是真实的。
七、主要成果与贡献
1. 核心成果(表格总结)
| 成果类别 | 具体内容 |
|---|---|
| 方法成果 | 提出“三层次知识点体系+多智能体协作”方法,解决传统标注的个体差异忽略、细节缺失问题 |
| 实验成果 | 多智能体方法在5个核心维度优于LLM基线,最佳方案选择率达49.86%,人类验证一致 |
| 应用成果 | 生成的分析报告能精准指出“知识点掌握情况+错误原因+改进建议”,可直接用于教学 |
2. 领域贡献
(1)理论贡献
- 首次将“多智能体协作”用于学生代码知识点标注,突破单智能体的分析局限;
- 提出“语句-代码块-函数”三层次体系,为编程语言知识点建模提供新框架。
(2)应用贡献
- 对老师:不用人工批代码,系统能自动出“知识点报告”,快速发现学生共性问题(比如很多人不会条件判断);
- 对学生:能拿到“精准反馈”(比如“你
gets函数用错了,建议换fgets”),而不是“代码错了”这种模糊评价; - 对智能教育:为“个性化编程教学”打基础(比如根据学生漏的知识点推荐练习)。
3. 开源与数据集
目前论文未提及代码开源或数据集公开信息,后续可关注作者团队(西北大学计算机学院)的研究主页获取更新。
八、关键问题(问答)
Q1:传统“习题导向”标注和研究提出的“代码导向”标注,核心区别是什么?
A:核心区别在“标注对象”和“关注点”:
- 习题导向:以“习题”为对象,关注点是“这道题对应什么知识点”,比如“密码题对应选择结构”,不管学生代码实际怎么写;
- 代码导向:以“学生代码”为对象,关注点是“代码里实际用了什么知识点”,比如同样是密码题,学生A用
if-else就标“if-else”,学生B用switch就标“switch”,能体现个体差异。
Q2:三个智能体是怎么协作的?有没有具体例子?
A:以“密码合法性检查”的错误代码(用gets函数、无条-件判断)为例:
- 标注智能体先分析代码,标对“
for循环(对)”“变量定义(对)”,标错“gets函数(错)”; - 分析智能体检查功能,发现“没加密码长度判断,功能不达标”,归因到“选择结构(知识点2112,错)”;
- 反馈智能体汇总:“知识点:
for循环(对)、gets函数(错)、选择结构(错);错误:无长度判断、gets不安全;建议:加if(len<8)、换fgets”; - 自检:如果标注智能体漏了“选择结构”,会回头重查,补充标注。
Q3:实验中“深度思考”模式为什么能提升效果?
A:深度思考模式让模型/智能体多了“自我反思”的步骤:
- 比如Baseline(直接LLM)可能看完代码就标知识点,漏了“
gets函数”; - Baseline-R(LLM+深度思考)会多问自己一句“有没有漏输入相关的知识点?”,然后发现“
gets函数没标”,补充上去; - 多智能体+深度思考(Proposed-MAS-R)则是每个智能体都反思:标注智能体反思“漏知识点没”,分析智能体反思“错归因对没”,进一步提升准确性。
Q4:研究的局限性是什么?未来怎么改进?
A:局限性和改进方向对应:
- 局限性:只针对C语言,适配Python/Java等语言需调整;
改进:后续优化智能体的代码解析规则(比如适配Python的缩进语法),构建跨语言框架; - 局限性:实验样本仅来自1所大学,代表性不足;
改进:扩大样本到多所学校、不同专业(比如非计算机专业)的学生; - 局限性:评估主要靠LLM专家,人类专家参与少;
改进:开展大规模人工评审,优化评估指标(比如增加“学生是否易懂”维度)。
九、总结
这篇论文针对编程教学中“代码知识点标注难”的痛点,提出了“多智能体协作+三层次体系”的解决方案,通过真实学生代码实验验证了方法的有效性——核心价值在于“从‘看题判对错’到‘看代码评细节’”,让智能标注更精准、更贴近教学需求。
虽然目前只适配C语言、样本有限,但为后续研究指明了方向(跨语言、扩样本)。对于编程老师、智能教育研究者来说,这篇论文的方法和思路具有很强的参考意义,尤其在“个性化编程教学”落地中能发挥重要作用。
更多推荐


所有评论(0)