从前,任何程序的任何功能,都需要一行一行敲出来。
后来,程序猿要写的代码越来越多,世界上便有了各种各样的API,来减少大家的工作量。有些功能,可以让API来帮我们实现。
不过,人类写下的话,API并不是每一句都能听懂。语言不通的话,愿望就无法实现。
现在,有会写代码的AI可以替你召唤API。以及,它能做的并不止这些。
吃得不多,写得不少
莱斯大学的一群极客,发布了一个基于深度学习的代码编写应用。神经网络从GitHub这样的线上源代码库里汲取养分,写自己的程序。
这个应用叫Bayou,是在美国国防高级研究计划局 (DARPA) 和谷歌研究院的资金支持下诞生的。
Bayou的爸爸们说,这个孩子和它的前辈不同。以前那些会写程序的AI,都需要事先投喂大量细节,才能开始生成代码。有空写好那些细节,不如自己写个程序了。
而要支配Bayou,开发者只要给它吃一点点信息,比如几个小小的prompt,它就会善解人意地猜测,人类想要怎样的程序,然后疾速补全代码。
△input
举个简单的栗子,假设你想写个读取文件的Java方法。如果你知道某个API里面有个功能叫做readline,就可以写出上面这样的代码。
△output
然后,Bayou便知道它要召唤的技能叫做readline,随之为你输出以上代码,只要用这段代码来调用你需要的API就可以了。
不要忘了,专门给Bayou看的部分,要标上///,以示害羞。
除了调用一个或者几个API,我们还可以用API数据类型把自己的要求具体化。另外,Bayou有一个非常友好的特点,便是多模态,就算把各种不同的术语混进同一段代码,它也能看懂。
草图训练大法
毕竟,这只AI已经从大约1500个安卓应用里,学习了人类编写的上亿行Java代码。
用一种名为“神经草图学习(Neural Sketch Learning) ”的方法来训练神经网络,Bayou可以给自己想要读取的每个程序,创建一个树状结构的句法模型,称作“草图(sketch) ”。
当有人对Bayou提出要求的时候,系统会先做一个判断,感受一下自己要写的程序是怎样的。然后,就是为代码库里同类型的程序做草图。这里只识别high-level模式,而忽略所有low-level特征。
在那之后,Bayou还有一个用来理解low-level细节的模块,可以自动进行逻辑推理。它会根据第一步做出的判断,生成我们可能需要的代码。
哪怕问题没有解决,Bayou给出的代码示例或许也能帮我们提出更合适的问题。这时候再去Stack Overflow寻求答疑,疗效可能会好一些。
孩子你还小
△我有优秀的聚类能力
团队认为,Bayou非常适合为各种API编写代码示例。不过,现在的它并不十分成熟,还有一些局限性。
比如,它目前支持的API非常有限,只有java.lang,java.io和Java.util。再比如,它没办法处理通配符的多种类型。
作为一只年幼的AI,Bayou还有很长的路要走。抱着GitHub修炼的好处是,从那里识别出的模式会比较通用;缺点是GitHub上面的项目质量参差不齐。
目前,团队正在给Bayou增加一些自然语言处理技能,也想在用户体验里增加一些交互性。
调戏Bayou传送门:
http://askbayou.com/
论文传送门:
https://arxiv.org/pdf/1703.05698.pdf
这是发表在ICLR 2018的论文。不过,在5月1日的温哥华,团队可能又要端上新版本了。