基於生成式人工智慧工具,例如ChatGPT、Bard等聊天機器人的出現,以及如何將AI工具用於學術研究引發了巨大的爭議,但同時,AI生成的程式碼用於科學研究的價值被忽略了。
與ChatGPT生成文字導致的剽竊問題相比,用AI抄程式碼顯然爭議更小,開放科學甚至鼓勵「程式碼共享」和「程式碼重用」,溯源起來也很方便,例如python裡用到“import”導入依賴包就算引用。
最近Nature上發表了一篇評論文章,作者團隊討論了ChatGPT在科學程式設計領域的三個潛在能力,包括腦力激盪、分解複雜任務、以及處理簡單但耗時的任務。
文章連結:https://www.nature.com/articles/s41559-023-02063 -3
研究人員透過使用ChatGPT將自然語言翻譯成電腦可讀程式碼,探索了使用生成式AI來增強科學編碼的能力和限制。
實驗中的例子主要探討了可能與生態學、演化及其他領域相關的通用任務,研究人員發現,使用ChatGPT可以完成80%-90%的程式碼編寫任務。
如果任務被分解成小的、可管理的程式碼區塊,並帶有精確的提示作為查詢,ChatGPT可以產生非常有用的程式碼。
值得注意的是,用Google的Bard進行同樣的實驗通常會得到類似的結果,但程式碼中的錯誤更多,所以這篇文章主要使用ChatGPT進行實驗。
第一作者Cory Merow是一位量化生態學家,主要研究方向是建立機制模型來預測人口和社區對環境變化的反應。即使是最好的資料集在預測全球變遷反應方面也是不完善的,所以需要開發一些工具來結合資料來源和探索資料集,以深入了解生物系統可能發生的變化。
ChatGPT以迴歸模型GPT-3為基礎,在海量的網頁、書籍等文字上進行擬合訓練,不需要搜尋即可生成文字。
所以ChatGPT更擅長內插(interpolating,即預測與訓練資料相似的文字),而不擅長外推(extrapolating,即預測與訓練樣本不同的新文字)。
訓練集的龐大規模是一個優勢,意味著GPT-3已經看到了大量的語言模式,使其能夠內插並增加產生對人類有用回應的可能性。
不過對程式碼產生任務來說,GPT-3並不知道如何編程,只是知道程式碼看起來像什麼樣,以及哪些單字最可能出現在下一個位置,其運作原理類似自動補全,基於機率模型預測下一個程式碼區塊(chunk),區塊通常比單字(word)小,也可以叫做token
產生正確token的機率基於所有token的機率乘積,即增加預測token的數量或降低選中token的確定性會增加任務的難度,從而降低獲得正確token的機率。
因此,想要增加正確token的機率,需要縮短生成任務的長度,或是提供更具體的指令。
最後,研究人員提醒,ChatGPT產生的文字有些看起來像程式碼,但可能無法執行,所以在編碼過程中需要仔細觀察偵錯。
腦力激盪工具
#ChatGPT可以很好地檢索多個資料來源,例如在生態領域可以同時取得植物性狀、物種分佈區域和氣象資料。
雖然ChatGPT提供的數據有些是不正確的,但透過其提供的連結可以很快地校正這些錯誤。
不過ChatGPT並不能寫爬蟲從網站下載數據,可能是因為R語言的套件和底層應用程式介面(如R存取資料庫的協定)更新過快,畢竟ChatGPT的訓練資料是在2021年建構的。
ChatGPT可以在遇到特定問題時提出各種統計技術,在後續的提問中可以產生更多基於使用者假設的指導意見,並提供一份初始程式碼。
不過綜合(synthesis)過程只適用於提出並交流想法,仍然需要透過傳統的資料來源(如論文等)進行事實查核。
要注意的是,有些網站聲稱ChatGPT有能力對書寫摘要,不過從研究人員的測試結果來看,這種摘要綜合的結果完全不對,可能是因為測試用的書籍沒有在GPT-3訓練集中出現。
更難的任務需要更多的debug
ChatGPT非常擅長產生模板程式碼,在特定指令下提供一份包含少量函數的短腳本程式碼。
例如下面的範例中,研究者要求ChatGPT將四個常用函數的輸入和輸出串一起。並提供一個將此函數用於模擬資料的範例程式碼。
可以看到ChatGPT產生的結果幾乎是完美的,除錯程式碼只花了幾分鐘,不過需要在提示中非常具體地說明query,包括提供命名和用到的函數。
研究者發現,成功的關鍵在於:
1、將複雜任務分解成多個子任務,每個子任務最好只需要少數步驟即可完成,畢竟ChatGPT產生的程式碼是基於機率文字預測模型的結果。
2、ChatGPT在使用已經存在的函數時表現最佳,因為這時只涉及內插而非外推。
例如,使用正規表示式(regex)從文字中提取資訊的程式碼對於許多開發人員來說是非常困難的,不過因為已經有正規網站提供了大量線上範例,並可能出現在ChatGPT範例中,所以ChatGPT寫正規的表現還是不錯的。
3、學術界對ChatGPT最大的批評之一是其資訊來源缺乏透明度。
對於程式碼產生任務,透過指定「命名空間」(namespace),即在使用函數時明確呼叫包名可以實現一定程度的透明性。
不過ChatGPT可能會直接複製個人的公開代碼而沒有引用出來,研究人員仍然有責任驗證正確的代碼歸屬人。
同時,如果要求產生更長的腳本會暴露出一些ChatGPT的缺陷,例如偽造函數名稱或參數等,這也是StackOverflow禁用ChatGPT產生程式碼的原因。
但如果使用者提供了一組明確的執行步驟,ChatGPT仍然可以產生一個有用的工作流程模板,定義步驟之間的輸入和輸出之間的連接,這可能是用GPT-3外推產生新代碼的最有用的途徑。
目前ChatGPT還不能將偽代碼(用簡單語言描述的演算法步驟) 轉換為完美的電腦執行程式碼,但這可能離現實並不遙遠。
ChatGPT對於初學者、不熟悉的程式語言來說特別有幫助,因為初學者只會寫一些較短的腳本,調試更方便。
ChatGPT更擅長非創意任務
#ChatGPT最擅長解決的是耗時的公式化任務,可用於偵錯、偵測和解釋程式碼中的錯誤。
ChatGPT在撰寫函數文件時也非常有效,例如使用roxygen 2的內嵌文件語法,在標識所有參數及類別上非常高效,不過卻很少解釋如何使用函數。
一個關鍵的限制是ChatGPT的生成被限制在大約500個單詞,只能專注於較小程式碼區塊的生成,同時還可以產生單元測試以自動化確認程式碼功能。
ChatGPT給出的大多數建議在定義測試的結構和檢查預期的物件類別方面是很有幫助的。
最後,ChatGPT在對程式碼進行重新格式化以遵循標準化(例如穀歌)程式碼樣式方面非常有效。
ChatGPT和其他人工智慧驅動的自然語言處理工具已經準備好將開發人員的簡單任務自動化,例如編寫短函數,語法調試,註釋和格式化,而擴展複雜性取決於使用者的調試意願(以及他們的熟練程度)。
研究人員總結了ChatGPT在程式碼產生上的功能,可以簡化科學領域的程式碼編寫過程,不過人工檢查仍然是必要的,可運行的程式碼並不一定意味著程式碼能夠執行預期的任務,因此單元測試或非正式的互動式測試仍然至關重要。
在解決方案可能由人類開發,並由ChhatGPT簡單複製生成的情況下,確保正確的程式碼歸屬人至關重要。
目前已經有聊天機器人開始自動提供指向其來源的連結(例如,微軟的必應),儘管這一步還處於起步階段。
與傳統方法相比,ChatGPT提供了一種學習編碼技能的替代方法,透過將偽代碼直接轉換為程式碼,可以緩解編寫初始任務的障礙。
研究人員懷疑未來的進展將使用ChatGPT這樣的工具來自動調試編寫的程式碼,根據遇到的錯誤迭代地產生、運行和提出新程式碼,在實驗過程中,研究人員發現修正程式碼的能力有限,只有在非常具體的指令針對小程式碼區塊時才會偶爾成功,調試過程的效率遠低於人工調試。
研究人員猜想,隨著技術的進步(例如最近發布的GPT-4模型 ,據稱比GPT-3模型大10倍),自動化調試將會得到改進。
未來即將到來,現在是開發人員學習提示工程技能以利用新興AI工具的時候了,研究人員預計,使用人工智慧生成的程式碼將成為軟體開發各個方面越來越有價值的技能,這些技能是科學發現和理解的基礎。
以上是程式設計師的未來屬於「偽代碼」! Nature專欄:用ChatGPT加速科學研究程式設計的三種姿勢的詳細內容。更多資訊請關注PHP中文網其他相關文章!