让编译器和运行结果检验 AI 编程教学
Flash 将 AI 教学改为短课与交互练习,并让学习者实际编写、编译和运行代码,通过输出比对获得反馈。模型负责生成课程,代码练习则依据编译错误和执行结果判定,支持多种常见语言。
AI 深度解读
AI 把指针讲得很清楚,不代表你真的会写。Flash 作者想解决的,是聊天式学习里缺少练习、验收和复习的问题:让模型生成课程,把答题检查交给规则,把代码交给编译器和运行结果验证。
这次改造最有参考价值的,并非课程界面,而是职责划分:模型负责出题和提示,系统负责判分、记录与复习。作者还分享了小模型调用工具时的纠错办法,但学习效果究竟提升多少,原文没有给出对照数据。
模型写课程,为什么不让它判分
在 Flash 里输入「Teach me C」,得到的是聊天窗口中的课程路径。每节先给几段短说明,再让学习者填空、排列打乱的步骤,或完成代码练习。
代码练习会实际执行。以 C 为例,代码在临时目录里编译、运行,系统检查打印结果;答错时,页面展示编译器错误,或者把实际输出与预期输出放在一起。
这比模型评价代码「看起来没问题」更容易核验。
作者列出的支持范围包括 C、C++、Python、JavaScript、Rust、Go、Java 和 Linux shell。课程还提供 XP、每日连续学习记录和全屏模式,不过这些属于参与机制,不能直接证明知识掌握程度。
模型负责生成学习材料,系统负责验证可以明确检查的答案。
按照作者的描述,判分不调用模型,也不等待模型返回;代码题则通过编译运行和输出检查验收。只有点击 Ask Flash,模型才重新参与,而且被要求提供提示,不能直接交答案。整个系统运行在笔记本上的本地模型环境里,作者认为,把模型移出判分流程是响应迅速的关键。
这里还有一层边界:输出正确能证明当前用例通过,不能自动证明程序对所有输入都正确。原文没有说明测试用例覆盖率,也没有交代临时执行目录之外的隔离措施。
课程不能只解锁下一节,还得让旧知识回来
Flash 会在每次作答后更新掌握程度估计。作者说,猜对和粗心答错的权重较低,但没有公开估计算法,也没解释系统如何识别这两种情况。
课程推进与复习是两套动作:一节答对一次,就能解锁下一节;旧内容还会在明天、2 天后、4 天后、8 天后重新出现。答错则安排次日再练。这就是间隔重复(spaced repetition):系统替你安排回忆旧知识的时机。
这个设计回应了聊天教学的一处缺口:读懂解释通常不需要主动回忆,关掉窗口后也没人检查你还记得多少。
但这里要分清产品机制与效果证据。作者展示了如何安排复习,没有提供长期留存率、完课率,或与普通聊天教学比较的结果。「系统记录了你的表现」成立,「系统准确知道你理解了多少」仍需要验证。
小模型不听长说明,可以让错误调用直接失败
作者遇到的另一个问题是:让小模型生成「下一个单元」,它可能交出六节没有练习的课;再请求一次,又把第一单元换个标题教一遍。加了很多说明,仍然没解决。
有效的转折来自一次被拒绝的工具调用。错误信息直接指出:structs 没有可作答内容;除单元介绍外,每一步都必须包含测验、填空、排序或练习;请补齐后重新提交。
这里约束的已经不是模型的态度,而是工具是否接受它的结果。
能用程序检查的要求,应该变成提交条件。
Flash 也给 agent 配了按需读取的工具手册:共 34 份指南,覆盖教学、网页制作、视频和邮件等任务。agent 平时看到指南名称,任务需要时才读取内容。指南包含 116 个工具调用示例,测试会拿它们与当前工具定义核对,首次运行就发现了两个失效示例。扩展也可以随工具附带指南。
这与课程校验是同一个工程思路:示例和说明可以帮助生成,最终仍要有可执行的检查。
作者还列出了同周新增功能:网页按精确时钟逐帧渲染为 MP4;测量音频的音高、速度、响度与削波,并根据音符生成声音;检索笔记、PDF 和代码并引用来源;让两个模型匿名回答,由用户选胜者并记录得分。他报告三天提交了 40 个 commits,2,955 项测试通过,所有功能都在本机运行。这些是作者披露的开发与验证信息,不是教学效果评测。
我的判断
我认同把确定性检查从模型手里拿出来。相比每次把答案送回模型评阅,这种方式减少了推理等待,也让判分依据更容易追查。对于填空、排序和有明确预期结果的代码题,尤其合适。
前提是题目和检查规则可靠。模型可能生成有歧义的题目,也可能给错预期结果;判分过程再稳定,也修不好错误的答案标准。原文没有说明课程发布前是否经过独立审核。
主观题、架构取舍和代码可维护性评价,也很难只靠输出比对完成。更合理的取舍是按题型选择验收方式。作者关于「清晰报错比长篇建议有效」的观察值得借鉴,但没有跨模型对照,仍属于经验之谈。
能拿来做什么
- 用 AI 学 JavaScript 或 Node 时,让它每讲一个小知识点就出一道可运行练习,并要求给出输入、预期输出和失败反馈。
- 开发编程练习工具时,把答案生成与验收分开;代码题实际运行,同时检查生成的题目和答案标准是否一致。
- 给 agent 增加工具时,把必填字段、内容完整性等要求写进校验规则,并返回能指导修正的具体错误。
- 维护工具文档时,将示例调用纳入自动校验,工具定义变更后及时发现失效示例。