作者:熊唯,黄飞 ,腾讯 PCG/QQ研发中心/CV应用研究组
AI 如果真的可以写代码了,程序员将何去何从?近几年,NLP 领域的生成式任务有明显的提升,那通过 AI 我们可以让代码自动完成后续补全吗?本文主要介绍了如何使用 GPT2 框架实现代码自动补全的功能。
如果 AI 真的可以自己写代码了,程序员将何去何从?
我去年做过一个代码补全的小功能,打包为 androidStudio 插件,使用效果如下:
代码补全模型预测出的结果有时的确会惊吓到我,这也能学到~? 那如果给它见识了全世界的优秀代码,再给足够量级参数和优秀的模型框架,真的可以实现需求作为输入,直接输出代码吗?
"我的需求讲完了,你的代码呢?" 希望可以看到这一天。
代码补齐功能有其他优秀插件也已实现,比如 tabnine,Kite 和国产的 aixcoder。本文主要介绍下代码补全功能需要实现的整套流程。主要包括数据,算法和工程。
数据
众所周知,算法工程师大部分时间都在处理数据。
深度学习是使用大数据训练模型的一个过程,数据是很重要的一个模块。人是会累的,休息不好还导致记忆不好。AI 是你给多少数据它就能存储接收多少数据,学不到信息那是人的错,给的数据不好或者算法设计不好。所以我们先尽可能多的准备好训练数据。
1、数据采集 本文的目的是代码补全,训练数据就是代码段。考虑到每种语言风格和语法都不一致,所以单个模型只针对一种代码语言。
我使用的训练数据主要来源于 GitHub,编写了一个简单的爬虫代码,指定语言后根据 stars 的排序下载工程。
Github 的 search API 官方地址:
https://developer.github.com/v3/search/
2、数据清理 直接下载的数据肯定是不能直接用的,我们还需要对数据进行清理。
首先,我们的训练数据只需要工程中的代码文件,以 java 工程为例,我们只保留.java 结尾的文件,其他文件可剔除。
其次,我的代码补全目标是代码段,不针对注释功能。而且对于代码补全训练时,我们是会给定一定范围的上文,如果存在注释段会占用有效代码信息。另外注释除英文外其他字符不在我的训练 vocab 范围内,所以需要对代码中注释和日志进行清理。
1.删除代码行中存在除符号和英文外的字符
2.删除日志行
3.删除注释行,主要针对以下格式
/* 注释文本*/
/** 注释段落 */
// 注释文本
code //注释 经过以上数据清理后,得到纯代码数据。
3、数据编码 得到了训练数据后还需要把代码文本进行编码。本文使用的是 bpe(byte pair encoder)字节对编码,主要为了数据压缩。bpe 简单理解为将一个单词