Accelerating Accurate Assignment Authoring Using Solution-Generated Autograders
本文介绍了“解法生成式自动评分”(solution-generated autograding),这是一种利用提供的解法来自动创建准确且可扩展的自动评分器,而无需手动枚举测试用例的方法,并通过 Questioner 系统进行了验证,该系统在四年间成功支持了一门拥有近 800 个编程问题的大型 CS1 课程。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下,你是一位试图教成千上万名学生如何烤出完美巧克力蛋糕的老师。在过去,要给每一个学生的蛋糕评分,你必须亲自品尝每一个。但面对数以千计的学生,这根本不可能实现。于是,你制造了一个机器人厨师来替你品尝蛋糕。这个机器人就是一个“自动评分器”。通常,为了教这个机器人什么是“好”蛋糕,你必须写下一份冗长且乏味的规则列表:“如果蛋糕太干,不及格。如果太甜,不及格。如果糖霜是蓝色的,不及格。”你必须预判学生可能犯的所有错误,并为每种错误写一条规则。如果你漏掉了一个错误,机器人可能会让一个坏蛋糕通过,或者更糟,因为你忘了告诉它蓝色糖霜其实可以用于“蓝莓”蛋糕,从而拒绝了一个完美的蛋糕。编写这些规则的过程既缓慢又枯燥,而且往往会导致机器人并不聪明。
这篇论文是关于如何构建这样一个机器人厨师的新方法。与其编写一份长长的规则清单,老师只需展示他们自己烤出的那块“完美蛋糕”。机器人随后会利用这块完美的蛋糕,自行摸索出什么是“好”蛋糕。它通过尝试以一百万种略微“错误”的方式来制作蛋糕,以此观察自己是否能分辨出真正的错误与完美蛋糕之间的区别。这种方法被称为“基于解生成的自动评分”(solution-generated autograding)。它将枯燥的规则编写工作变成了一场有趣的“找不同”游戏,使得为学习编程的学生创建庞大的练习题库变得更加高效。
问题所在:“规则编写”陷阱
当学生学习编程时,他们需要练习解决数百个不同的谜题。为了让这一切运作起来,老师需要一种能够即时检查学生代码的方法。这就是自动评分器发挥作用的地方。传统上,创建一个自动评分器就像是在建造一个只知道识别特定入侵者的保安。老师必须手动编写测试用例列表:“如果输入是 2 时输出 5,那就是对的;如果输出是 6,那就是错的。”
这种方法存在三个大问题。首先,它极其繁琐。你必须预判学生可能出错的所有方式,这就像试图列出一个人在走廊里可能绊倒的所有方式一样。其次,很难知道你的列表是否足够完善。你是否漏掉了某个棘手的错误?如果你不知道,你的自动评分器可能就不够准确,导致坏代码通过或好代码被判错。第三,这些测试列表往往会让学生感到困惑。如果测试失败了,学生可能无法确定是他们的代码错了,还是老师的测试列表写得不好。
解决方案:“完美蛋糕”策略
作者 Geoffrey Challen 和 Ben Nordick 提出了一个聪明的转折方案。老师不再编写规则列表,而是直接提供“解”——即解决该问题的完美代码。他们将这个工具称为 Questioner。
以下是 Questioner 的工作原理(使用一个俏皮的比喻):想象老师递给机器人一个完美的、金棕色的蛋糕(参考解)。机器人不仅仅是看着它,它还开始尝试“破坏”它。它使用一种特殊的“变异”工具,对完美蛋糕进行细微、愚蠢的改动。也许它把糖换成了盐,或者将烤箱温度改变了一度,或者忘记了加鸡蛋。这些都是“变异体”。
然后,机器人会问自己:“我能分辨出我的坏蛋糕和那个完美蛋糕之间的区别吗?”它会生成数千个随机的原料(输入)来测试这些蛋糕。如果机器人能通过这些随机原料分辨出坏蛋糕与完美蛋糕的区别,它就知道这是一个好的测试。如果它无法分辨,它就会继续生成更多的随机原料,直到能够分辨为止。
这就是神奇之处:机器人利用完美解来教导自己什么是不被接受的。它不需要老师写下“不要做什么”的清单。它通过尝试破坏完美解并观察结果,来摸索出正确性的边界。
他们的发现
该团队为 Java 和 Kotlin 构建了 Questioner,并在伊利诺伊大学的一门大规模入门级计算机科学课程中使用了四年时间。他们创建了近 800 个编程问题,供数千名学生进行练习。
以下是他们经验中的核心要点:
- 速度与乐趣: 使用 Questioner 编写问题比编写传统的测试套件要快得多,也更有趣。一位讲师连续三年保持着大约每个工作日编写一个新问题的进度,建立了一个包含 771 个问题的题库。
- 准确性: 因为机器人是针对实际的完美解进行测试的,所以它非常擅长辨别对错。在他们的测验中,他们从未因为自动评分器不准确而不得不废弃某个问题。
- 丰富的反馈: 该系统不仅仅是说“对”或“错”。它还可以检查代码质量。例如,它可以检测学生的代码是否过于复杂(使用了过多的步骤)与简单的优雅解相比。它甚至可以检查学生是否使用了特定的技术(比如递归),如果那是教学目标的话。
- 处理棘手情况: 有时,随机原料是不够的。例如,如果一个问题要求必须有特定的数字“88”才能运行,机器人可能永远无法通过随机猜测找到它。在这种情况下,老师可以给机器人提供一小份“特殊原料”列表来尝试。即便如此,机器人仍然使用完美解来进行评分,因此老师不需要编写完整的测试套件。
为什么这很重要
这篇论文表明,我们不需要成为“测试用例枚举者”也能构建优秀的自动评分器。通过让解本身生成测试,我们可以更快地构建庞大的练习题库。这意味着更多的学生可以获得即时、准确的反馈,从而在不被困在混乱错误中的情况下学习。
作者还指出,这不仅仅适用于 Java;他们已经在开发一个名为 Snapact 的 Python 版本,并且正在探索如何利用 AI 来辅助编写初始的完美解。虽然他们承认没有系统是完美的(学生仍可能尝试通过“暴力破解”来绕过系统),但他们的方法使得绕过系统变得更加困难,同时也让老师更容易创建高质量的学习材料。
简而言之,与其编写一百万条规则来捕捉每一个错误,老师只需展示正确答案,然后让机器人去搞定剩下的事情。这是一种更快、更聪明、也更少挫败感的教学方式,旨在培养下一代程序员。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。