用 AI 來輔助寫程式:直接給你整個函式的 GitHub Copilot

| | 0 Comments| 11:27

GitHub Copilot(官網)是 GitHub 在 2021 年六月發布,一個透過 OpenAI(官網)的 Codex 系統(官網、應該是基於 GPT-3)來完成的 AI 程式輔助開發系統。

以往的程式輔助系統,大部分都是很局部的自動完成,例如自動完成要呼叫函式名稱、或是變數名稱;雖然算是很有幫助,但是其實相對侷限。

而 GitHub Copilot 則是透過深度學習技術,大幅強化了自動完成的能力,甚至變成可以只打註解、就給你整個函式的內容!在應用上的空間,算是提供了相當的程度。

由於之前他所支援的開發環境是以 Visual Studio Code 為主,所以 Heresy 沒有下去玩;而前一陣子,他則是推出了 Visual Studio 2022 的延伸模組了!所以 Heresy 就把它裝起來試試看了~

他的網址是:https://marketplace.visualstudio.com/items?itemName=GitHub.copilotvs,由於目前還是在技術預覽的階段,所以並不是裝了就可以用,而是要先申請加入等待清單、等到核可之後才能真的使用。

總之安裝好之後,在每個文件左下角、縮放比例的旁邊會出現 GitHub Copilot 的圖示,點選之後會出來選單,可以做控制。

可以看到,他可以針對專案、使用的語言,來決定使否要啟用。

第一次啟動後,他會跳出一些對話框,告訴你已經把裝置啟動碼複製到剪貼簿了,然後也會自動開啟啟動的網頁,讓使用者把啟動碼貼進去、完成啟用(需要登入 GitHub)。

以個人的狀況,申請隔天就核可了,還滿快的。

完整的使用教學,則可以參考官方文件(網頁)。


基本使用

在官網上,就已經有很多動態示意圖,代表他有多厲害了;而實際上自己玩了一下後,發現在某些情境下,它的效果真的讓人覺得很訝異!

以一般的狀況來說,當透過註解來描述所需的功能後,他就會試著去提供可能的函式來讓使用者直接使用。

像這邊只輸入了「// check is power of 2」,換行後他底下就把整個函式(灰色框的部分都是 Copilot 提供的)都給你了,如果要接受這個結果的話,只要按 tab 就可以了。

而其他像是 quick sort 等知名演算法,他也可以提供對應的實作,讓開法者直接使用。

不過由於他也是以網路服務的形式來運作的,所以根據狀況,他能給出的建議不見得會很快、很即時;這個時候可以是著用 Ctrl + Alt + \ 這個組合鍵,來強制要求他處理。

Heresy 自己也碰過有的狀況要等好幾秒,甚至到最後都沒辦法給出建議的狀況,這點就不知道以後是否有可能改善了?

而如果定義了一個結構後,再用註解說要輸出這個結構,他就自動寫了一個給 ostream
用的 operator<< 出來了!

他很厲害的一點,是他不會只針對當下在修改的區塊來做分析,還會針對有用了那些 header 來做出不同的建議。

像是上面的例子如果把前面的 header 從 C++ STL 的 <iostream> 改成 C 的 <stdio.h> 的話,他提供的寫法也會跟著變成用 printf() 呢~

除了輸出之外,如果有需要,他也是可以提供對應的輸入用的版本的;但是適不適用就見仁見智了。

而除了透過註解來完成外,其實也可以直接透過函式名稱來讓他做分析、建議;像是輸入了 float average( 後,他就會提供對應的輸入引數、還有函式內容的建議了。

 

這邊也可以看到,在只有 include <vector> 的情況下,他會用 vector 來當輸入(不過沒加 const);而如果有 include <span> 的話,他則會用 span 來做為輸入型別。

實際上,以 C++ 來說,個人是覺得 GitHub Copilot 給的建議會根據 header
做出很大的變化;所以如果真的要用的話,比較好的做法應該是先把自己要用、或是能用那些第三方的函式庫都先 include 進來,這樣他給的結果會比較好


連續性內容補足

而除了這種表達出明確意涵的方法外,他也可以透過前面連續性的內容,來補足後續的內容;比如果這邊想寫個 HTML 特殊字元的對應表,在只打了兩項後,他就可以給出後續的建議了:

不過,是否完全適用…好像很難說?


其他

除了上面都給很大一段的建議外,Copilot 實際上也會針對單行的內容給出完成的建議,甚至是註解的內容它都會試著去幫忙完成;這部分感覺上就有點像是在用 Google 搜尋的時候,輸入內容會給使用者後續的建議的狀況了。

另外,個人覺得出乎意料的一點,是他也可以處理中文的註解!像下面就是一個例子:

這邊可以看到,他算是很完美地使用 std::filesystem 完成了「列出所有資料夾」這個函式!

另外,如果有對預設提供的結果不滿意,也可以用「Alt + .」這個組合鍵試試看讓他提供別的方案;在按下 Ctrl +Alt + Enter 後,也可以開啟一個 GitHub Copilot 的視窗,來顯示可能的方案;下面就是一個例子:

不過感覺上,他好像最多都只會有三個候選就是了?


一些失敗的例子

前面都算是比較成功的例子,但是在某些狀況下,也會得到不進理想的結果。

比如果,想要靠它來寫一個下載檔案的函式,如果先 include 了 Boost 的 ASIO 的話(之前自己的寫法),就會變成下面這種狀況:

可以看到,內容基本上應該是正確的 ASIO 的 Http 存取方法,但是內容卻不完整。
(題外話,他還可以對應 C++ 的 namespace alias)

實際上,感覺上 Copilot 應該是有字數的上限,在不少內容過長的情況下,都可以看到會出現中斷的問題。這點就不知道是不是系統設計上的限制了?

而個人覺得比較搞笑的是,如果在沒有 include 相關 header 的狀況下,他給的建議則是用 system() 去呼叫 wget 來下載~ XD

然後更搞笑一點,在幾乎空的檔案裏面、如果是很含糊地寫了想要做影像偵測呢?

恩,他就只要你先去 include OpenCV 了! XD

此外,有的時候他也會去使用一些外部(沒有 include)的函式庫,或是產生出無法正確編譯、甚至內容上看來就不正確的程式;像是下面就是明明要他銳利化,結果不知道為什麼卻去呼叫 Gaussian Blur 的狀況… o_O

所以,如果真的要用的話,最好還是要檢查一下他給的內容到底是什麼。


以目前玩了一陣子的感想…

GitHub Copilot 這種 AI 輔助程式開發,在特定的狀況下,應該確實會對程式開發有一定的幫助;他基本上可以用更方便的方法來產生基本的程式碼區段,讓開發者來做後續的修改。在特定狀況下,這的確是可以大幅減少程式碼的輸入、加速開發的!

但是相對地,個人覺得 Copilot 的反應速度不算穩定,有的時候沒能在預期的時間內給出建議、反而會讓人覺得有點煩躁就是了。

而在某些不確定 API 用法的情況下,甚至可以透過註解、函式名稱,就讓他提供一個「可能」的使用範例出來。而如果夠普遍、夠單純的狀況下,他提供的東西也確實是有參考價值的。

某方面來說,他基本上算是幫你省去了去 GitHub、Stack Overflow 找範例的功夫,而且還直接針對你當下的程式碼去調整,調成幾乎可以直接編譯的狀況(這個不一定)。

不過對應的缺點,就是你拿到的程式碼也不知道是哪來的,如果想要知道細節、或是去找原始的作者,可能還不好找。

而實務上,由於 GitHub Copilot 是一個雲端服務,所以在使用的時候,基本上是會把正在撰寫的程式碼內容傳遞給 GitHub 做推論的

雖然理論上這些在 GitHub 會是機密資料,只有限定的人員可能碰到,但是基本上就是有程式碼外洩的風險了;所以如果是在企業內、或是程式碼有高度機密性的話,那是否還可以使用呢?那就自己看著辦吧~

至於之後會不會有機會將 AI 模型釋出到使用者的電腦上執行、或是允許自建伺服器呢?這個就還有待觀察了。


而另一方面,個人也會擔心以後會不會因此有更多可以動,但是寫的人不知道自己在幹嘛的程式出現。

因為實際上,在極端的狀況下,開發者確實有可能只靠著註解和 Tab 就寫完整個可以動的程式的。

像下面就是透過 Copilot 寫出一個可以正確運作的 OpenCV 程式的過程:

這個流程除了一開始的殼之外,Heresy 自己輸入的就只有中文註解,還有按 tab 去接受他的建議了…

在概念上,架構較為簡單的程式,搞不好都是可以靠「精準的註解」、然後不停地按 Tab 鍵來寫出來可以用的程式的?不過像是 OpenGL 這種架構比較複雜的程式大概就很難了。
(右圖是用 O RLY Cover Generator 產生的 :p)

以往複製來的程式碼好歹還得針對自己的變數、環境修改,這過程大多還得掃過一輪,現在連這部分都可以省了…

所以假設開發者不在意的話,他真的可以在完全搞不懂裡面在幹嘛的情況下,寫完一個可以用的程式…

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *