AI 輔助程式設計工具並不像編譯器那樣理解程式碼,而是根據大量的程式碼資料進行預測和建議。編譯器則負責將程式碼轉換成機器可執行的指令,包含詞法分析、語法分析、語義分析、中介語言生成、程式碼最佳化和程式碼生成等階段。AI 輔助工具的出現,並非取代編譯器,而是輔助開發者提高效率,例如程式碼補全、錯誤檢測和提供替代方案。瞭解 AI 輔助工具的能力和限制,例如錯誤檢測的侷限性,有助於更有效地運用這些工具。
編譯器與AI輔助編寫工具
要更好地理解AI輔助編寫工具,瞭解編譯器所做的是很有幫助的。以下是編譯器執行的一些主要步驟:
詞法分析(Tokenization)
編譯器就像一位語言老師,將你的程式碼分解成令牌(Tokens)。
句法分析
在此步驟中,編譯器檢查令牌如何分組。它確保你的編寫具有正確結構而不僅僅是正確命令。
語義分析(Error Checks)
編譯器確保你的程式碼在給定語言上下文中有意義。這不僅僅是關於正確語法;還關於正確含義。
中介語言生成
在此步驟中你開始程式碼轉換之旅。 編譯器將高階程式碼轉換為中間形式。 這還不是機器語言但已經接近了。
程式碼最佳化
在此步驟中編譯器為你程式碼進行瘦身處理。 它最佳化中間程式碼以使其執行更快並佔用更少空間。
程式碼生成
這是最後轉換。 編譯器將最佳化後的中間程式碼轉換為機器程式碼或組合語言供你CPU執行。
連結與載入:
有時被認為是編譯過程的一部分,連結包括將各種程式碼片段和函式庫合併為單個可執行程式。 載入是將該程式放入記憶體以進行執行過程。
然而,像Copilot這樣的AI輔助編寫工具則不同。 它們實際上並不真正“理解”程式語言。 這沒關係。 編譯器會處理這個問題。 相反它們使用人工智慧來猜測並建議程式碼片段, 根據已經存在著很多程式碼。 由於這些工具是在賭博, 因此這些建議可以有很大差異。 編譯器會拿著這些程式碼並使之成為機器可以執行之物
AI輔助程式設計工具的能力與限制
AI輔助程式設計工具在現代軟體開發中扮演著重要角色,但它們並非完美無缺。儘管這些工具能夠幫助開發者提高效率,但它們的功能和限制仍需深入瞭解。
錯誤檢測能力
AI輔助程式設計工具在錯誤檢測方面表現不錯,但仍無法完全取代編譯器和人類開發者的細緻檢查。這些工具根據預測模式,而非編譯器引擎,因此可能會錯過一些細微的錯誤。例如,它們可能會忽略少見的括號錯誤或過於複雜的建議。然而,這些工具在捕捉語法錯誤和常見陷阱方面仍然非常有用。它們可以幫助開發者快速修復缺失的分號、拼寫錯誤或不比對的括號,並提供更高效的迴圈方法或提醒關閉檔案等操作。
此圖示
graph TD;
A[AI輔助程式設計工具] --> B[錯誤檢測];
B --> C[語法錯誤];
B --> D[邏輯錯誤];
C --> E[缺失分號];
C --> F[拼寫錯誤];
C --> G[不比對括號];
D --> H[提供替代方案];
AI輔助程式設計工具的能力層級
Quinn Slack,Sourcegraph的CEO和共同創辦人,在2023年10月發布了一篇部落格文章,提出了一個「程式碼AI能力層級」的框架,幫助我們更好地理解AI輔助程式設計工具的功能和限制。
此圖示
graph TD;
A[程式碼AI能力層級] --> B[Level 0: 無AI輔助];
A --> C[Level 1: 程式碼補全];
A --> D[Level 2: 程式碼建立];
A --> E[Level 3: 超視自動化];
A --> F[Level 4: 全自動化];
A --> G[Level 5: AI主導全自主];
Level 0:無AI輔助
在這個層級中,沒有任何AI介入,所有工作都由人類開發者手動完成。這是傳統程式設計的起點。
Level 1:程式碼補全
在這個層級中,AI開始幫助開發者完成單行或塊狀的程式碼。開發者仍然掌控整個程式的方向,但可以使用AI來加速常見任務。
Level 2:程式碼建立
AI在此層級中更加積極,能夠生成較長的程式碼段落,例如設計API或修復現有程式碼。然而,這些操作仍需人類監控和確認。
Level 3:超視自動化
在這個層級中,AI開始承擔更多工,例如修復錯誤、新增新功能和整合系統。它仍需與人類協作,但在許多情況下可以獨立執行。
Level 4:全自動化
AI在此層級中能夠獨立處理複雜任務,無需人類最終確認。這像是一名經驗豐富的工程師在執行中的持續監控和改進。
Level 5:AI主導全自主
在這個最高層級中,AI不僅遵循人類指示,還設定自己的目標和獎勵機制。這是一個未來可能實作的理想狀態,當前技術尚未達到。
目前大多數AI輔助程式設計工具如Copilot處於Level 3左右。Quinn Slack的框架為我們提供了一個清晰的技術評估方式,幫助我們理解這些工具的能力和限制。
生成式AI與大語言模型(LLMs)
使用AI輔助程式設計工具不需要深入瞭解生成式AI技術的細節,但理解其基本原理有助於更好地評估這些工具的回應、能力和限制。透明度是新技術被接受的關鍵因素之一。
生成式AI的演進
生成式AI技術可追溯至數十年前ELIZA聊天機器人的出現。ELIZA由麻省理工學院教授Joseph Weizenbaum於1960年代中期建立,旨在模仿心理治療師與使用者之間的對話。儘管它根據規則引擎並主要重複使用者輸入,但許多人仍然覺得與之交流比與真人交流更有趣。這種現象被稱為「ELIZA效應」,顯示了人類容易將電腦理解為具有人類般智慧。
生成式AI技術經歷了漫長而緩慢的發展過程,直到2010年代才迎來重大突破。目前我們所使用的LLMs根據深度學習模型和海量資料訓練而成,能夠生成高度自然且相關的文字。
變革的技術引擎:從產生式AI到Transformer模型
技術世界迎來了新的轉折點,擁有強大的運算能力、GPU(圖形處理單元)等閃亮硬體系統,以及豐富的資料和精緻的深度學習模型。這些要素共同推動了產生式AI再度進入快車道。隨著其發展,不同的方法陸續出現:
變分自編碼器(VAEs)
變分自編碼器(Variational Autoencoders, VAEs)於2013年由Diederik P. Kingma和Max Welling提出,並且在其論文「Auto-Encoding Variational Bayes」中首次介紹。VAE模型能夠從高維度的複雜資料中提取出低維度的潛在空間,而這一切都不需要監督。它包含了一個編碼器-解碼器結構。
當我們說高維度資料時,我們指的是具有許多特徵的資料,每個特徵都是一個維度——例如,一個28×28畫素的影像在784維度空間中。而低維度的潛在空間則是這些資料的壓縮版本,保留了關鍵資訊並去除了多餘的維度。這一點非常重要,因為它減輕了計算負擔,抵禦了維度災難,並使資料更容易視覺化和解釋。從高維度到低維度的轉變稱為降維,它將資料簡化到其最基本的形式。
與傳統自編碼器不同的是,VAE中的編碼器並不僅僅輸出每個潛在屬性的一個值,而是提供一個機率分佈。解碼器從這個分佈中取樣來重建資料。這個技巧使得在潛在空間中建立新資料或影像成為可能。
生成對抗網路(GANs)
生成對抗網路(Generative Adversarial Networks, GANs)由Ian Goodfellow及其同事於2014年提出,是一種用於無監督機器學習的AI演算法。GANs的核心是兩個神經網路:生成器和判別器,它們之間進行類別似遊戲般的對決。生成器產生新的資料樣本,而判別器則像裁判一樣,區分真實和假造的資料。隨著每一輪對決,生成器不斷提升自身技能,製造出越來越逼真的資料樣本。這種設計開啟了許多新可能性,使得AI能夠創造出逼真的影像、語音錄音等。
這些產生式AI方法為後來的Transformer模型奠定了基礎,後者是一項真正突破性的技術,使得大語言模型(LLMs)成為現實。
Transformer模型
在Transformer出現之前,自然語言處理(NLP)主要依賴於迴圈神經網路(Recurrent Neural Networks, RNNs)。RNNs設計用來處理順序或時間序列資料,透過儲存隱藏狀態來記住之前步驟中的資訊——這對於語言建模、語音識別和情感分析等任務非常有用。RNNs逐步處理序列中的每一部分內容,根據當前輸入和之前處理過的內容來更新其隱藏狀態——因此稱之為迴圈。
然而,當面臨長序列時,RNNs會遇到梯度消失或爆炸問題,這使得它們難以追蹤長期關係。而Transformer則完全改變了這一局面。與RNN不同的是,Transformer透過平行處理資料並使用注意力機制來追蹤輸入序列中不同部分之間的關係,無論它們位於何處。
此架構讓Transformer能夠輕鬆處理短序列和長序列問題。此外,其平行處理能力與GPU或TPU等先進晶片架構相得益彰。
Ashish Vaswani及其在Google的研究團隊創造了Transformer並於2017年在「Attention Is All You Need」論文中首次發表其核心架構。
Transformer模型示意圖
graph TD;
A[Input Sequence] --> B[Encoder];
B --> C[Attention Mechanism];
C --> D[Output Sequence];
subgraph Encoder
E[Self-Attention];
F[Feed Forward Neural Network];
end
此圖示展示了Transformer模型中的主要部分:編碼器和注意力機制如何處理輸入序列以生成輸出序列。
編碼與解碼階段
Transformer模型如同一位精湛的語言學家,善於解析語言細節。它的一系列魔法發生在兩個主要階段:編碼和解碼。每個階段都由其自己的層組成。
在編碼階段中,模型閱讀並理解輸入文字類別似於語言學家理解外陳述式子的一樣。而在解碼階段中,模型根據編碼階段獲得的理解生成新文字或翻譯結果,類別似於語言學家將那句外語翻譯成母語。
注意力機制
Transformer的核心是注意力機制(Attention Mechanism),它允許模型評估句子中每個詞與其他詞之間的相關性並給予每個詞注意力得分。例如,「The cat sat on the mat.」這句話中,「sat」這個詞可能會給「cat」和「mat」分配較高的注意力得分因為它們與坐下這個動作直接相關。
其中一項顯著特徵是自我注意力機制(Self-Attention Mechanism)。它允許Transformer檢視整個句子、理解詞之間的關係並保持這些關係跨越長文字範圍。這賦予Transformer一種長期記憶能力,使其能夠專注於所有已出現過的詞或標記(整詞或部分詞),從而理解更廣泛的上下文。
位置編碼
儘管具有上述能力,但最初Transformer無法認識句子中的詞序問題——而這對於理解句義至關重要。因此引入了位置編碼(Positional Encoding),它就像GPS系統一樣為模型提供每個詞在句子中的位置資訊並幫助區分類別似「The cat chases the mouse」和「The mouse chases the cat」之間細微差異。
變壓器模型的架構:LLM 的核心
變壓器模型(Transformer)是大語言模型(LLM)的核心架構,其設計精妙且功能強大。變壓器模型採用多頭注意力機制(Multi-Head Attention Mechanism),這可以想像成模型擁有多對眼睛,每對眼睛從不同的角度觀察句子,關注詞語之間的不同關係。例如,一對眼睛可能專注於理解動作,另一對則專注於辨識角色,還有一對則專注於識別地點。這種多視角的方法使得變壓器能夠更全面地理解文字。
除了多頭注意力機制,變壓器的每個階段都包含前馳神經網路(Feedforward Neural Network)的層次。這些層次是簡單直觀的網路,有助於處理詞語之間的關係,進一步提升了文字理解和生成的能力。
變壓器模型通常以預訓練(Pretrained)形式存在,已經在大量資料上進行了訓練,因此可以立即使用或進一步微調。預訓練後的模型可以透過API直接應用於各種語言處理任務,例如AI輔助程式碼編寫應用。此外,預訓練的LLM還可以透過在特定領域的資料上進行微調來提升特定應用的效能,如醫療或法律文字分析。這樣可以避免從頭開發複雜的語言模型,節省大量時間和資源。預訓練模型已經具備了基本的語言理解能力,為生成式AI應用提供了一個堅實的基礎。
建立與執行LLM 的成本
建立與執行LLM需要大量資源。根據《華爾街日報》報導,2023年年初時,GitHub Copilot平均每月每位使用者虧損超過20美元,有些使用者甚至讓公司每月虧損80美元。然而隨著未來幾年生成式AI基礎設施的擴充套件與最佳化,預計每位使用者的成本將會下降。
變壓器系統的兩種主要型別
變壓器系統主要有兩種:生成式預訓練變壓器(Generative Pretrained Transformer, GPT)和雙向編碼表示變壓器(Bidirectional Encoder Representations from Transformers, BERT)。GPT由OpenAI開發,適合用於創作文字、摘要資訊和翻譯語言等任務。它根據自迴歸LLM架構,意味著它透過逐詞生成來創作文字,就像故事講述者一個字一個字地講述故事。GPT的能力來自於在大量文字資料上的訓練。GPT使用解碼器來生成內容。
BERT則採用自編碼方式設計,能夠深入理解句子中詞語之間的上下文關係,因此非常適合解釋語言中的細微差異和含義。Google在2018年開發了BERT作為開源專案,自那以後許多改進和衍生版本也相繼出現。
在AI輔助程式碼編寫應用中,GPT是主要使用的變壓器模型型別之一。它能夠根據程式設計師提供的上下文有效地預測和自動完成程式碼。
內容解密:
多頭注意力機制
多頭注意力機制使得模型能夠同時從多個角度分析句子中的詞語關係,從而獲得更全面、深入的理解。
前馳神經網路
前馳神經網路層次負責處理詞語之間的關係,協助提升模型在理解和生成文字方面的能力。
預訓練模型
預訓練模型已經在大量資料上進行了訓練,因此可以直接使用或進一步微調以提升特定領域應用效能。
OpenAI Playground
OpenAI Playground 是一個生成式AI沙盒環境,提供對各種OpenAI開發模型的存取許可權。它允許使用者透過直觀的圖形介面進行模型自定義。
OpenAI Playground 使得理解各種LLM強項和弱點更加容易。此外,它還允許實時測試和根據不同輸入(如溫度)進行調整模型。
然而需要注意的是OpenAI對使用平台收取費用,費用根據使用的token數量計算.以下是目前的一些費率:
| 模型 | 輸入費率(每1K tokens) | 輸出費率(每1K tokens) |
|-------------------------|-----------------------|-----------------------|
| GPT-4/8K context | $0.03 | $0.06 |
| GPT-4/32K context | $0.06 | $0.12 |
| GPT-3.5-Turbo/4K context| $0.0015 | $0.002 |
| GPT-3.5-Turbo/16K context| $0.003 | $0.004 |
內容解密:
OpenAI Playground
OpenAI Playground 提供直觀介面與豐富功能,讓使用者可以方便地進行模型調整與實時測試.
付費標準
OpenAI 平台根據 token 數量收費,不同模組有不同價格.
Token 的詳細說明
Token 是 OpenAI 模型中最小操作單位, 每個 Token 通常對應到一個字或者符號. 在 token 化過程中, 長單詞可能會被拆分成多個 Token. 例如: 「ChatGPT」 會被拆分為三個 Token 「Chat」、「G」、「PT」。而「unbelievable!」會被拆分為兩個 Token, 一個是「unbelievable」, 一個是「!」.
這些 Token 化規則會因不同 LLMs 而有所差異.
Let's count the tokens:
"ChatGPT is unbelievable! 😃 I love it." -> ["Chat", "G", "PT", " is", " unbelievable", "!", " 😃", " I", " love", " it", "."]
此圖示展示了文字片段中的token化情況, 每個單詞或符號會被轉換為token以進行計算.
內容解密:
Token 化
Token 是 OpenAI 模型處理文字最小單位, 長單詞可能被拆分為多個 token.
平台操作流程
當你進入 OpenAI Playground 平台時, 首先會看到一個面板介面, 包含幫助資料與互動區域。
System (系統)
系統指令區域允許你設定上下文提示,例如:「你是 Python 程式設計專家。」這樣就能影響後續 LLM 的行為。
User (使用者)
在這裡你可以輸入主指令,例如要求 LLM 執行某些程式碼編寫任務。
Add message (新增訊息)
這允許你與 LLM 開啟持續對話, 不斷新增新訊息以獲得更精確回應。
內容解密:
System
System 提供設定上下文提示以控制 LLM 行為.
User
User 主要負責提供操作指令.
Add message
Add message 是持續對話功能,可不斷新增新訊息以獲得更精確回應.