近幾年,人工智能迅速發展,在各行各業都有所應用,特别是近兩年,面向開發者的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秒即可生成完整的方法片段。

官網的示範示例中提到了3個使用場景:
1、根據代碼注釋生成代碼片段
2、自動填充具備固定模式的重複代碼
3、自動生成單元測試用例,特别是生成Mock資料
使用體驗
Copilot的模型非常強大,其原理本質上跟TabNine是相似的,但是Copilot的代碼生成效果要好很多,畢竟模型大小不是一個層次的。Copilot代碼生成結果的展現形式跟其他工具都不同,它采用了内聯的方式,這種方式非常直覺的展示的代碼生成後的樣子,适合多行代碼片段的展示,但是這種方式不适合推薦結果比較多的時候,隻能通過快捷鍵切換結果,而且如果開啟了自動觸發,在寫代碼時經常會在我不需要的時候出現,把正在編寫的代碼擠到下面去,這對我的日常編碼是一種打擾。
下面我們來看幾個Java示例:
1)用同樣的示例,Copilot能将整行進行補全,并且自動将inputStream填充到參數中。
2)Copilot也能自動識别到上文中出現過的workbook變量及其getSheetAt方法,沒有發生文法錯誤的問題。
3)雖然在上一個例子中補全效果較好,沒有出現文法錯誤的問題,但是Copilot依然會在很多情況下生成存在文法錯誤的代碼片段。如下圖所示,StringUtils類是在本地工程中建立的,類下面隻有一個readTestFile方法,然而Copilot卻生成了print方法,因為Copilot是根據數億的開源代碼學習到的,不能及時的去學習本地工程的代碼資訊,是以本質上跟TabNine一樣是會存在文法錯誤的問題,隻是由于模型更強大,是以錯誤的機率更小,但是一旦涉及到本地工程的代碼,錯誤的機率就會非常高。
4)用Copilot寫單元測試是非常友善的,它能幫助我生成很多測試資料,減少我Mock資料的煩惱。
5)Copilot方法級的代碼生成也有很多錯誤的時候,比如生成讀取XML檔案的代碼,結果生成的是讀取Excel的代碼,可能是因為類開頭import了較多Excel相關的API。
如果我把import去掉,那麼它就無法生成了,隻會根據注釋生成另一段注釋。
有時候它生成的代碼會陷入無限重複,比如下圖中陷入了生成Insert的死循環。
總的來說,GitHub Copilot是一款非常好用的代碼生成工具,适合生成通用的工具代碼、leetcode算法、單元測試等場景的高頻代碼,而對業務代碼的生成則依然存在文法錯誤的問題,可惜Copilot隻提供了遠端服務模式,并且基于Copilot目前的技術路線也不太可能提供離線模式,這點可能會帶來潛在的隐私及代碼資料的洩露風險,希望以後收費不會太貴。
GitHub Copilot就為大家介紹到這裡,文中如有纰漏歡迎指正,有興趣的小夥伴可以在IDE插件市場通過搜尋GitHub Copilot安裝體驗,歡迎大家在評論中交流回報。本系列下一期将為大家帶來微軟的IntelliCode,敬請期待!