每次去逛誠品書店的時候,總是會看到每層書架擺上滿滿的關於機器學習的書籍,心裡就在想這個領域的學習需求有大到這樣嗎?另一方面,每當看到學習模型的理論與方法就會感到頭暈目眩,再加上平常工作根本用不到,因此就逐漸忽略這一大面的書牆而忘了 AI 早已滲透於日常生活之中。
對於機器學習的應用最讓我印象深刻的是由 OpenAI 所開發的 Generative Pre-trained Transformer 3 生成型已訓練變換模型 3,光是念這名稱我的大腦就過載,下文還是用簡稱 GPT-3 就好XD,之所以會對它很有印象是因為看到不少關於它的應用,它可以讓人用自然的口吻與電腦溝通,其中讓我下巴掉下來的是這個:
這是設計軟體 Figma 的一個外掛,只要用文字輸入你想設計的畫面它就會自動產生介面,達到「出張嘴做設計」的最高境界,其他像是自動寫文章、寫書是基本盤,還可以設計對話機器人、自動產生遊戲裡 NPC 的腳本、寫履歷表一等堆需要產生文字的場景,並且又能以人類最自然的方式進行輸入,這比 AlphaGo 帶給我更強烈的衝擊。
於是有很多將 GPT-3 整合進 WordPress 的想法,撇開自動產生內容農場的用途,有想過 Page Builder by your voice,也就是用「說」的來編排頁面,或是從站內既有的文章內容產生 Landinage Page,但一切都只是停留在想想的階段,反倒是從來沒想過要把它整合進每天的工作:寫程式。
有不少公司開發用 AI 寫程式的工具,我有付費且實際用過的是 Tabnine,它可以在我輸入關鍵字的時候自動跳出提示,它的訓練模型是使用 GPT-2,也就是 GTP-3 的上一代,整體的使用感受我覺得比較像是程式碼片段而非 AI,有可能是當時它訓練得還不夠,再加上它跟我其他的套件發生衝突,於是就再也沒用它了。
Github Copilot
直到前陣子喵到微軟買下 GPT-3 的獨家授權,再加上於 2018 年引發爭議的 Github 收購案,現在看起來微軟花大錢買下了地球上最龐大的程式訓練資料庫,仗著富爸爸的優勢想必 Github Copilot 用起來應該的體驗應該會比 Tabnine 好上很多。
安裝的方法很簡單,首先先將 VSCode 更新到最新版本,然後在延伸模組找到 Github Copilot 的套件,會看到兩種版本,一種是穩定版跟帶有 Nightly 字樣的測試版:
想嚐鮮的話就裝 Nightly,我是怕又會跟其他套件產生衝突所以還是裝穩定版,裝上後右下角會跳出授權視窗,點下後會開啟瀏覽器前往 Github 進行授權,直到 8/22 前都還是免費的狀態,如果想先測試的話點選下面的連結即可:
完成後回到 VSCode 就可看到右下角狀態列多了一個圖示,點下去後可以設定是否要暫停 AI 功能,當在打字的時候它會轉圈圈代表它正在從伺服器取得建議的結果:
搞定後我們就來測試看看吧~
WordPress 的應用場景
我測試了幾個在開發 WordPress 常用的功能:
WP_Query
依照官方的建議我盡量用英文來進行模組,首先在註解的地方輸入 get latest 10 posts,按下 Enter 後 Github 會以反灰的文字顯示建議結果,如果確定要的話按下 Tab 鍵:
看起來是滿酷的,它直接跳出 WordPress 的 get_posts() 函式,並且還正確帶入兩個參數 numberposts 以及 post_type,我把條件再往上加,輸入 get latest 10 posts and category is new:
參數 category 是正確的沒錯,可惜這個參數接收的是數字,因此傳入 news 是沒有作用的,於是我改用 WP_Query 來測試看看,輸入 wp query latest 10 posts and category is news:
按下 Tab 後再按 Enter,它就會接續提示可能的寫法:
出現這結果讓我抖了一下,完全正確無誤,這除非是自己寫的不然光靠一些程式碼片段工具無法是無法這麼精準的預測我提供的條件,然後最扯的部分是這個,在我準備打註解時它就提示我接下來要 loop:
按下 Tab 後再按 Enter 就完成了迴圈:
這個行為讓我驚為天人,這代表它有預測的功能,根據你接下來會寫的程式來提供合適的建議給你,雖然少了 if( $query )
的判斷,但還是非常厲害。然後最扯的部分來了:
對,你沒看錯,用中文寫註解一樣會出現提示,而且註解裡面的文字也是它自己提示的,所以我真正要打的就只有 Tab 跟 Enter 而已,然後我異想天開啟用了 Mac 的聽寫功能,我的媽呀,我真的是出一張嘴在寫程式了~
建立自定義文章與分類
一樣,完全難不倒它:
但當我試著把兩個行為合併在一個句子中時,它只會跳出第一個行為的建議,像是我給了以下指示:
所以盡量只在一個註解中描述一件事會比較準確,而這也符合程式設計的單一職責原則,不要把一堆事情塞在同一個函式之中。
新增 WooCommerce 金流
接下來來點更困難的:WooCommerce 的金流串接。串接金流通常會需要繼承 WooCommerce 的 WC_Payment_Gateway 類別,然後提供一些基本設定像是金流的 ID 與描述,看看它有沒有辦法自動把這個類別建立出來,結果如下:
看起來這樣的敘述範圍太廣了,我們改一下註解:
當我具體的說我要建立一個繼承 WC_Payment_Gateway()
的類別時,它就能很明確的給我一個範例,雖然提示的內容不知為何只出現到一半,而且等待的時間跟上面的比起來慢了大概五六秒左右,但還是能有一個基礎的框架來改寫,不得不說這真的超狂的!!!
感想
實測了一陣子之後真的被它所提供的功能驚艷到,尤其是預測的機制更是其他程式碼片段工具無法比擬的,但還是有發現一些狀況以及非技術相關的議題需要被深入探討:
1. 需要有網路的情況下才能使用:
要能回饋正確的提示必須要有超級大的資料量,而要從如此大規模的資料中演算出我們要的東西,這樣的運算能力靠個人電腦應該是遠遠不足的,因此每次 Copilot 的建議結果都必須要從伺服器回傳,萬一網路不夠快的話就會有一點等待的時間。
如果你是打算全程都要靠著它來寫程式的話這樣的反應速度我覺得反而會拖累打字的節奏,比較好的作法是可能當作是一個輔助的工具來減少去 Google 爬答案的時間,然後平常勤於累積自己的程式碼片段才不會在沒網路的時候就 GG 了。
2.提示結果不完整
就如同上面我測試 WooCommerce 金流的狀況一樣,有時候當提示結果太長時會無法完整顯示,因此盡可能縮小使用範圍,像是只做一件事情的函式效果就會非常不錯。
3.訓練資料的道德議題
Tabnine 有一個 Code Privacy 的頁面在說明它們機器人的訓練資料全都是從 Github 公開的存放庫中而來,他們不會(應該也沒法,除非你授權)存取私人的存放庫來作為訓練資料,但使用 Copilot 需要你的 Github 帳號授權,也就是說你的私人存放庫也會成為它的訓練資料之一。
這就會造成一個問題:假設透過 Copilot 產生出來的程式碼是別人有簽署保密協議的軟體,而你的軟體因為用了這段建議的程式碼,會不會造成智慧財產權的侵犯?另一方面,也有開發者質疑這是在佔開源軟體的便宜,微軟利用這些開源工具來替自己謀取利潤,這是不道德的行為,關於 Copilot 的這類議題可以看到不少的討論。
從我自己的開發學習歷程來看,如果沒有前人願意在 Stackoverflow 或是 Github 上面釋出開源程式碼,我是不可能學會怎麼寫程式的,而今天微軟運用了這些程式碼推出一個服務來讓我可以更方便的來使用他們,基於個人立場我是非常樂意付費的。
畢竟微軟又不是直接把這些程式碼公開販售,而是透過機器學習的演算法來產出,更不用說背後要燒的主機成本,光想每一次打完註解都要發起請求來取得結果,這個流量會大到什麼程度我完全無從想像,Copilot 我不覺得是一個只要拿開源程式碼就能搞得出來的無本生意。
至於程式碼版權的問題我依舊抱持著一個傳統的觀念,不想讓人知道的東西就不要放上網路,如果你今天開發的東西有簽署保密協定,那就放在內部的版控系統或是自建 Git,要相信大企業不會拿你的資料去做事,我覺得還是靠自己比較實在,然後最重要的 Copilot 只是輔助,它建議的程式碼不一定可以 Work,尤其是安全性的處理,因此還是要有自己的判斷才行。
你已經有在使用 Copilot 了嗎?你的使用心得如何?有什麼暗黑用法的話記得跟我分享下XD,我們下週見!