春节期间,开发出AlphaGo的人工智能公司DeepMind又发布一个能够自主编程的新模型——AlphaCode。
在编程竞赛网站Codeforces举办的10场比赛中,AlphaCode取得了前54.3%成绩。这意味着,它打败了将近一半的人类选手。更为关键的是,比赛中的所有代码都是由AlphaCode自动生成的,全程无需人工监督。
AlphaCode取得的成绩意味着什么?它会抢走程序员的饭碗吗?在基础科学领域,AI发挥了怎样的作用?该如何理解人类和AI的关系?
上周,《今夜科技谈》邀请到了科普作家瘦驼、JinaAI创始人兼CEO肖涵、一流科技OneFlow创始人兼CEO袁进辉,聊了聊和AI有关的话题。
01如何评价AlphaCode取得的成绩?它需要人工训练吗?
肖涵:AlphaCode其实不是一个单一的算法,它是根据GPT-3模型搭建出来的一个系统。所以我们不认为AlphaCode是AI算法上的突破,它的突破在于产生了一个能够胜任比较复杂任务的系统。
就算法训练来说,人工智能的第一步是预训练。就是把GitHub上的程序都拉下来,让这个模型对编程有一个初步的认识。
第二步是微调。因为预训练得到的知识并不都是有用的,它们给出了一个大体的世界观,但如果要解决具体的问题,就需要定向调整。
AlphaCode做的另外一件事就是构建了一套评判系统。因为基于给定的题目,AlphaCode可以生成大量答案,但它并不知道这些答案正确与否。所以把问题答案和他给出的答案输入到这个系统中,它就可以评判答案正确与否。
整个过程确实就像AlphaCode发布时所宣称的,是可以做到完全无监督的。
袁进辉:我认为AlphaCode是里程碑式的进展,根据自然语言描述,自动生成可解决算法问题的完整程序,这很了不起。
其实我对AlphaCode,经历了从低估到高估再到低估的心理转变。
我在看到论文细节之前,低估了AlphaCode。和GPT-3训练自然语言类似,AlphaCode本质上也是抓取了GitHub上的几百亿行代码,捕捉语言结构,再生成。并且,相比于非常不规律的自然语言,代码的语法是非常规律的。从这个角度来说,AlphaCode和以前解决问题的方法差不多。
但令我感到意外的是,我本来以为AlphaCode的原理是自动搜索代码库中已有的代码片段,但实际上这些代码都是预训练模型自动生成的。传统上我们认为AI解决的通常是低精度的问题,比如图片识别准确率90%已经很高了,但让AI做到%的准确率是极难的。而代码恰恰要求%,即使是写错一个变量名称,或者少打一个「;」,程序也会报错。所以这时我又高估了AlphaCode。
后来我又看了AlphaCode的论文,发现它确实可以自己生成完整程序,但中间也用了一些取巧的成分。比如说它会为一个问题生成万份程序,其中当然有对有错。AlphaCode会筛选掉99%的代码,留下1%。在这1%的几千份代码中,AlphaCode又通过聚类筛选等方式,筛选出10个答案提交到Codeforces。只要这10个答案中有一个正确答案,就算过了。
所以AlphaCode并不是一次性生成解决问题的程序,而是为一个问题生成数十万、上百万的程序,经过简单测试、样例筛选,最终筛选出正确答案。
02对比Codex、GitHubCopilot这些辅助编程工具,AlphaCode有什么不同?
袁进辉:我觉得有两点,一是解决的问题不同,二是方法不同。
AlphaCode解决的问题,还是有一定难度的问题。
二是AlphaCode不是网上搜索的现成代码片段,是自己生成的。像GithubCopilot,就是搜索的现成代码片段。之前有人做过实验,发现它会从StackOverflow(代码问答网站)上抓取代码,因为它把程序员写在代码里的注释都抓取过来了。
03这些AI编程工具,会取代程序员吗?
肖涵:其实这些AI辅助编程工具,都是为了帮助开发者能有更好的编程体验。只不过AI发展到今天已经非常强大,它可以自动把代码写完,而不仅仅是填函数名这么简单。
但是今天所有的AI都没有到达取代开发者的程度,开发者本身还是那个最终的决策人。AI所生成的代码,仅仅是一个参考。
瘦驼:作为一个文字工作者,我还是想把这件事映射到「自然语言」的领域来。
首先,让AI生成一段没有任何语法错误的代码没有那么难。在自然语言里有大量不符合逻辑和语法的东西,我们在说话的时候并不是严格遵循某种规律的。但代码本身是严格遵守语法的,它有一套通用的逻辑。
第二点,我觉得码农其实不必太紧张,对于文字创作者来说,我们在前几年已经碰到过类似的挑战了。现在一些固定格式的文本已经大量地由AI生成,比如比赛结果、股市播报、天气预报。对于这种有规律可循的文本来说,AI写得比人快多了。但是想让AI写一些有创造性的东西还是非常困难的,因为创造性本质上是对现有逻辑和体系的挑战,甚至创造性包含了允许AI犯错。对AI来说,它很难保持一定的个性,比如《红楼梦》里,贾宝玉的诗和林黛玉的诗就有明显的不同。这种能力,AI现在可能还很难做到。
肖涵:我觉得性格的差别,无非就是训练语料的不同。如果我想生成一个朦胧派诗人的风格,我就把所有朦胧派诗人的语料收集起来,训练一下就可以了。
所以我觉得对AI最重要的还是数据。算法模型如果能更好地挖掘数据,把数据的价值充分利用起来,那其实所谓的性格也就达成了。
袁进辉:我来补充一个反方向。按照肖涵的逻辑,那如果没有朦胧派的语料,就生成不出朦胧派的AI;如果没有梵高这个人,就训练不出梵高风格的绘画。所以AI在创造层面,本质上还是更像一种记忆,差别在于是一种机械的记忆还是比较聪明的记忆,但其实都跳脱不出原有的范畴。
专业术语里有两个词,「exploitation」和「exploration」。exploitation指的是保守地在应有的范围内工作,exploration指的是在范围之外探索。
也许我们需要给AI一点犯错空间。
04在AI崛起的背景下,怎么做一个有价值的程序员?
袁进辉:AI比较擅长做比较机械的工作,但写代码也是需要创造性的,写到一定程度,我们也把它称之为艺术。
代码里面也有好坏,写出来的代码是不是足够简洁优雅,是否有创造性的审美,这可能还是人类的优势。
张鹏:但这种美,是不是也要能体现在效率上高于丑和复杂的东西,商业世界才会认可?
袁进辉:这种美,确实在效率上有体现。判断代码美丑的一个标准,就是可复用性。简单的代码有更好的扩展性,未来就可以在更多的地方复用。如果我的代码只在当前的任务可以用,就是不太好的实践。
肖涵:我想起来之前国外论坛上有一个特别火的帖子,就是说一个律所雇佣了一个小伙子做类似报表整理之类的工作。恰好这个小伙子懂一点编程,就把这个工作自动化了,程序运行5分钟就可以做完原来一周的工作。两周之后,这个小伙子内心有点愧疚,就把这件事发到了论坛上,问大家该不该告诉老板这件事。
我觉得这件事反映了一点——不管他有没有告诉老板,机械化的工作一定会被取代。甚至他自己也觉得做这种工作没有意义,否则就不会有这种纠结。人生总要有点追求,何必在这里浪费时间?
其次是我觉得出现这些代码辅助AI不是坏事。人类发展到今天,不管是工业革命还是流水线的引入,人类总会从事更高级的职业,会创造更高的价值。总体来说,我觉得这是一件正向的事。
05怎么理解当下很火热的低代码、软件2.0这些概念?
肖涵:低代码出现的原因,其实是过去几十年我们已经积累了大量的代码资本。今天任何一个软件,都不是从头开始写的,它们都有自己的上游依赖关系——软件库。
实际上我们构建现代软件的时候,最重要的往往不是创新,而是可复用性。可复用性指的就是,这个软件完成之后,一定要成为更大型软件中的一个组件,而不是从头开始重复造轮子。
当「可复用性」这种概念深入人心之后,于是才有了低代码、无代码这种概念。今天我们构建的代码越来越高级,不再是操作系统这种底层软件,更多的是面向C端用户的高级软件。这种情况下就非常凸显低代码、无代码的重要性。
如果纵观整个人类的工程史,其实可复用性就是非常关键的转折点——一旦一个东西可以被复用,人类的文明就会发展到一个新高度。我们可以假想一下,一个原始人拿着两块石头碰触了火花,这是一个偶然吗?还是说它成为了可以被复用的经验,于是人类就此掌握火的使用?
所以我更想强调的是,低代码和无代码肯定是发展趋势。但趋势背后的原因在于,我们现在面向的是更高级的软件开发,这种开发尤其强调复用性。
袁进辉:我来补充一下软件2.0。
软件1.0说的是代码是数据。我们在代码的基础上,基于数据训练一个AI模型。
软件2.0指的是模型是代码。在AlphaCode之前,AI的模型早就开始为人写代码了。比如图形识别模型,它的原理是计算机视觉科学家写了一堆规则——图片里有哪些特征,那这张图片就是汽车。但是这么做了几十年之后,发现这种方法识别率并不高。所以现在的做法是从一堆数据中训练出一个模型。
以前代码必须由程序员理解问题之后转化成计算机理解的语言,计算机才能帮我们解决问题,本质上是一个从物理世界迁移到数字世界的过程。模型即代码的意思就是,现在我们不需要经过人脑了,只要收集一堆数据,计算机就能自动挖掘数据中的规律,生成模型。
06可复用性是判断代码好坏的一个重要标准,现在代码间复用的情况也越来越普遍,但如果引用的底层代码本身就有问题,该怎么办?
肖涵:现实世界中确实发生过这样的事。前几个月Log4j软件包出错,就造成了非常多软件公司的恐慌。这样的问题,在低代码和无代码的环境下会更难发觉。因为没有多少人会去写这种底层的代码了,大家