今天看到一个新闻,DeepMind 的 AlphaCode 发布:Competitive programming with AlphaCode,并且在 Codeforces 的编程比赛中模拟参加比赛,居然能达到中等竞赛者水平。
我对此有些震惊,因为编程竞赛绝对是有创造性的智慧活动,现在 AI 竟然已经发展到了程序能自动生成一些有意义的完整程序。
当我们谈到人工智能的创造性时,通常会想到人工智能来创造艺术作品,比如下面这副 AI 画出来的:
因为在艺术上,很难有一个绝对的标准来衡量这东西到底是好还是坏。但是 AI 生成程序是有绝对的衡量标准,就是生成的程序是否是对的。
AlphaCode 和以前的 AlphaGo 也不同,围棋的规则简单而确定,只是在下棋过程中搜索空间巨大,AlphaGo 做的事是从巨大的搜索空间中尽量选择合理的下一步。
你可以说生成代码也是一个搜索问题,在生成每一个字符串时我们都要从 52 个字母加符号中选择下一个字符,其目标是生成一个可以编译运行、解决问题的程序。
其中的细微差别是,在围棋的中间步骤中,我们都可以通过评估函数来衡量当前局势对于目标的距离,就是判断当前局势对谁更有利。
而在代码自动生成中,这种评估函数并不存在,目前已经生成的代码片段即使包含部分错误,也可以在后续代码片段中修复,所以不到整个程序生成完整,我们没法知道目前做的是对还是错。
这看起来是一个 Copilot 的更强本版,因为 Copilot 是根据目前写的代码片段和注释,补充新的代码片段,但是 AlphaCode 的输入完全是问题的描述,输出是解决问题的完整代码。
比如例子中的这个编程问题,上面是输入,下面是输出:
另外 Copilot 可能是会生成训练集里面的某些代码片段,简单说就是 AI 之前看过某个代码片段,所以在某些场景下背出了这个代码。而从 DeepMind 发布的论文看,AlphaCode 不会完全重复生成训练集中的训练代码。
那这种工具如果更完善后是否会彻底改变编程?难道我们已经快到技术奇点了么?
技术奇点(英语:Technological Singularity),出自奇点理论;根据技术发展史总结出的观点,认为人类正在接近一个使得现有技术被完全抛弃或者人类文明被完全颠覆的事件点。例如,意识上传技术可能使人类的意识摆脱有机体的约束,或者人来开发出可以自我进化、有自由意识的人工智能,在这个奇点之后的人类文明将发展到当今完全无法理解的水准。
之所以被称为奇点,因为它是一个临界点。当我们越来越接近这个临界点,它会对人类的事物产生越来越大的影响,直到它成为人类的共识。但当它最终来临的时候,也许仍会出人意料并且难以想象。
我仔细思考了好一会儿,我的结论是这种工具也许能极大的拓展编程的范围,也可能会改变程序员的工作内容,但离自动编程还差很远。
首先,AlphaCode 也许会提高程序员的工作效率,改变人类学习编程的过程。
我之前对 Copilot 之类的工具持悲观的态度,甚至认为除了酷炫估计对日常开发没什么帮助,参考我关于 Copilot 的知乎回答。
后来我感觉自己被打脸。收到 Copilot 试用邀请后,我在实际开发中使用了大概半年,结果是超乎我的意料。Copilot 和之前我用的代码补全类工具有一些差别,它看起来能猜测我的编码意图,从而进行有意义的补全。
特别是当我使用一个不是很熟悉的编程语言时,我敲一些关键词 Copilot 可以帮我补全剩下的代码,这节省了我自己去 Google 搜索的时间。即使这没有从根本上解决编程的难点,也能很大程度上让编程变得更愉悦。
如果有完美的 AlphaCode,它就是一个 Transformer,输入是英语,输出是程序。
作为程序员我们的日常工作可能会变成向这个 Transformer 表述我们的意图,所以一个会说英文的人,也许就能生成一些有意义的程序,这就是为什么我说编程的范围扩大了,或者我们学习编程的方式改变了。
比如 OpenAI Codex ,我们只需要输入想要的 HTML 效果,Codex 自动生成对应的 JavaScript 代码。
但是,它也终究只是一个输入不同的、人造的 Transformer,我们现在的编译器或者解释器也可以理解为 Transformer, 只是输入的是某个编程语言的源代码,这个源代码是程序员按照编程语言的语法写出来的,程序员是个智能的 Transformer。
自然语言是比编程语言更大的一个集合和维度,所以同样目的的代码,如果从自然语言角度来直接生成,会变得更为繁琐,而且不精准。
在 DeepMind 的论文中也提到了,AlphaCode 的一个问题就是:
Sensitivity to problem descriptions
….
solve rate goes down dramatically when given related but different problems, and is not very affected by different ways of describing the same the problem.
现有的代码生成技术,我们通常会限制输入语言的范围或者规则,这样就是一个领域特定语言 : DSL。恕我直言,现在这些鼓吹的低代码,无非就是套壳的领域特定语言。
作为一个程序员,我也许会使用这种自然语言生成代码的技术来辅助编程,但不可能完全使用这个写代码,我还不担心自己会失业。