最近拿到一个课题,是对人工智能在代码自动生成方面的应用做调研。作为一个以嵌入式开发为主的工程师,我了解的人工智能就是图像识别和神经网络算法,能想到最深入的智能编码方式也就是基于庞大程序块的逻辑组织与架构选型,事实证明这种太关注实际技术,关注应用的想法在人工智能的大浪潮下完全落伍了。通过阅读一些资料和看一些机器学习基础的书籍,发现人工智能对代码生成技术是完全有理论支撑跟研究驱动力的。
从信息论的角度上来说,只要明确信息有相关性,选用合适的概率分布假设,大量的数据训练,机器完全可以模拟人的思考和推论过程。从研究成果方面看,目前已有大量的人工智能辅助编码工具,人工智能前端自动编码项目等等。但是考察现在的代码自动生成项目,很多是基于GUI设计,依赖框架和模板,类Wizard的应用,本身的配置过程就已经充满了复杂度,智能的部分比较少,还是通过模块化的组织来生成代码,似乎离真正的机器写代码还很远。而且大量的程序员对机器写代码这件事还是持极大的怀疑态度的。但是几个项目改变了我的想法,而且给了一些启发。
一个是自动生成前端页面的代码项目
典型的有18年初丹麦一家公司发布的一个面向前端的智能代码项目pix2code,该项目通过训练后的网络能够将设计图直接生成前端静态页,而且生成代码准确率达到了77%。
附上pix2code的GitHub地址:
https://github.com/tonybeltramelli/pix2code
还有一个前端典型的项目是19年初阿里的imgcook。
从上面两个而项目看到,对于前端,有固定架构和固化模块的代码编写,机器已经能够完全识别设计图的信息并转化成代码,按照这个发展趋势,前端程序员被取代是一个可见的未来。
前端代码由于其模块化格式和相对简单的逻辑,智能编码已经很好地展示了其能力,但是由于功能编码暂时无法达到智能,仍然需要程序员看懂机器代码并完成交互功能,所以这项技术离实际应用还有一定的距离。大批对AI自动编码持怀疑态度的认为人要机器做事,人必须至少告诉机器自己“想要什么”,然而表达这个“想要什么”的难度,其实跟编程几乎是一样的。包括田渊栋的一些研究都表明了让机器自主编码的技术难度。
如何用卷积神经网络让计算机读入一个算法的输入输出,自己写代码:Unsupervised Program Induction with Hierarchical Generative Convolutional Neural Networks
但是我看到另外一个人工智能项目让我对机器自主编码产生了一些其他的思考。这是今年8月底刚刚发布的一个项目,一位名叫”Zeyao Du“(位于南京)的开发者,在GitHub上开源了的GPT-2 Chinese。
GPT-2中文开源Github
https://github.com/Morizeyao/GPT2-Chinese
在这个项目中作者通过中文预料的训练,让网络能够自主写诗、新闻、小说和剧本,或是训练通用语言模型。而且训练的结果非常好,语义通顺。下图是一些作者展示出来的成果
小说
新闻
诗
这个项目让我相信了机器能够模拟人的思考过程和语言逻辑,然后又联想到写代码的过程,真正写代码的难点完全不是逻辑过程,而是需求分解和转化的过程,为什么一定要纠结于自动生成代码技术呢?能不能换一个角度考虑,用AI来理解需求,分化需求,从而对编码起到决定性的辅助作用呢?从上面几个项目能够说明两点
1、机器对于结构化的信息是可以很好地理解
2、机器完全能够理解并模拟中文逻辑
那么如果我们用标准化、结构化的需求分解文档来训练网络,是不是能够让机器理解并识别需求,当需求真正被分解成模块化功能后,代码的编写无非就是模块化代码的组织而已。此处如果能够借助AI做一些代码组织工作,那是不是从另外一个程度上完成了代码的自动生成呢?所以将AI自动编码技术分解成AI需求分解+代码块AI组织是不是实现难度会小一点,技术可落地的可能性会高一点?希望大家能够跟我一起探讨。