整理 | 鄭麗媛
當 GitHub 在 6 月宣佈正式以每月 10 美元的價格出售 Copilot時,雖有部分人控訴 GitHub 搞「價格雙標」,但多數程式設計師還是一致認為:每個月花 10 美元買一個會自動寫程式碼的 AI 程式設計「神器」是值得的。
然而,要是這個神器突然「啞巴」了呢?上個月,一位名為 Hugo REY 的使用者在 GitHub 上發起了一個討論:「我的部分程式碼讓 Copilot 崩潰了」。


突然「啞巴」了的 Copilot
作為基於 OpenAI Codex 演算法之上構建的自動編碼輔助工具,GitHub Copilot 被許多程式設計師視為最佳「程式設計神器」的優勢在於:Copilot 可查看當前檔案中現有的程式碼/註釋,結合上下文語義,自動推薦/生成一行或多行程式碼供其選擇,很大程度上解放了程式設計師的雙手。甚至隨著時間的推移,Copilot 還能在程式設計師接受或拒絕建議的過程中不斷學習,變得更加智慧全面。

以上一切優點的前提,是 Copilot 會自動生成程式碼建議——但 Hugo REY 指出,他用的 Copilot 經常突然就「啞巴」了。
「我這陣子在用 Copilot,挺好用的,但不知道為啥老是用 2 分鐘它就不再給出程式碼建議了。昨天也是這樣,不過今早莫名又恢復正常了……然後現在它又不行了。」
剛開始,Hugo REY 認為問題可能在 Copilot 上,因此他試了很多種方法,包括:在擴展程序中重新登入、重新載入、重新安裝、重啟 VS Code、重啟計算機,還試著檢測 Copilot 是否會對其他檔案/語言給出建議。
感到納悶的 Hugo REY 在經過以上反覆嘗試後,最終推測可能是他寫的程式碼不小心給 Copilot 搞「崩」了。
//descriptions is a global object export function description(name,age,gender,stats){
var descriptionGenerated="";
//wealth category
var familyType="";
if (stats.wealth>=8) familyType="rich";
else if(stats.wealth>=6) familyType="aisée";
else if(stats.wealth>=4) familyType="modeste";
else familyType="pauvre";
//baby description
if(age<=3)
{
//get random baby description
var descriptionId = Math.floor(Math.random()*descriptions.template.baby[gender].length);
descriptionGenerated = formated(descriptions.template.baby[gender][descriptionId],{name:name,age:2,face:"test",eyes:"",familyWealth:familyType,future:"nul"});
}
//standard description
return descriptionGenerated;
}
更具體一點的話,以下這部分程式碼應該就是「罪魁禍首」。
//baby description if(age<=3){
//get random baby description
var descriptionId = Math.floor(Math.random()*descriptions.template.baby[gender].length);
descriptionGenerated = formated(descriptions.template.baby[gender][descriptionId],{name:name,age:2,face:"test",eyes:"",familyWealth:familyType,future:"nul"});}
本來 Copilot 應該在這段程式碼之後給出建議的,但 Hugo REY 按下回車之後卻無事發生,日誌顯示以下內容:
[INFO] [default] [2022-07-10T07:59:07.641Z] [fetchCompletions] engine https://copilot-proxy.githubusercontent.com/v1/engines/copilot-codex[INFO] [default] [2022-07-10T07:59:07.737Z] request.response: [https://copilot-proxy.githubusercontent.com/v1/engines/copilot-codex/completions] took 96 ms
所以,儘管定位出了導致 Copilot 崩潰的程式碼具體位置,但 Hugo REY 還是不理解這段程式碼到底有什麼問題。他將這些細節及問題都發布到了 GitHub 上,希望廣大開發者能為其答疑解惑。

「gender(性別)」是敏感詞?
起初,Hugo REY 提出的這個問題並未引起開發者們的注意,直到昨天一位名為「DenverCoder1」在仔細閱讀程式碼後才推測出了問題所在:
這個問題可能在於你的程式碼裡使用了「gender(性別)」一詞。
很不巧的是,Copilot 有一個內容過濾器,導致它不會對涉及「gender(性別)」的程式碼提出任何建議。
我希望未來 Copilot 開發團隊能解決這個問題。
顯然,在許多開發者看來,這個原因有些出人意料、甚至有些離譜,但有開發者測試後發現,真相確實如此。
我剛剛測試了一下,我可以確認,Copilot 確實會拒絕給出有關性別的建議。我知道很多人都認為這很荒謬,但細想後就會意識到,一旦 Copilot 對此給出建議,微軟將面臨兩種公關噩夢。
1、如果 Copilot 提出了一個暗示性別是二元(只有男性和女性)的建議,某個特定社區必將爆發抗議,之後新聞界就會開始炒作關於微軟如何用程式碼強制執行性別觀點的話題。
2、如果 Copilot 提出了一個暗示性別是非二元的建議,另一個特定社區也肯定會爆發抗議,然後新聞界就會開始炒作另一個話題……
對於這種說法,很多開發者還是無法接受 Copilot 僅因「gender(性別)」這個詞就失效了。他們認為,既然最終的程式碼選擇權在使用者手裡,那 Copilot 該生成的建議還是可以生成的:
「Copilot 是一款面向成年人的產品,你可以讓它生成該建議的內容,因為成年人應該都能理解什麼是機器學習吧?最終將 Copilot 生成的建議遷怒到微軟頭上的怕不都是傻子吧。」
同時也有人指出,在 Copilot 中設置內容過濾器這個行為本身就有問題:
「大家都在關注 Copilot 就‘gender(性別)’一詞上觸發其內容過濾器的愚蠢程度,但對我來說,真正的問題在於 Copilot 為什麼會有一個內容過濾器?這顯然是不受歡迎也不必要的。」
那麼在你看來,作為 AI 自動程式設計工具的 Copilot,其中是否應該設置內容過濾器?因涉及敏感詞就「失效」的設定又是否合適?
參考連結:
https://github.com/orgs/community/discussions/20273
https://news.ycombinator.com/item?id=32338469