今年年初的时候,Andrej Karpathy,AI业界知名大佬,创建了一家名为Eureka Labs的公司,投入AI+Education并宣称希望构建AI原生的教育体验。
其实很长时间以来,Andrej就在Youtube上更新一系列的AI相关课程,比如如何从零开始实现一个小型的LLM(e.g. GPT2)等。这些课程可谓深入浅出,质量非常高。现在Eureka Labs的第一站也是从AI开始,他们正在做一门名为LLM101n(https://github.com/karpathy/LLM101n)的课程,通过人类教师来设计课程的讲义和主要内容,由AI助手来与学习者进行互动,从而让参与者能够更容易理解。
但今天我们并不想讲这个。
从我个人的角度,我认为由AI驱动的在线教育(国内现在也有很多人开始做了)是一件很有人文关怀意义的工作。因为它(也许)能够很大程度上缓解当前教育的不公平性。但是直到最近开始做一些大模型驱动的代码生成工作之后,我认为Karpathy大神此举也许有更加深远的意义。
如果要用一句话来总结的话,就是:AI需要被教育,而为了达到这个目的,最快捷的方法就是让AI参与教育;
那么也许你会问,现在我们消耗海量算力进行的训练,难道不是教育吗?我觉得training当然是一种教育形式,但现在我们能够给予大模型的训练数据,与我们作为人类幼崽的时候所接受的教育过程相比,质量实在太差了。我们也许能够堆积数十T的tokens,但它们只是缺乏对齐的结果,而不是“教育”的过程。
这就好比说,让一个孩子在没有指引的情况下,翻看满书柜的书籍。其中不乏劣质的地摊杂志,无聊的广告页,奇诡的文学作品,当然也不乏有那么几本科普读物和正经教材。但到底要什么样的天才,才能在没有老师的情况下只靠阅读这些内容成才呢?
扯远了,让我来从头讲这个故事。
现在如日中天的大模型(也许在2024年这个百业萧疏的秋天,也没有那么如日中天了吧),如果细究起来,其实落地场景并不多。如果不考虑AI诈骗电话和客服,无视内容平台中越来越多的无聊的AI文案的话,可能在我这个程序员看来,AI辅助编程就是最有商用落地潜力的一个方向了。
最近无论是Cursor,还是Deven/OpenDevin等项目,都在向这个方向发起探索。我所在的团队,最近也基于大模型展开了一些测试代码自动生成的尝试。总的来说效果相当不错,在我们的测试场景中能够以几十块钱的成本生成数以千计的测试用例,虽然质量有待进一步提升,但是可以说非常便宜实惠了。
但在这个过程中,我们发现了一些问题:
大模型生成代码,一次成功的概率相当低。在这个过程中会犯大量的低级错误,比如在C程序中使用了strlen函数,但是忘记了导入string.h这个头文件。并且,这类低级错误的出现频率相当高;
通过将错误信息反馈给大模型,可以让模型进行改错,重复多轮直到生成正确的结果,但是大多数模型的改错能力是很差的,基本上在出错—修正4~5轮后,就会完全失去改错能力。(这并不是受Context Size的限制,我们的实验中,四五轮的错误信息和中间结果,多数时候都不会超过10K,而我们使用的模型大部分都有16K及以上的上下文长度)
回头来看这些问题的话,我们意识到,这些问题与人类程序员所遇到的问题其实是一模一样的。即使是非常资深的老码农,在写代码的时候也很难一次成功。(我是说很难,不是不能!我自己做很多小模块的开发也能做到一次成功,但是这个过程是需要自己进行大量的代码审视和反思的)
但不同的是,人类程序员的改错能力通常比较强大,相比而言,我们的测试结果表明主流大模型的自我反思和改错能力仍然相当有限。(截止到本文写作时,我们已经几乎测试了市面上所有主流商用模型,但claude3.5-sonnet除外,还没来的及搞)。
那么这个问题的起因呢?我觉得也很容易理解,因为在当前的互联网上,你能够找到的大多数训练语料都是结果性的而不是过程性的。举个例子,我们看到一个开源代码仓,即使其中保留了大量的commit信息,但这些commit往往都是完成了一整个特性开发和测试之后一次提交的。而开发者在这个过程中如何与开发环境和运行环境互动,怎么写崩了程序慢慢调试到正确,怎么根据编译器和运行时log来进行修改,怎么根据需求来写出测试代码,这个过程是没有留下痕迹的。
因为缺少这样的过程性语料,因此我们训练出来的大模型自然就缺少这种逐步修正的能力。
那么接下来,我们不仅要思考——为什么人是具备这样的能力的呢?我认为是教育。
如果我们尝试回忆一下从小到大的学习过程,我们会发现一些有趣的事实:
教育从来强调的都是知其然,更要知其所以然。即便是填鸭的应试教育,也非常关注我们在做题的时候的推理过程和步骤;更进一步地,我们通常都会强调要“举一反三”,也就是说,要让学生知道一道题为什么这么去解,什么情况下这个解法是不可行的,等等;
这个教学的过程,对老师的要求是很高的。高水平的教师自己对知识有着非常透彻的见解,从而更容易深入浅出,用很简单的方式给学生讲明白。教学者理解越深刻,对学生的要求就越低;
教学的过程,其实也是教学者自身加深理解的过程。还记得我自己上学的时候,非常喜欢给其他人讲题,因为别人的提问会让我发现一些新的知识盲区和不同的思考角度(如果他是对的,那么我就学到新东西了,如果他是错的,我要思考怎么告诉他为什么这样不行)
除此之外,还有很重要的一点,那就是:这些动作是无法由教师自己完成的,因为无论你的水平多高,你始终受困于自己的单一视角,无法获得更宽广的信息。而这个过程往往又是千人千面的,因此很少会有人把“答疑解惑”这个动作记录下来成为语料——因为我的疑问,可能对他人来说是没有意义的。每个学生有不同的问题点,理解能力,因此老师通常都要因人施教,这些过程即便记录下来,也很难对其他学生起到多大作用。当然不是说完全没用,只是可能性价比比较低。
另一方面,即使很多教材把共性问题整理变成了“Frequently Asked Questions and Answers”,这些内容也往往忽略了中间的问答过程。因此这些信息能够刻画“知识”,但无法刻画“教育”。
说到这里,我就想到了《论语》。例如:
颜渊问仁。子曰:「克己复礼为仁。一日克己复礼,天下归仁焉,为仁由己,而由人乎哉?」 颜渊曰:「请问其目。」 子曰:「非礼勿视,非礼勿听,非礼勿言,非礼勿动。」 颜渊曰:「回虽不敏,请事斯语矣!」
我认为,这就是一种刻画了“教育过程”的语料。如果能够通过这种语料来训练AI,我认为这才称得上是对AI的“教育”,这也是我认为当下大模型最需要的东西。其实某种程度上,我认为今天许多AI业界的研究者都已经认识到了这一点,无论是Reflection,还是刚刚推出的Openai o1系列模型,背后可能都是类似的insight。
好,那么问题来了,去哪搜罗这种形式的语料呢?正如我前面说的,这种学习过程很多时候是不会留下文字形式的记录的。
但是这种“教育”过程的信息,是不是真的没有留下任何痕迹呢?也不尽然。老师们,也就是教育者,在他们的一生中,在漫长的授课生涯和答疑解惑的过程中,真正积累了关于“教育”的知识。而他们的知识,来源于学生。某种意义上,老师教授学生学科知识,但老师的学科知识和教育知识是由学生通过提问的方式所教会的。现在我们希望AI能够受到“教育”,不外乎两个途径:
将老师们的知识“迁移学习”到AI上,
让AI代替老师的位置参与教育的过程,在过程中积累大量语料并对AI进行再训练,从而“培养”出一个对知识有着真正深刻立即的AI
但第二个方法太过于激进了,牺牲了现有的教学质量。将这两个方法结合,也许就是最好的方案——在真正的优秀教师的监督下,让AI作为助教参与教学,并逐步进行自我学习演进。
从表面上看,这就是AI for Education,一个公平,普惠的教育提升方案。从深层来看,这是一条双赢的道路,我们的学生,最终将会用他们充满求知欲的问题,培养出真正有智慧的,受过教育的AI。
来源:知乎
点击阅读原文,与教育老友,温暖重逢。