是成就還是削弱?AI程式碼生成工具與程式設計師的「相愛相殺」

機器之心發表於2022-10-01
程式設計師註定要被取代嗎?自從 OpenAI 的大規模語言模型 GPT-3 展示其基於簡單的書面指令建立 HTML 網站這一驚豔的能力以來,計算機程式設計社群便一直被該問題籠罩著。

自那之後的幾個月裡,更是出現了可以根據自然語言描述(口頭或書面人類語言)編寫簡單但完整的計算機程式以及加快程式設計師工作程式的自動程式設計助手。AI 會在多大程度上取代或增強程式設計師的工作呢?
圖片
IEEE Spectrum 就此諮詢了一些專家,得到的壞訊息是程式設計或許註定要被取代。但也有好訊息,即在可預見的未來,計算機程式設計和軟體開發似乎仍將是一項人類參與度極高的工作。與此同時,AI 賦能的自動程式碼生成透過允許在更短時間裡編寫更多程式碼,從而越來越加速軟體開發。

亞馬遜 AI 服務副總裁 Vasi Philomin 表示,「我不相信 AI 會完全取代人類開發者。AI 工具可以將程式設計師從日常任務中解放出來,但計算機程式設計的創造性工作仍將繼續存在。」

如果有人想要成為一名開發者,但 10 年後,他們並不一定需要學習一種程式語言。相反,他們需要理解建立計算機程式的語義、概念和邏輯序列,這會將軟體開發開放給更廣泛的人群。

計算機程式設計的智慧化、自動化程度越來越高

當 1940 年代電子計算機程式設計開始時,程式設計師使用數字機器碼編寫。直到 1950 年代中葉,美國傑出女性電腦科學家 Grace Hopper 及其 Remington Rand 公司的團隊開發了 FLOW-MATIC,它允許程式設計師使用有限的英語詞彙來編寫程式。

從那時起,程式語言越來越高效,程式設計師的工作也更加高效。

AI 編寫的程式碼成為更廣泛改變的最前沿,它允許人們完全不用編碼也能編寫軟體。現在已經有了像 Akkio 這樣的無程式碼 AI 開發平臺,人們可以透過簡單的拖放和單擊按鈕功能構建機器學習模型。微軟的 Power Platform 平臺包括了一系列低程式碼產品,使用者只需描述就可以生成簡單的應用程式。
圖片
今年 6 月,亞馬遜推出了 CodeWhisperer 預覽版,這是一個基於機器學習的程式設計助手,類似於 GitHub 的 Copilot。這兩個工具都是基於大型語言模型(LLMs),這些模型已經在海量程式碼庫中進行了訓練。當程式設計師編寫程式碼時,CodeWhisperer 和 Copilot 都會提供自動補全建議,並根據簡單的自然語言短語給出可執行指令建議。
圖片
前幾天,GitHub 對 2000 名開發者展開了一項調研,結果發現,Copilot 將一些編碼任務的時間縮短了一半,並提升了開發者對自身工作的整體滿意度。

超越程式碼自動補全並不容易

但如果想要超越自動補全,則問題在於將意圖(intent)教授給計算機。軟體需求通常是模糊的,自然語言的不準確也眾所周知。

英國人工智慧初創公司 Diffblue 致力於使用 AI 檢查和糾正程式碼,其聯合創始人之一 Peter Schrammel 對此表示,想要解決英文書寫規範中存在的歧義,則需要進行一些增量改進,在人與機器之間展開一些對話。

為了解決這些問題,微軟的研究人員最近提出像基於 LLM 的程式碼生成中新增一種反饋機制,以便計算機在生成程式碼之前要求程式設計師澄清任何歧義的地方。微軟的這一互動式系統名為 TiCoder,透過生成所謂的「測試驅動使用者意圖形式化」(TDUIF)來細化和形式化使用者意圖。

TDUIF 試圖使用迭代反饋來判斷程式設計師的演算法意圖,然後生成與程式設計師所表達意圖一致的程式碼。下圖為 TDUIF 的工作流。
圖片
論文地址:https://arxiv.org/abs/2208.05950

根據相關論文,當在 Mostly Basic Programming Problems(MBPP)基準上評估時,TiCoder 將自動生成程式碼的準確率從 48% 提升到了 85%。MBPP 旨在評估機器生成的程式碼,它包含大約 1000 個眾包 Python 程式設計問題,由入門級程式設計師來解決。

一個程式碼單元可以長達幾百行,它是程式中可以獨立維護和執行的最小部分。一套單元測試通常由數十個單元測試組成,每個單元測試包含 10 到 20 行程式碼,用來檢查單元是否按預期執行,以便當你將單元堆疊一起時,程式按預期工作。

單元測試對於除錯單個函式以及手動更改程式碼時檢測錯誤非常有用。此外,一個單元測試還可以用作程式碼單元的規範,並用來指導程式設計師編寫乾淨、無 bug 的程式碼。雖然並沒有很多的程式設計師追求真正的測試驅動開發,其中首先要編寫單元測試,但單元測試與單元往往一起編寫。

專家認為:人類程式設計師不會因 AI 程式碼生成失去工作

根據 2019 Diffblue 開發者調研的結果,開發者將大約 35% 的時間用來編寫質量控制測試,而不是編寫用於生產用途的程式碼,因此實現這部分工作的自動化就可以顯著地提高生產力。

同時,Copilot、CodeWhisperer 以及其他 AI 程式設計助手包都可以用作編寫單元測試的互動式自動補全工具。程式設計師得到編碼建議,並選擇其中效果最好的。

今年 2 月份,DeepMind 進一步使用 AlphaCode 進行完全自動程式碼生產。AlphaCode 是一種大型語言模型,可以根據自然語言指令編寫簡單的計算機程式。它使用編碼器 - 解碼器 Transformer 架構,首先對問題的自然語言描述進行編碼,然後將生成的向量解碼成解決方案所需的程式碼。
圖片
AlphaCode 概覽。圖源:https://arxiv.org/pdf/2203.07814.pdf

該模型首先在 GitHub 程式碼庫上進行訓練,直至它能夠生成看起來合理的程式碼。同時為了對該模型進行微調,DeepMind 使用了 15000 對自然語言問題描述和以往程式設計競賽中成功的程式碼解決方案,來建立一個關於輸入 - 輸出示例的專用資料集。

一旦 AlphaCode 經過了訓練和微調,它就能針對其以往未見過的問題進行測試。最後一步是生成大量解決方案,然後使用過濾演算法選出最佳的。DeepMind 深度學習團隊負責人 Oriol Vinyals 認為,他們透過對該語言模型進行了近 100 萬次的取樣,創造了很多不同的程式。

為了最佳化樣本選擇過程,DeepMind 使用一種聚類演算法將解決方案分組。聚類過程傾向於將可執行的解決方案組合在一起,使得更容易找到一小部分可能像程式設計師編寫的一樣工作的候選方案。

為了對系統進行測試,DeepMind 在流行的 Codeforces 平臺上向人類程式設計競賽提交了 10 個 AlphaCode 編寫的程式,其中解決方案排在前 54%。

在最近的一次採訪中,Oriol Vinyals 反問道,「為了生成一個程式,你是不是隻要用自然語言編寫它而不需要編碼,然後解決方案就會在另一端出現呢?」Vinyals 與其他人對此持審慎態度,認為實現這一目標需要時間,可能是數十年。

Landing AI 創始人兼 CEO、AI 知名學者吳恩達表示,我們距離一個人能夠告訴計算機編寫任意複雜的計算機程式的要求並自動完成編碼,仍然很遙遠。

但是,考慮到 AI 程式碼生成在短短几年取得進展的速度,AI 系統最終能夠根據自然語言指令編寫程式碼似乎是不可避免的演化趨勢。而手動程式設計軟體程式將越來越像手工編織毛衣。

為了給計算機提供自然語言指令,開發者仍然需要了解一些邏輯和功能的概念以及如何構造事物。即使開發者不學習特定的程式語言或者編寫計算機程式碼,但仍需要學習基礎程式設計。反過來,這將使得更多的程式設計師建立越來越多樣化的軟體。

Vasi Philomin 表示自己不相信 AI 會取代人類開發者。AI 可以消除開發者不得不做的瑣碎的、程式化的工作,使他們專注於更高價值的事情。

Peter Schrammel 也同意 AI 自動程式碼生成允許軟體開發者能夠專注於更困難和更具挑戰性的任務。不過他補充道,至少需要確認機器所理解的內容是不是人類的意圖。

他還表示,軟體開發者不會因自動化程式碼工具取代他們而失去工作,總有更多的軟體需要編寫。

原文連結:
https://spectrum.ieee.org/ai-code-generation-language-models

相關文章