近几年,人工智能迅速发展,在各行各业都有所应用,特别是近两年,面向开发者的AI开发工具也是层出不穷,从这些工具中,我们看到了AI能为开发者带来的无限可能性。本系列文章主要介绍国外的Kite、Codota、TabNine、GitHub Copilot、微软IntelliCode,国内的阿里云Cosy、AIXcoder等程序员比较常用的智能编码辅助工具,并会在后续的文章中做一些更为详细的偏个人使用感受的对比评测。

上一篇我们介绍了史上最全智能代码补全工具系列之TabNine篇,本篇文章我们来看看一款近期发布的一款工具GitHub Copilot,官网主页:https://copilot.github.com/

GitHub Copilot(以下简称Copilot)是近期发布的代码智能生成插件,目前支持VSCode、JetBrains等IDE平台,不同于其他代码补全工具只提供最多一行的补全结果,Copilot能通过代码上下文以及语言描述,生成整个代码片段,无疑是开发者的编码利器。它是如何做到的呢?本系列上期文章提到的TabNine使用的是GPT-2深度学习模型,而Copilot使用的是OpenAI据说烧了数千万美元研发出来的GPT-3模型,Copilot在GPT-3模型基础之上通过对GitHub的开源代码进行学习,得到了Codex模型,该模型具备强大的代码生成能力,但是由于该模型非常庞大,需要有足够的基础设施支撑,所以Copilot目前只能通过邀测的形式小范围试用,从FAQ中的信息显示,Copilot未来不太可能会大面积免费开放,所以喜欢该工具的开发者需要做好掏钱的准备。

支持功能

官网演示

如下图所示,我们仅需要输入代码的功能描述以及代码的方法名称,Copilot会自动识别代码的上下文,等待2~3秒即可生成完整的方法片段。

github copilot怎么使用(github copilot教程)(1)

官网的演示示例中提到了3个使用场景:

1、根据代码注释生成代码片段

github copilot怎么使用(github copilot教程)(2)

2、自动填充具备固定模式的重复代码

github copilot怎么使用(github copilot教程)(3)

3、自动生成单元测试用例,特别是生成Mock数据

github copilot怎么使用(github copilot教程)(4)

使用体验

Copilot的模型非常强大,其原理本质上跟TabNine是相似的,但是Copilot的代码生成效果要好很多,毕竟模型大小不是一个层次的。Copilot代码生成结果的展现形式跟其他工具都不同,它采用了内联的方式,这种方式非常直观的展示的代码生成后的样子,适合多行代码片段的展示,但是这种方式不适合推荐结果比较多的时候,只能通过快捷键切换结果,而且如果开启了自动触发,在写代码时经常会在我不需要的时候出现,把正在编写的代码挤到下面去,这对我的日常编码是一种打扰。

下面我们来看几个Java示例:

1)用同样的示例,Copilot能将整行进行补全,并且自动将inputStream填充到参数中。

github copilot怎么使用(github copilot教程)(5)

2)Copilot也能自动识别到上文中出现过的workbook变量及其getSheetAt方法,没有发生语法错误的问题。

github copilot怎么使用(github copilot教程)(6)

3)虽然在上一个例子中补全效果较好,没有出现语法错误的问题,但是Copilot依然会在很多情况下生成存在语法错误的代码片段。如下图所示,StringUtils类是在本地工程中创建的,类下面只有一个readTestFile方法,然而Copilot却生成了print方法,因为Copilot是根据数亿的开源代码学习到的,不能及时的去学习本地工程的代码信息,所以本质上跟TabNine一样是会存在语法错误的问题,只是由于模型更强大,所以错误的概率更小,但是一旦涉及到本地工程的代码,错误的概率就会非常高。

github copilot怎么使用(github copilot教程)(7)

4)用Copilot写单元测试是非常方便的,它能帮助我生成很多测试数据,减少我Mock数据的烦恼。

github copilot怎么使用(github copilot教程)(8)

5)Copilot方法级的代码生成也有很多错误的时候,比如生成读取XML文件的代码,结果生成的是读取Excel的代码,可能是因为类开头import了较多Excel相关的API。

github copilot怎么使用(github copilot教程)(9)

如果我把import去掉,那么它就无法生成了,只会根据注释生成另一段注释。

github copilot怎么使用(github copilot教程)(10)

有时候它生成的代码会陷入无限重复,比如下图中陷入了生成Insert的死循环。

github copilot怎么使用(github copilot教程)(11)

总的来说,GitHub Copilot是一款非常好用的代码生成工具,适合生成通用的工具代码、leetcode算法、单元测试等场景的高频代码,而对业务代码的生成则依然存在语法错误的问题,可惜Copilot只提供了远程服务模式,并且基于Copilot当前的技术路线也不太可能提供离线模式,这点可能会带来潜在的隐私及代码数据的泄露风险,希望以后收费不会太贵。