探索生成式 AI
生成式 AI,尤其是 LLM(大型語言模型),已在公眾意識中爆炸開來。與許多軟體開發人員一樣,我對可能性感到好奇,但對於從長遠來看它對我們的職業意味著什麼並不確定。我現在已在 Thoughtworks 擔任一個角色,協調我們的工作,了解這項技術將如何影響軟體交付實務。我將在此處發布各種備忘錄,描述我和我的同事正在學習和思考的內容。
較早的備忘錄
工具鏈(2023 年 7 月 26 日)
中位數 - 三個函式的寓言 (2023 年 7 月 27 日)
內嵌協助 - 何時更有用?(2023 年 8 月 1 日)
內嵌式協助 - 它如何造成阻礙?(2023 年 8 月 3 日)
編碼助理並未取代結對程式設計(2023 年 8 月 10 日)
TDD 與 GitHub Copilot(2023 年 8 月 17 日)
GenAI 與其他程式碼產生器有何不同?(2023 年 9 月 19 日)
最新備忘錄:如何解決編碼助理的不可靠性
2023 年 11 月 29 日
編碼助理實用性的其中一個折衷方案是其不可靠性。基礎模型相當通用,而且基於大量的訓練資料,與手邊的任務相關或不相關。此外,大型語言模型會編造事情,它們會「產生幻覺」,這是常見的說法。(旁注:關於「產生幻覺」一詞有很多討論,關於它實際上並非用來描述此現象的正確心理學隱喻,但也關於一開始使用心理學術語,因為它將模型擬人化。)
這種不可靠性會產生兩個主要的風險:它可能會對我程式碼的品質產生負面影響,而且可能會浪費我的時間。考量到這些風險,快速有效地評估我對編碼助理輸入的信心至關重要。
我如何判斷對助理輸入的信心
以下是我嘗試評估建議的可靠性和使用風險時,通常會浮現在腦海中的一些問題。這適用於輸入程式碼時的「自動完成」建議,以及聊天機器人的回答。
我是否有快速的回饋迴路?
我越快能找出答案或產生的資訊是否有效,助理浪費我時間的風險就越低。
- 我的 IDE 能否協助我進行回饋迴路?我是否有語法突顯、編譯器或轉譯器整合、程式碼檢查外掛程式?
- 我是否有測試,或快速手動執行建議程式碼的方法?在一個案例中,我使用程式碼助理聊天機器人來協助我研究如何在 HTML 頁面中最佳顯示可折疊 JSON 資料結構。聊天機器人告訴我一個我從未聽過的 HTML 元素,所以我不知道它是否存在。但將它放入 HTML 檔案並在瀏覽器中載入,就能輕鬆確認。舉一個反例,驗證我從未聽過的基礎架構程式碼片段的回饋迴路通常會長很多。
我是否有可靠的回饋迴路?
除了 AI 輸入的回饋迴路速度外,我也會思考該回饋迴路的可靠性。
- 如果我有一個測試,我對該測試有多有信心?
- 我是自己撰寫測試,還是也使用 AI 助理產生測試?
- 如果 AI 產生測試,我對自己檢視這些測試效能的能力有多有信心?如果我正在撰寫的功能相對簡單且例行,而且使用我熟悉的語言,那麼我當然比撰寫更複雜或更大的功能有信心。
- 我在使用助理時是否與他人配對?他們將提供額外的輸入並檢視 AI 輸入,並增加我的信心。
- 如果我不確定測試涵蓋範圍,我甚至可以使用助理本身來提高我的信心,並要求它提供更多邊界案例進行測試。這就是我如何找到關鍵的遺漏測試場景 針對我在先前備忘錄中描述的中位數函數。
誤差範圍是多少?
我也會思考我正在做的事情的誤差範圍。誤差範圍越低,我對 AI 輸入的批評就會越嚴格。
- 當我引入新的模式時,我會考慮這對程式碼庫整體設計的爆破半徑較大。團隊中的其他開發人員會採用該模式,而編碼助理一旦將其納入程式碼中,也會在整個團隊中複製該模式。例如,我注意到在 CSS 中,GitHub Copilot 經常向我建議彈性盒狀配置。選擇配置方法是一個重大的決定,因此在使用此方法之前,我會想要諮詢前端專家和團隊中的其他成員。
- 當然,任何與安全性相關的事項都具有較低的誤差範圍。例如,我正在開發一個網路應用程式,需要設定「Content-Security-Policy」標頭。我對這個特定標頭一無所知,因此我首先詢問 Copilot 聊天。但由於主題的關係,我不想依賴它的答案,而是轉向網路上值得信賴的安全資訊來源。
- 這段程式碼的存續期有多長?如果我正在開發原型或一次性程式碼,我比在製作系統時更可能毫不質疑地使用 AI 輸入。
我是否需要非常新的資訊?
我需要的答案越新、越具體(例如,針對架構版本),它錯誤的風險就越高,因為我正在尋找的資訊不可用或 AI 無法區分的機率較高。對於此評估,了解手邊的 AI 工具是否僅能存取訓練資料以外的資訊也很有幫助。如果我正在使用聊天,我希望知道它是否有能力考量線上搜尋,或是否僅限於訓練資料。
給助理一個時間限制
為了減輕浪費時間的風險,我採取的一種方法是給它一種最後通牒。如果建議沒有在付出少量額外努力的情況下為我帶來價值,我就會繼續前進。如果輸入沒有足夠快地幫助我,我總是假設助理最糟糕的情況,而不是給它好處懷疑,並花費額外 20 分鐘讓它發揮作用。
想到一個例子,當時我正在使用 AI 聊天機器人來協助我產生 mermaid.js 類別圖表。我不太熟悉 mermaid.js 語法,我持續嘗試讓建議發揮作用,並認為我可能以錯誤的方式將其包含在我的標記檔案中。結果證明,語法完全錯誤,我在大約 10 分鐘後終於前往線上文件時才發現。
為助理建立角色
在準備這份備忘錄時,我開始思考為助理建立角色是否有助於負責任地使用它,並在最短的時間內完成。也許在這種情況下,將 AI 人格化實際上會有幫助?
思考各種不可靠性,我想像具有以下特質的 AI 角色
- 熱心助人
- 固執
- 見多識廣,但經驗不足(對於龍與地下城愛好者:高智力,低智慧)
- 不承認自己「不知道」某事
我嘗試使用圖片產生器進行一些提示,要求它提供熱心海狸和固執驢子的變體。以下是其中我最喜歡的一個(Midjourney 中的「熱心固執的驢子快樂書籍電腦;卡通、基於向量的平面色塊」)
你甚至可以為你的角色想一個有趣的名字,並在團隊中討論它。「Dusty 在那次會議中是一個令人討厭的萬事通,我們不得不暫時關閉它們」,或「我很高興 Dusty 在那裡,我在午餐前完成了那項任務」。但你永遠不應該說的一件事是「Dusty 導致了那個事件!」,因為 Dusty 基本上未成年,他們沒有犯罪執照。我們有點像是最終對提交負責的父母,而「父母對其子女負有責任」。
結論
每次使用編碼助理時,情境評估清單似乎有很多要套用。但我相信我們使用這些工具的次數越多,我們就會做得越好。在編碼時,我們總是根據經驗對像這樣的多個維度進行快速評估。我發現,當我遇到上述情況時,我已經更能決定何時使用和信任助理 - 換句話說,我越觸摸熱爐。
你也可能會想,「如果 AI 助理不可靠,那麼我一開始為什麼要使用它們?」。在一般使用生成式 AI 工具時,我們必須改變思維方式。 我們不能對它們抱持與「常規」軟體相同的期望。GitHub Copilot 傳統的程式碼產生器,無法提供給你 100% 所需的內容。但在 40-60% 的情況下,它可以讓你完成 40-80% 的工作,這仍然很有用。當你調整這些期望,並給自己一些時間來了解熱心驢子的行為和怪癖時,你將從 AI 編碼助理中獲得更多好處。
感謝 Brandon Cook、Jörn Dinkla、Paul Sobocinski 和 Ryder Dain 提供的回饋和意見。
此備忘錄是使用 GitHub Copilot 編寫的,採用 markdown 檔案。它有助於提供想法和措辭,有時當我卡住時,但建議很少會出現在最終文字中。我使用 ChatGPT 作為同義詞詞典,並為驢子找一個好名字。