一个AI程序员:GitHub Copilot

10,244 阅读8分钟

我正在参与掘金创作者训练营第4期,点击了解活动详情,一起学习吧!

什么是GitHub Copilot

想象一下,你正在写一个微信支付回调接口。写完方法名,一敲回车,后续的代码全都由copilot补充完成。不仅是关键字的自动补全,语法建议,调试建议等。而是帮助开发者更快速的完成业务代码编写。

官方效果如下:

s1tin-4v0en.gif

简而言之,GitHub Copilot 是一种 AI 工具,可根据命名或者正在编辑的代码上下文为开发者提供代码建议。

根据官方介绍,Copilot 已经接受了来自 GitHub 上公开可用存储库的数十亿行代码的训练,

它支持大多数编程语言,但官方建议使用 Python、JavaScript、TypeScript、Ruby 和 Go。

Copilot 是 GitHub 和OpenAI合作的结果, OpenAI得到了微软的大力支持。它由一个名为 Codex 的全新 AI 系统提供支持,该系统基于 GPT-3 模型。

GPT-3代表第三代 Generative Pre-trained Transformer——一种能够从简单提示生成文本序列的语言模型。Codex 源自此模型,它不仅可以处理文本,还可以生成一些最流行语言的代码。

如何使用(VSCode示例)

在VS Code拓展搜索Copilot,如下图。

image.png

image.png

然后登录到GitHub账户,需要申请使用权限。

image.png

加入候补名单后,等待启用通知就可以了。

工作场景

GitHub Copilot 会根据开发者正在编辑的代码的上下文生成多个建议。 下图是一个简单的python示例,创建一个计算数据集平均值的函数来测试 Copilot。需要写注释和函数名称。

image.png

灰色文本是 Copilot 建议的,可以通过按Tab使用。但是,如果建议不正确,可以使用 + 浏览更多建议。

示例1:将注释转换为代码

GitHub Copilot 最酷的功能之一是它能将注释转化为代码。只需创建一个描述逻辑的注释,Copilot 就会自动生成建议。当然,重点是能够描述清楚想要的内容是什么,最好的简单的英语,当写的语言不通顺,Copilot可能就很难给出合适的建议。

image.png

示例2:自动填充重复代码

这个功能就像是多数ide提供的关键字自动补全的功能,只不过Copilot将后续的代码片段都进行了填充,这个功能将会节省一部分编码时间。如下图所示:

image.png

示例3:测试代码

Copilot并没有提供测试代码,但是可以通过注释来让Copilot来提供建议测试代码。生成代码依然要去测试是否正确,但是优点胜在快快快。

image.png

示例4:生成不熟悉的代码

对开发者来说,日常编写的多数代码可能并不都是熟悉的代码,陌生的库,陌生的方法。但是对于Copilot来说,这些代码片段并不陌生,所以Copilot在这种场景下可能会更加实用,就像我在文章开头提到的,写好了接口名,后续的代码都自动填充完成。

image.png

当前进展

当前Copilot正处于测试阶段,Copilot 编写的代码并不是很好的代码,也可能是我使用的时间太短,多数生产的代码都要改动很多内容。如果使用时间够长,或许可以生产符合条件的代码。

根据 OpenAI 的论文,Codex 只给出了 29% 的正确答案。而且,它编写的代码通常重构不佳,并且无法充分利用现有解决方案来给出最佳建议。

Copilot 已经阅读了 GitHub 的整个公共代码档案,其中包含数千万个存储库,其中包括来自许多世界上最好的程序员的代码。有人会问:为什么 Copilot 会编写如此糟糕的代码?

原因在于语言模型的工作方式。它们展示了大多数人是如何编写代码的。Copilot不知道什么是正确的或什么是好的代码。GitHub 上的相当多的代码是初学者的练习项目。Copilot 提出的建议是,如果这些程序员正在编写与你相同的代码时,他们可能会写什么。

OpenAI 在他们的 Codex 论文中讨论了这一点:

“与针对下一个标记预测目标训练的其他大型语言模型一样,Codex 将生成与其训练分布尽可能相似的代码。这样做的一个后果是,此类模型可能会做对用户无益的事情”

抱怨 Copilot 编写的代码质量有点像遇到一只会说话的狗,然后抱怨它的语法不标准。可是一条狗在说话足够让人大跌眼镜了。

占用大多数开发者时间的工作,并不是编码,而是用于设计、调试和维护代码。当代码自动生成时,很容易得到更多的代码。这不一定是个问题,如果您维护或调试所需要做的就是修改自动生成代码的源代码,例如在使用代码模板工具时。

即便如此,调试时事情也会变得混乱,因为调试器和堆栈跟踪通常会指向生成的代码,而不是开发者自行编辑的代码。这意味着开发者要将额外的精力放在,生成后的代码是否正确。

众所周知,更少的代码意味着更少的维护和理解。Copilot 的代码很冗长,而且很容易生成大量代码,以至于最终可能会得到很多代码!使项目难以维护,

引发的争议

自由软件基金会 (FSF)呼吁提供解决该技术引发的法律和哲学问题的白皮书,他们认为GitHub Copilot 是不可接收和不公正的,因为开发者使用Copilot编写任意软件,可以是商业企业软件,或者付费软件。这意味着它是一种获得对他人计算能力的方法。

他们提出以下质疑,非常有趣:

  • Copilot 的公共存储库培训是否侵犯版权?合理使用?
  • Copilot 的输出产生违反 GPL 许可作品的可起诉索赔的可能性有多大?
  • 使用 Copilot 的开发人员能否遵守 GPL 等自由软件许可?
  • 开发人员如何确保他们拥有版权的代码免受 Copilot 产生的违规行为?
  • 如果 Copilot 生成的代码会导致违反自由软件许可作品的行为,版权所有者如何发现这种违规行为?
  • 训练有素的 AI/ML 模型是否受版权保护?谁拥有版权?
  • 像 FSF 这样的组织是否应该主张改变与这些问题相关的版权法?

目前官方并没有正面解释这些问题,只是欢迎大家提出问题,并且参与测试计划。

如果你对Copilot有任何看法,可以在评论区进行交流。

总结

我的看法

Copilot 是一个非常有趣的工具。刚开始使用时非常有趣,虽然给出的多数建议是错误的。但是如果使用久了就会发现它的设计优点。

毕竟Copilot还处于测试阶段,相信在正式版,现有的多数问题都会得到合理的解决。对我个人来说,我期望在使用一段时间后,Copilot能提供具有我个人风格的代码片段建议。对于这一点,我已发邮件向Copilot开发团队提出了我的想法。

对于来自社会层面的质疑,我认为是正常的。任何新兴技术在产生阶段,总会面对各种各样的质疑,解决这些质疑,是产品进化的必经之路。

作为开发者,应该持有开放的心态去面对这些新型产品。毕竟在这个内卷的时代,不进步就会被淘汰。

Copilot 会取代程序员吗?

Copilot 宣称是:开发人员的 AI 助手。

我认为它不会取代程序员。

毕竟在超级智能出现之前,机器并不难理解现实世界的问题,也很难提出解决方案,就像在很多影视作品中,都用图形验证码来讽刺低级智能。

但是,Copilot的确是当前技术条件下,一条可行的道路。自程序员这个岗位出现之后,我们在不断的优化我们的开发体验。ide,调试工具的出现,不仅优化了开发者的工作效率。在一定程度上,也降低了行业门槛,使得更多人可以体验到编程的乐趣,并创造出自己的解决方案。

也许在未来,会有更多类似Copilot的产品出现,这类产品将会是普通开发者的尚方宝剑,只要有代码基础,语言,框架等都不再是问题。

附:GitHub Copilot 键盘快捷键

  • 接受内联代码建议 -Tab
  • 关闭内联代码建议 - Esc
  • 显示下一个建议 - Alt + ] 或 Option (⌥) + ]
  • 显示上一个建议 - Alt + [ 或 Option (⌥) + [
  • 触发建议 - Alt + \ 或 Option (⌥) + \
  • 在单独的窗格中打开十个建议 — Ctrl + Enter

如果这篇文章对你有帮助,欢迎点赞关注评论!多谢啦