GitHub Copilot 是一款強大的 AI 輔助程式設計工具,它能根據您的程式碼和意圖提供即時的程式碼建議。其高效運作的關鍵之一,就是對「即時上下文 (In-memory Context)」的理解與利用。了解這個機制並掌握其最佳實踐,將能極大地提升您的開發效率和程式碼品質。
即時上下文是 Copilot 在執行時動態組裝的一組資訊,用來理解您當前的工作環境和程式設計意圖。它就像 Copilot 的「工作記憶」,包含了它需要生成相關且準確程式碼的所有即時線索。除了預先訓練的語言模型外,這個即時上下文對於 Copilot 生成高品質建議至關重要。即時上下文如何運作?
Copilot 的核心是一個大型語言模型 (LLM),該模型經過大量公開原始碼和自然語言的訓練。當您開始輸入程式碼或註解時,Copilot 會即時地從您正在處理的檔案中收集各種資訊,來構建其即時上下文。然後,它會結合這個即時上下文和其底層模型,來預測並提供程式碼建議。
Copilot 用來構建即時上下文的資訊來源包括:
- 您目前活躍的檔案內容:您正在編輯的程式碼。這是 Copilot 最直接的參考依據,用於理解您目前正在撰寫的程式邏輯,可協助模型提供符合當前邏輯結構與語法風格的建議。
- 註解 (Comments):Copilot 會利用註解來理解程式碼的上下文和您的意圖,例如函式要解決的問題或預期行為,良好的註解可引導模型產生更準確、語意對齊的程式碼建議。
- 已開啟的檔案與您的工作區:它不僅查看您當前活躍的檔案,還會考慮工作區中其他已開啟或未開啟的檔案內容。讓模型能夠根據整體專案架構、相依邏輯或共同命名習慣做出一致的建議。
- 匯入語句 (Import statements):匯入的套件和模組會提供關於您正在使用的技術和功能的線索。
- 檔案結尾與檔案名:例如 .js 或 .html 等檔案類型,以及具備描述性的檔案名稱,都有助於 Copilot 做出更精確的判斷。
- 有意義的類別、方法和變數名稱:具備描述性的命compilance名可以幫助 Copilot 理解您的意圖,從而提供更好的建議。
- 您之前輸入的文字:Copilot 會從您鍵入的內容中學習並推斷,分析您目前的程式風格與主題方向,即時適應您目前的工作節奏,讓建議更流暢、更貼近您目前的思路。
- 程式碼中的範例:在註解中提供範例,可以幫助 Copilot 產生更精確的內容。讓模型能夠模仿範例格式,自動產出一致性的內容。
- 對話歷史 (僅限 Copilot Chat):在 Copilot Chat 中,AI 助手會記住您對話的上下文,並根據先前的互動提供更相關的建議。
上下文越充足,AI 助理提供的輸出就越好。
善用即時上下文的最佳實踐
為了最大限度地發揮 Copilot 的能力,以下是一些實用的策略和原則:
- 實施「自上而下設計」與「問題分解」:
將複雜的程式設計問題分解成更小、更容易管理的部分。這是我在先前對話中強調的關鍵原則。每個子任務都應該足夠小,能夠清晰地描述並由 Copilot 有效地生成程式碼。例如,一個大型的資料處理任務可以分解為:資料載入、資料檢查、摘要統計、資料預處理、特徵工程、模型選擇、模型訓練、模型評估等步驟。您可以針對每個分解出來的功能 (Feature) 或步驟撰寫提示。
- 撰寫精確且豐富上下文的提示 (Prompt Engineering):
簡潔而明確:針對每個小部分撰寫簡潔、明確且具足夠上下文的提示。
善用註解:將您的意圖直接寫在程式碼檔案的註解中(例如在 HTML 檔案中使用 <!-- -->,在 JavaScript 檔案中使用 //)。提供程式碼範例:在註解中提供期望結果的範例,這能有效引導 Copilot 輸出更精確的程式碼。
使用描述性命名:為您的檔案、變數、函式和類別使用有意義且具描述性的名稱。Copilot 會從這些名稱中推斷您的意圖。
迭代和細化提示:如果 Copilot 的建議不夠好,請不要氣餒。您可以嘗試迭代和細化提示。重新措辭、添加分隔符(如逗號、冒號),或改變提供的上下文,都可以幫助 Copilot 產生更好的結果。
- 有效利用 Copilot 的不同互動模式與命令:
行內提示 (In-editor inline comments):在程式碼文件中直接撰寫註解作為提示,Copilot 會自動在您的游標位置提供程式碼補齊建議。您可以按 Tab 鍵接受建議。
手動觸發建議:如果沒有自動出現建議,可以嘗試按 Ctrl + Spacebar (Windows) 或 Option+\ / Alt+\ (Mac) 來手動觸發即時建議 。
完成面板 (Completions Panel):按 Ctrl + Enter (或 Cmd+Enter) 可以開啟一個完成面板,其中會顯示多達 10 種不同的程式碼建議供您選擇。
Copilot Chat:當您需要更複雜的對話、解釋程式碼、學習新概念、生成測試或重構程式碼時,可以使用 Copilot Chat 模式。
- @workspace 命令:當您需要 Copilot 考慮整個專案中的所有檔案(無論是否開啟)來解決問題時,請使用 @workspace。這對於跨檔案的重構或理解大型程式碼庫特別有用。
- #file 標籤:如果您希望 Copilot 考慮特定檔案的內容,即使該檔案未開啟,可以使用 #file 標籤指定檔案路徑。您甚至可以在一個提示中引用多個檔案。
- #editor 標籤:此標籤會讓 Copilot 將您當前編輯器中可見的程式碼作為上下文。
- 選取程式碼 (Selection context):在編輯器中選取一段程式碼,然後在聊天視窗中提供提示,Copilot 會將選取部分作為上下文來回應。
- /explain 命令:此命令讓 Copilot 解釋程式碼片段或概念,非常適合學習和理解不熟悉的程式碼。
- /fix 命令:如果您的程式碼有錯誤,選取錯誤的程式碼並使用 /fix 命令,Copilot 會嘗試提供修正建議。
- /tests 命令:此命令可以幫助您為特定函式或程式碼生成測試案例。
- q: 前綴:在行內編輯模式下,如果您想提問而非直接生成程式碼,可以在句子的開頭使用 q:。
- 持續驗證 Copilot 的輸出:
儘管 Copilot 非常強大,但它的輸出是非確定性的 (nondeterministic),每次可能給出不同的答案。Copilot 可能會犯錯,甚至會產生不正確或不安全的程式碼。因此,務必對 Copilot 生成的程式碼進行人工檢查、驗證和測試。
測試程式碼至關重要,因為它有助於發現錯誤並增強對程式碼功能的信心。
結論
即時上下文是 GitHub Copilot 魔法的核心。透過積極地為 Copilot 提供豐富、精確且有組織的上下文,並善用其各種功能和命令,您將能夠充分發揮這個 AI 助理的潛力,加快開發速度,提高程式碼品質,並更好地理解複雜的程式設計問題