隨著AI技術的快速發展,AI輔助程式設計工具正逐漸成為軟體開發流程中不可或缺的一部分。這些工具不僅可以提供程式碼建議和自動完成,還能生成測試案例、分析程式碼品質、輔助除錯,甚至自動產生程式碼檔案。這些功能的實作得益於底層生成式AI技術的進步,特別是Transformer模型的出現和應用。理解這些技術的核心概念和運作原理,對於開發者有效利用這些工具至關重要。開發者需要具備良好的程式設計基礎,並學習如何與AI工具協同工作,才能最大程度地發揮其效能。同時,也需要認識到AI工具的侷限性,例如在處理複雜邏輯和專案特定需求時的不足。
AI輔助程式設計工具的未來與開發者技能
McKinsey的研究報告指出,AI輔助程式設計工具的興起可能會改變我們進行軟體開發的方式。報告作者認為,成功的關鍵在於良好的訓練,強調最佳實踐,並深入進行諸如提示工程、程式碼標準和品質控制等實務練習。同時,也必須關注與生成式AI相關的風險。
對新手開發者的建議
對於經驗不足一年的新手開發者,建議進行額外的課程學習,涵蓋程式設計的基本原理,以提高生產力。當開發者將這些工具納入日常工作流程時,保持技能提升的動力至關重要,可以透過團隊中的資深專業人士的指導和參與社群活動來實作。這可能包括參與專門的線上論壇或定期舉行團隊會議,分享實務經驗。
職涯發展
雖然沒有確鑿的證據表明使用AI輔助程式設計工具會提升職涯前景,但一些跡象表明,這種專業技能可能會成為職場上的熱門需求:
工作清單
像Indeed這樣的求職網站上,越來越多職缺要求具備AI輔助程式設計工具的經驗,從初級開發者到高階專家皆有需求。
生產力提升
AI輔助程式設計工具因其能夠在不犧牲品質的前提下提高生產力而受到關注。對於開發者來說,這可能是一種在組織中晉升的途徑。
開發者的正面評價
開發者之間的討論表明,AI輔助程式設計工具正在受到歡迎。例如,GitHub Copilot在獨立軟體評論網站G2.com上獲得了4.5/5的高評分。
成為10倍開發者?
10倍開發者擁有相當於10個程式設計師的能力,他們是程式設計領域的佼佼者,能夠快速解決問題並提出解決方案。然而,使用AI輔助程式設計工具是否能讓你成為10倍開發者?事實上,這種可能性微乎其微。雖然這些技術可以帶來顯著的改進,但通常不會達到數量級的提升。
開發者的技能
根據McKinsey的研究報告,AI輔助開發工具的有效性往往取決於開發者的專業知識。以下是一些需要考慮的方面:
修復錯誤
儘管生成式AI可以成為可靠的助手,但它也可能出錯。開發者需要發現並修復這些錯誤。有些開發者發現自己需要與AI反覆修正,以達到精確度,而其他人則需要詳細指導工具以進行準確的除錯。
理解專案需求
AI輔助程式設計工具在編碼方面表現良好,但可能無法完全理解個別專案或公司特有的需求。這時,經驗豐富的開發者就顯得尤為重要,他們能夠指導這些工具,以獲得符合組織目標、績效目標和安全性的結果。
處理複雜任務
AI輔助程式設計工具擅長處理諸如最佳化程式碼等任務,但面對複雜的挑戰,如整合不同的編碼框架時,可能會遇到困難。在這些時刻,是經驗豐富的開發者需要捲起袖子親自處理。
第二章:AI程式設計技術的工作原理
在本章中,我們將探討AI輔助程式設計工具的內部工作原理,瞭解其背後的技術。首先,我們將簡要回顧其歷史,接著探討轉換器模型和大語言模型(LLMs),並演示OpenAI Playground的使用。然後,我們將提供一些關於如何評估LLMs的建議。
瞭解這項強大技術的能力和侷限性,將為在實際軟體專案中更聰明地使用AI輔助程式設計工具鋪平道路。
主要特點
市場上對於像GitHub Copilot、Tabnine、CodiumAI和Amazon CodeWhisperer這樣的AI輔助程式設計工具反響熱烈。各個產品的製造商都試圖展示其獨特的功能和優勢。但這些工具之間也存在一些共同的能力。表2-1總結了一些主要特點。
AI輔助程式設計工具的核心功能與運作原理
AI輔助程式設計工具的功能概述
AI輔助程式設計工具為開發者提供了多項強大的功能,徹底改變了軟體開發的流程。這些工具的主要功能包括:
程式碼建議與上下文感知自動完成
這些工具能夠根據註解和檔案上下文提供程式碼建議,推薦單行程式碼或整個函式。透過分析整個或部分程式碼函式庫,提供上下文感知的程式碼自動完成,幫助開發者更快速、準確地編寫程式碼。
程式碼範例
def calculate_area(radius):
# 計算圓面積
return 3.14 * radius ** 2
# 輸入半徑
radius = float(input("請輸入圓的半徑:"))
area = calculate_area(radius)
print(f"圓的面積為:{area}")
內容解密:
def calculate_area(radius):定義了一個名為calculate_area的函式,用於計算圓的面積。return 3.14 * radius ** 2計算圓面積的公式,其中3.14是圓周率的近似值,radius ** 2計算半徑的平方。radius = float(input("請輸入圓的半徑:"))從使用者輸入取得圓的半徑,並轉換為浮點數。area = calculate_area(radius)呼叫calculate_area函式,傳入半徑並計算面積。print(f"圓的面積為:{area}")輸出計算出的圓面積。
測試生成與程式碼分析
AI輔助工具能夠分析程式碼以生成有意義的測試案例,對映程式碼行為,並找出邊緣案例以確保軟體在發布前的可靠性。同時,它們還能分析程式碼片段、檔案字串和註解,提供可靠的程式碼預測並標記可疑程式碼。
除錯與程式碼自動檔案化
這些工具能夠識別程式碼中的潛在錯誤並提供修復建議。此外,它們還能自動新增檔案字串並增強程式碼檔案,使程式碼更易於理解和維護。
與智慧程式碼完成工具的比較
智慧程式碼完成工具(如 Microsoft 的 IntelliSense)早已存在,並透過建議、填寫和突顯程式碼片段來協助開發者。那麼,AI輔助程式設計工具與這些傳統工具之間有何不同?
關鍵區別在於,AI輔助工具由生成式 AI 驅動,不僅提供程式碼建議,還能生成檔案、規劃檔案和等多種資源。這些工具能夠根據上下文生成、修改和理解類別人類文字,使其在翻譯、摘要、文字分析和問答等任務中表現出色。
編譯器與 AI輔助程式設計工具的對比
要深入瞭解 AI輔助程式設計工具的作用,有必要先了解編譯器的運作原理。編譯器主要執行以下步驟:
- 詞法分析(Tokenization):將程式碼分解為單個 Token。
- 語法分析:檢查 Token 的組合是否符合程式語言的語法規則。
- 語義分析(錯誤檢查):確保程式碼在語義上正確,不僅語法正確,而且具有正確的含義。
- 中間程式碼生成:將高階程式碼轉換為中間表示形式。
- 程式碼最佳化:對中間程式碼進行最佳化,使其執行更高效。
- 程式碼生成:將最佳化的中間程式碼轉換為機器程式碼或組合語言。
- 連結與載入:將多個程式碼片段和函式庫組合成單一可執行檔,並將其載入記憶體中執行。
相較之下,AI輔助程式設計工具並不像編譯器那樣「理解」程式語言。它們利用 AI 技術根據現有的大量程式碼資料猜測並建議程式碼片段。編譯器隨後會對這些程式碼進行處理,使其能夠在機器上執行。
AI輔助程式設計工具的現況與未來
程式碼檢查與錯誤處理
AI輔助程式設計工具在程式碼檢查方面表現良好,但仍無法完全媲美編譯器的錯誤檢查能力。這些工具能夠捕捉常見的語法錯誤,如缺少分號、函式名稱拼寫錯誤和括號不匹配等,並迅速提出修正建議。此外,它們還能在避免常見程式設計陷阱方面提供幫助,例如提醒開發者在開啟檔案後正確關閉,或建議更有效率的陣列遍歷方法。
內容解密:
- 錯誤檢查能力:AI工具能捕捉語法錯誤,但無法取代編譯器的嚴謹檢查。
- 常見陷阱預防:AI工具能提醒開發者避免常見錯誤,提高程式碼品質。
- 邏輯錯誤處理:AI工具能在邏輯錯誤方面提供替代方案或建議,協助開發者進行問題解決。
程式設計能力的層級劃分
Quinn Slack在2023年10月提出了一個評估AI輔助程式設計工具能力的框架,將其劃分為五個層級(Level 0至Level 5)。這個框架有助於理解AI工具的能力和侷限性。
Level 0:無AI輔助
- 傳統的程式設計方式,開發者手動完成所有工作,無AI介入。
Level 1:程式碼補全
- AI開始介入,提供單行或區塊的程式碼補全,開發者仍主導整體程式設計。
Level 2:程式碼建立
- AI能夠建立更長的程式碼段,例如設計API或修復現有程式碼,需人類監督。
Level 3:監督自動化
- AI開始主導程式設計,能夠處理多項任務並與人類協同工作。
Level 4:完全自動化
- AI能夠獨立處理複雜任務,無需人類最終確認,展現出高度的自主性。
Level 5:AI主導的完全自主
- AI不僅遵循人類指令,還能自行設定目標,代表著AI能力的極大突破。
目前,像Copilot這樣的工具大致處於Level 3的水平。這個框架有助於我們理解AI輔助程式設計工具的發展現狀和未來趨勢。
生成式AI與大語言模型(LLMs)
瞭解生成式AI和LLMs的基本原理,有助於更有效地評估AI輔助程式設計工具的能力和侷限性。透明度是技術被廣泛採用的關鍵,而在程式設計領域,可靠性和責任感是至關重要的。
生成式AI的演進
生成式AI的發展始於數十年前,早期的例子包括麻省理工學院教授Joseph Weizenbaum在1960年代中期開發的ELIZA聊天機器人。ELIZA能夠模擬與心理治療師的對話,儘管其根據規則的演算法相當基礎,但仍讓許多人誤以為是在與真人交流,這種現象被稱為「ELIZA效應」。
內容解密:
- ELIZA聊天機器人:早期生成式AI的代表,展示了人類對電腦程式的擬人化傾向。
- 生成式AI的發展:從早期的簡單規則基演算法發展到如今複雜的LLMs,技術進步顯著。
- 透明度與信任:瞭解生成式AI和LLMs的工作原理,有助於建立對AI輔助程式設計工具的信任。
總而言之,AI輔助程式設計工具在提升程式設計效率和準確性方面發揮著重要作用,但仍需與編譯器檢查和人類專業知識相結合,才能確保程式碼的正確性和可靠性。未來,隨著AI能力的進一步提升,我們可以期待這些工具在程式設計領域發揮更大的作用。
生成式人工智慧的演進與Transformer模型的突破
生成式人工智慧(Generative AI)經歷了多次技術革新,才達到現今的成熟狀態。早期的人工智慧研究因計算能力、資料量和模型複雜度不足而受到限制。然而,隨著科技進步,特別是在硬體系統(如GPU)、大量資料的取得,以及深度學習模型的精進,生成式人工智慧重新回到快速發展的軌道上。
變分自編碼器(VAEs)
變分自編碼器於2013年由Diederik P. Kingma和Max Welling提出。他們在論文「Auto-Encoding Variational Bayes」中介紹了VAE模型,這是一種能夠從高維度資料中學習低維度潛在空間表示的技術。VAE包含編碼器和解碼器結構,能夠在無監督的情況下進行學習。
VAE的工作原理
- 降維:VAE能夠將高維度資料(如28 × 28畫素的影像,對應784維空間)壓縮到低維度的潛在空間,保留重要資訊並減少計算負擔。
- 機率分佈:與傳統自編碼器不同,VAE的編碼器輸出的是機率分佈,而非單一值。解碼器從這個分佈中取樣來重建資料。
- 生成新資料:由於VAE提供的是潛在空間中的機率分佈,因此能夠生成新的資料或影像。
生成對抗網路(GANs)
2014年,Ian Goodfellow及其同事提出了生成對抗網路(GANs),這是一種無監督機器學習演算法。GANs的核心是兩個相互對抗的神經網路:生成器和判別器。
GANs的工作原理
- 生成器與判別器:生成器負責生成新的資料例項,而判別器則評估這些例項是否為真實資料。
- 對抗訓練:透過對抗訓練,生成器逐漸提高其生成真實資料的能力,而判別器則越來越擅長區分真偽。
- 應用:GANs已經被成功應用於生成真實的影像、語音記錄等領域。
Transformer模型
在Transformer模型出現之前,迴圈神經網路(RNN)是自然語言處理(NLP)的主要方法。RNN設計用於處理序列或時間序列資料,透過保持隱藏狀態來記憶前一步驟的資訊。然而,RNN面臨著梯度消失或爆炸的問題,難以捕捉長序列中的長期依賴關係。
Transformer的革新
2017年,Ashish Vaswani及其研究團隊提出了Transformer模型,並在論文「Attention Is All You Need」中發表了其核心架構。Transformer模型透過平行處理輸入序列和利用注意力機制來理解不同部分之間的關係,從而克服了RNN的侷限性。
Transformer的工作原理
- 編碼與解碼:Transformer模型包含編碼器和解碼器兩個主要部分。編碼器讀取輸入文字並理解其含義,而解碼器則根據這種理解生成新的文字或翻譯。
- 注意力機制:Transformer的核心是注意力機制,它能夠評估句子中每個詞與其他詞之間的相關性,並賦予相應的注意力分數。
- 自注意力機制:自注意力機制使Transformer能夠觀察整個句子,瞭解詞語之間的關係,並在長文字中保持這些關係。
位置編碼
雖然Transformer具有理解句子中詞語關係的能力,但它最初缺乏對詞序的認識。位置編碼技術透過為每個詞提供其在句子中的位置資訊,幫助模型理解詞序的重要性,從而區分諸如“The cat chases the mouse”和“The mouse chases the cat”這樣的句子。
圖示說明
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title AI輔助程式設計工具與開發者技能
package "機器學習流程" {
package "資料處理" {
component [資料收集] as collect
component [資料清洗] as clean
component [特徵工程] as feature
}
package "模型訓練" {
component [模型選擇] as select
component [超參數調優] as tune
component [交叉驗證] as cv
}
package "評估部署" {
component [模型評估] as eval
component [模型部署] as deploy
component [監控維護] as monitor
}
}
collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型
note right of feature
特徵工程包含:
- 特徵選擇
- 特徵轉換
- 降維處理
end note
note right of eval
評估指標:
- 準確率/召回率
- F1 Score
- AUC-ROC
end note
@enduml此圖示展示了Transformer模型的整體架構,包括輸入序列如何透過編碼器和解碼器,最終生成輸出的過程。同時,注意力機制和位置編碼在理解輸入和生成輸出中的關鍵作用也被清晰地呈現出來。
內容解密:
此圖示主要呈現了Transformer模型的運作流程。首先,輸入序列進入編碼器進行理解,接著透過解碼器生成最終輸出。在這個過程中,注意力機制負責評估詞語之間的相關性,而位置編碼則提供了詞序資訊,使模型能夠正確理解句子的含義。整個流程展示了Transformer如何透過其獨特的架構來處理自然語言。
Transformer 模型架構:大語言模型的核心
Transformer 模型的架構是大語言模型(LLMs)的核心所在。該模型採用多頭注意力機制,可以想像成模型擁有多對眼睛,每對眼睛從不同的角度檢視句子,專注於詞語之間的不同導向或關係。例如,一對眼睛可能專注於理解動作,另一對眼睛可能專注於識別角色,而還有另一對眼睛則專注於辨認地點。這種多視角的方法使 Transformer 模型能夠更豐富地理解文字內容。
此外,Transformer 模型的每個階段都包含前饋神經網路層,這是一種簡單直接的網路,有助於處理詞語之間的關係。這進一步增強了對文字的理解和生成能力。
Transformer 模型的形式與應用
Transformer 模型以預訓練模型的形式存在。也就是說,它已經在龐大的資料集上完成了訓練,可以直接使用或進行進一步的微調。一旦預訓練完成,該模型就可以透過 API 進行呼叫,從而立即應用於各種語言處理任務。企業或個人可以快速將此模型整合到自己的系統中,例如 AI 輔助程式設計應用。此外,預訓練的大語言模型還可以透過在特定領域的資料上進行微調,以在諸如醫療或法律文字分析等專業領域表現出色。這樣一來,就無需從頭開始開發複雜的語言模型,從而節省了大量的時間、精力和資源。預訓練模型憑藉其基礎的語言理解能力,為生成式 AI 應用的開發提供了跳板。
注意事項
建立和營運一個大語言模型的成本非常高。根據《華爾街日報》的報導,GitHub Copilot 在 2023 年初平均每位使用者每月虧損超過 20 美元。在某些情況下,一些使用者每月為公司帶來的損失高達 80 美元。然而,隨著未來幾年生成式 AI 基礎設施的擴充套件,每位使用者的成本應該會降低。
Transformer 系統的主要型別
Transformer 系統主要有兩種型別:生成式預訓練 Transformer(GPT)和來自 Transformer 的雙向編碼器表示(BERT)。GPT 是 OpenAI 開發的工具,非常適合建立文字、總結資訊和翻譯語言。它根據自迴歸的大語言模型架構,這意味著它透過仔細考慮每個詞語根據已經輸出的內容來生成文字,就像一位講故事的人一次一個詞地構建敘事。它的能力來自於在龐大的文字資料上進行訓練。GPT 使用解碼器來生成內容。
另一方面,BERT 使用自動編碼方法。這種設計使它能夠深入理解句子中詞語的上下文,從而擅長於辨別語言的細微差別和含義。Google 在 2018 年將 BERT 作為開源專案發布。自此之後,根據核心模型的許多變體和增強版本相繼出現。
AI 輔助程式設計應用中的 Transformer 模型
在 AI 輔助程式設計應用中,主要使用的 Transformer 模型是 GPT。事實證明,它能夠根據程式設計師提供的上下文有效地預測和自動完成程式碼。
OpenAI Playground
OpenAI Playground 是生成式 AI 的沙盒環境,提供了對 OpenAI 開發的各種模型的存取。它允許透過直觀的圖形介面進行模型自定義。
OpenAI Playground 使人們更容易瞭解各種大語言模型的優缺點。此外,它還可以根據不同的輸入(如溫度)進行即時測試和調整模型。
然而,OpenAI 對使用該平台收取費用。費用根據使用的 token 數量計算,如表 2-2 所示。請注意,價格會定期變化。截至目前為止,所有變更都是降價。
表 2-2:OpenAI 大語言模型的成本
| 模型 | 輸入 | 輸出 |
|---|---|---|
| GPT-4/8K 上下文 | $0.03/1K tokens | $0.06/1K tokens |
| GPT-4/32K 上下文 | $0.06/1K tokens | $0.12/1K tokens |
| GPT-3.5-Turbo/4K 上下文 | $0.0015/1K tokens | $0.002/1K tokens |
| GPT-3.5-Turbo/16K 上下文 | $0.003/1K tokens | $0.004/1K tokens |
例如,假設您使用的是 GPT-4/8K 上下文的大語言模型。您的提示有 1,000 個 token,而模型的回應有 2,000 個 token。那麼輸入成本為 3 美分,輸出成本為 12 美分。
當您首次註冊 OpenAI 帳戶時,您將獲得 5 美元的信用額度,可以用於 OpenAI Playground,也可以用於 API 呼叫。
Tokens 詳解
讓我們更詳細地瞭解 token。OpenAI 有一個名為 Tokenizer 的工具,如圖 2-3 所示。在此工具中,我輸入了以下內容進行分析: 輸入:ChatGPT is unbelievable! 😊 I love it.
圖 2-3:OpenAI Tokenizer 顯示文字摘錄的 token
在 token 化過程中(以顏色突出顯示),單詞 ChatGPT 由三個 token 組成:Chat、G 和 PT。單詞 unbelievable 和其後的感嘆號有兩個 token,一個用於單詞,一個用於標點符號。至於表情符號,它由三個 token 組成。每個標點符號都是一個 token。空格與相鄰的單詞一起包含在內。
Tokenizer 用於 GPT-3、GPT-3.5 和 GPT-4。請注意,不同的大語言模型的 token 化過程往往不同。
注意事項
根據經驗法則,1,000 個 token 大約相當於 750 個單詞。
使用 OpenAI Playground 平台
當您存取 OpenAI Playground 時,您將獲得一個儀錶板,如圖 2-4 所示。
圖 2-4:OpenAI Playground 的儀錶板,具有提示、資源和互動區域
螢幕中間是與大語言模型互動的主要工作流程:
- 系統:在這裡,您可以為大語言模型提供一些上下文,例如“您是 Python 程式設計的專家”。系統提示是會話中的第一條訊息,為互動設定了舞台。自定義系統提示可以更好地控制模型在對話中的行為,這對於確保它保持在所需的引數或上下文中特別有用。
- 使用者:這是提示的主要指令。例如,您可以在這裡要求大語言模型執行某項編碼任務。
- 新增訊息:這允許您與大語言模型進行持續的聊天互動。
程式碼範例與解析
# 示範如何使用 OpenAI API 呼叫大語言模型
import openai
# 設定 API 金鑰
openai.api_key = '您的 API 金鑰'
# 定義要傳送給模型的提示
prompt = "請寫一段關於未來的程式碼。"
# 呼叫 GPT-3.5-Turbo 模型
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
# 輸出模型的回應
print(response['choices'][0]['message']['content'])
#### 內容解密:
- 匯入必要的函式庫:首先,我們需要匯入
openai函式庫,這是與 OpenAI API 互動所需的。 - 設定 API 金鑰:為了使用 OpenAI 的服務,您需要擁有一個有效的 API 金鑰。在這裡,我們將金鑰指定給
openai.api_key。 - 定義提示:我們定義了一個簡單的提示,要求模型寫一段關於未來的程式碼。
- 呼叫 GPT-3.5-Turbo 模型:透過
openai.ChatCompletion.create方法,我們呼叫了 GPT-3.5-Turbo 模型,並傳遞了我們定義的提示。 - 輸出模型的回應:最後,我們列印出模型的回應,這裡是根據我們的提示生成的文字內容。
這個例子展示瞭如何使用 OpenAI 的 API 與其大語言模型進行互動,並獲得所需的輸出。透過調整提示和選擇不同的模型,可以實作多種不同的應用場景。