一、背景
作为一个刚入职度厂没多久的搬砖工,在一开始看到文心快码(Baidu Comate)声称其生成的代码构成了百度每日总代码提交的30%,感觉还是有些震惊。
联系到厂长之前说的话,我意识到现在躺在vscode里和我朝夕相伴、替我缝缝补补的贤惠Comate,可能在不久的将来,会在很多事务上完美取代我,这让我算是喜忧参半吧:
喜,在于不用去浪费时间理会简单、重复、繁琐的语言细节,而专注于更高层次的算法设计和架构创新,这很令我兴奋;
忧,在于对“人”这个因素的不可替代性的质疑:未来,当机器领会了数以万计的优秀代码库、甚至由其编译生成的IR、二进制代码之后,留给人类的发挥空间还会有多少呢?
所以与其他对AI代码助手的评测文章不同,我此次不会给度厂自己的产品一丝偏袒,将尽我所能,给文心快码上些强度(外宣请别骂我)。
之所以这么做,一方面是:作为一个搞技术的人、一个凭手艺吃饭的工匠,总还是对使用这类工具感到有些许羞耻(就像是铁匠师傅用了CNC车床)。另一方面:坦诚而言,我需要了解该类工具的优势和盲区,来决定之后自己的技术投资,避免自己的技术储备被神经网络中几个B的参数轻而易举的替代。
二、热身(IOCCC代码阅读与重构)
IOCCC介绍:
在正式开始之前,由于事先知道大语言模型有着超越常人的上下文信息联系、理解能力,我选取了若干个历年IOCCC获奖代码对文心快码进行简单的热身(笑),我人眼看了下,不愧是冠军,写的代码果然防御性很强哈哈:
以上两个分别是 IOCCC2019、2020获奖选手的大作,投给comate做一个小小小小热身😏
A.IOCCC2019(dial-grabsch1)
B.IOCCC2020(endoh3)
全防出去了啊,很快啊,甚至还挑了几个刺,看来IOCCC已经不能满足它了,是时候让它见识下真正的工业级代码了
三、工程代码分析与解构
由于comate这类助手通常会使用众多优质的开源代码库作为训练数据集,本次测试为最大限度避免使用到训练集数据,同时遵循闭源代码的红线,我选取C++26 proposal中的stdexec代码库对comate进行压力测试。
该库由Nvidia工程师所主导开发,其中依托无栈协程实现所提出的“结构化并发(structured concurrency)”设计思想高度简洁抽象,而在网络上文档尚不完善,且几乎没有使用其进行开发的大型工程,但作为未来C++标准中对异步计算的统一抽象,可以预见其在逐渐异步化、并发化的现代C++编程中将会有很重要的作用。
(接下来我会利用stdexec拷打comate直到它阿巴阿巴)
源代码定位上存在着一些小小的失误,比如sender_traits.hpp找错了,其他的没问题,总结的很到位,我翻几个trait给它读读
我们能从返回的第一个结果中看出,comate在给定整个代码库作为上下文后,对单个代码自身功能、及其与整个代码库的静态联系解析的十分细致入微。
但是转机出现在了第二个问题中,当我们为其提出了一个较为宏观、需要结合整个模型设计实现,进行现场分析的问题时,我们能看出:在对一个复杂、动态、大幅革新的软件系统进行分析时,大语言模型作为一个概率模型,在没办法直接观测运行结果的前提下,仍然会尝试去基于自己从预训练中积累的经验去进行总结、推测,而这些推测是没有具体代码进行支撑的,而且具有一定的误导性。
其实这是一种试图以自身智能去建模整个程序时,发生的谬误现象。
之前了解过一个有趣的说法,现在的人工智能,尤其是基于参数模型建立起来的这套大语言模型,存在着统一的死穴,就是对稳态(Stable State)的学习-预测能力远强于瞬态(Transient State)。这也导致它们很轻易去模仿、去汇总,却很难理解甚至做到“革新”。然而“引起雪崩的第一片雪花”、“引起蝴蝶效应的最后一次振翅”、“星星之火可以燎原”,这些现实生活中有趣的现象,都迸发自一个个奇妙的瞬态,而这是当前AI所不能理解或生成出来的。
后记
说实话在一开始,我并没有想到文心快码能撑到最后一个问题,看来这些日子它的进步真的很爆炸。现在,它作为一个工作助手而言,在正确的使用下,已经优秀到足以打破许多人为构建的技术壁垒(代码混淆、陈年屎山)了,如果对标自动驾驶,不吹不黑,可能已经达到准L4级别了。
程序设计是对真实物理世界的建模,我个人认为大语言模型内在的数学模型是存在局限性的,并不足以完美描述着整个世界,在大语言模型底层的数学模型被改写之前,世界模型应该是不存在的,所以这可能是目前所有AI助手脑壳往上几尺的邦邦硬的天花板。
然而,优秀的大语言模型覆盖了越来越多的“稳态”,留给人类程序员发挥的空间,最终也将归于对“暂态”的捕捉和利用了,这会要求人类程序员具备更加充足的冒险精神、创新能力和敏锐的洞察力。
所以comate只能作为一款优秀的战术武器,真正的战略武器,短期内还得是我们的大脑。
那就让我们像那些充满好奇心的祖先一样,拾一支丛林中的枯木,回想起雷击木上的火焰,开始钻取第一缕属于自己的火苗吧。