如何使用GPT2框架实现代码自动补全的功能

新知榜官方账号

2023-10-19 02:16:20

如何使用GPT2框架实现代码自动补全的功能

近年来,NLP领域的生成式任务有明显的提升,那通过AI我们可以让代码自动完成后续补全吗?本文主要介绍了如何使用GPT2框架实现代码自动补全的功能。

如果AI真的可以自己写代码了,程序员将何去何从?我去年做过一个代码补全的小功能,打包为androidStudio插件,使用效果如下:

代码补全模型预测出的结果有时的确会惊吓到我,这也能学到~?那如果给它见识了全世界的优秀代码,再给足够量级参数和优秀的模型框架,真的可以实现需求作为输入,直接输出代码吗?"我的需求讲完了,你的代码呢?"希望可以看到这一天。代码补齐功能有其他优秀插件也已实现,比如tabnine,Kite和国产的aixcoder。

主要包括数据,算法和工程。数据众所周知,算法工程师大部分时间都在处理数据。深度学习是使用大数据训练模型的一个过程,数据是很重要的一个模块。所以我们先尽可能多的准备好训练数据。

数据采集:本文的目的是代码补全,训练数据就是代码段。考虑到每种语言风格和语法都不一致,所以单个模型只针对一种代码语言。我使用的训练数据主要来源于GitHub,编写了一个简单的爬虫代码,指定语言后根据stars的排序下载工程。

数据清理:直接下载的数据肯定是不能直接用的,我们还需要对数据进行清理。首先,我们的训练数据只需要工程中的代码文件,以java工程为例,我们只保留.java结尾的文件,其他文件可剔除。其次,我的代码补全目标是代码段,不针对注释功能。而且对于代码补全训练时,我们是会给定一定范围的上文,如果存在注释段会占用有效代码信息。另外注释除英文外其他字符不在我的训练vocab范围内,所以需要对代码中注释和日志进行清理。

数据编码:得到了训练数据后还需要把代码文本进行编码。本文使用的是bpe(bytepairencoder)字节对编码,主要为了数据压缩。数据编码后,代码的每个token被编码为1~N个id。模型预测到的id反编码为token即可。回车符认为是预测的终止符。

模型算法:代码补全功能就是基于GPT2框架,OPenAI官方提供了多套GPT2预训练模型。对于GPT算法,我们使用超参:12个层,768个隐藏节点,12个heads。infer阶段采用beam-search会导致整个预测过程特别耗时,所以参考了论文,采用top-ksampling,每次预测top3的结果再通过概率阈值过滤后作为最终候选输出。

工程:代码补全功能,最合适的应用场景就是上IDE。nlp模型不太适合在本机部署,最终选择了在GPU机器上部署模型,然后终端通过http请求获取预测文本显示的方案。最后一步就是如何在IDE上使用功能了。我们要开发AS的插件,需要使用IntelliJ,首先需要在本机安装配置IntelliJIDEA。好用的插件可以节省程序员很多时间,在插件实现时,我还添加了一个小的git-blame功能,实时查看指定行的git提交人。

AI能否自己写代码,达到疑犯追踪里TM那种水平,我不敢说一定不可能,但以我目前的认知是实现不了,毕竟写代码的是程序员,给算法喂数据的是程序员,算法设计还是程序员,AI连帮人类解bug的功能都还不出现!

本页网址:https://www.xinzhibang.net/article_detail-17215.html

寻求报道,请 点击这里 微信扫码咨询

关键词

代码补全 GPT2框架 AI自动写代码

分享至微信: 微信扫码阅读

相关工具

相关文章

相关快讯