在 VS Code 中追求極致智慧
2023 年 11 月 13 日,作者:Chris Dias,@chrisdias
如果您上週收看了 GitHub Universe,您會看到人工智慧在整個開發者工作流程中取得了巨大的進步、創新和願景。在這篇博文中,我們將重點介紹過去幾個月 Visual Studio Code 在實現這一更廣泛願景方面所取得的進展。
“非常聰明”
在馬特·達蒙和本·阿弗萊克的經典電影《心靈捕手》中,我最喜歡的一句臺詞是 "my boy's wicked smaaahtt"(請用波士頓口音來讀,以獲得完整效果)。
這句臺詞是摩根(本·阿弗萊克的弟弟卡西·阿弗萊克飾)在威爾(馬特·達蒙飾)透過逐頁、逐字地回憶美國曆史事實,打破了查基(本·阿弗萊克飾)與一位過於自信的“一年級研究生”之間的對峙後說的。你可以說威爾是透過他讀過的所有書進行訓練的,並且能夠根據對話回憶起它們。
AI 和威爾很像——它瞭解大量的文字。但 AI 缺少的是——人類擁有而 AI 沒有的——特定互動的上下文,以便給出最佳答案。就威爾而言,因為他還能“察言觀色”,所以他可以利用他的書本知識來回擊一個精心設計的反駁。
大型語言模型(LLM)是在某個時間點對公共儲存庫資料進行訓練的。這意味著它們對您當前的程式碼一無所知。它們瞭解一般的程式碼,但它們沒有必要的上下文來準確回答有關它的問題,或者建議遵循您的工作區形式和功能的新程式碼。
為了解決這個問題,GitHub Copilot Chat 會發送程式碼片段,幫助模型更好地回答問題(這稱為檢索增強生成,或“RAG”)。透過檢視最相關的程式碼,答案會變得更好。但是可以傳送到 LLM 的程式碼量(以及透過提示進行的指導)是有限制的。對於一個小專案來說,這通常不是問題。但是考慮一下任何大型原始碼儲存庫,您很快就會意識到將每個檔案的內容傳送給模型是不可能的。獲得更好答案的解決方案是在合理的時間內使用適量的資源傳送相關上下文。為了幫助解決這個問題並解鎖許多其他場景,我們向 Copilot Chat 添加了參與者的概念。
參與者
聊天參與者是領域專家,他們可以以他們想要的任何方式回答使用者查詢——透過在查詢處理中充分利用 AI,或者透過將其轉發到後端服務以傳統方式回答。參與者還可以為大型語言模型提供對特定領域工具的訪問。在 LLM 的幫助下,參與者可以選擇一個工具並定義如何呼叫它。這種聊天參與者的一個例子是 @workspace。@workspace 參與者瞭解您的工作區,可以回答有關它的問題。在內部,該參與者由不同的工具提供支援:GitHub 的知識圖譜與語義搜尋、原生代碼索引和 VS Code 的語言服務相結合。
聊天參與者可以由客戶端或服務貢獻。在 GitHub Universe 上,有一個服務側參與者的演示,即 github.com Chat 體驗中的“文件代理”,它知道如何搜尋儲存庫中找到的文件(即將推出到 VS Code)。
客戶端參與者可以透過傳統的 VS Code 擴充套件程式貢獻。有關這方面的更多資訊,請參閱可擴充套件性部分,但讓我們看看今天在 VS Code 中可用的兩個聊天參與者:@workspace 和 @vscode。
@workspace
@workspace 參與者知道如何收集有關工作區中程式碼的上下文,可以幫助您導航它、查詢相關類、檔案等。想象一下您在 VS Code 儲存庫中,並且您想了解更多關於負責當前 ICodeEditor 的服務;您可以像這樣使用參與者

使用自然語言詢問 @workspace 參與者“我使用什麼服務類來獲取當前的 ICodeEditor”。從那裡,參與者執行以下操作以獲取適量的上下文傳送給 LLM
-
vscode 儲存庫已由 GitHub Search Blackbird 服務索引。
@workspace參與者使用此索引作為工具來利用儲存庫知識圖譜。@workspace參與者執行語義搜尋,返回相關的程式碼片段和元資料。GitHub 搜尋服務已索引了前 10K 個 GitHub 庫,並計劃新增更多。 -
@workspace參與者使用的下一個工具是本地索引上的詞彙文字搜尋,用於查詢額外的程式碼,例如本地、未提交的更改和 Copilot 對話歷史記錄。 -
然後
@workspace使用最後一個工具——VS Code 的語言智慧來新增關鍵細節,如函式簽名、引數,甚至是內聯文件。
所有這些上下文片段都由 @workspace 參與者排名、切片和總結,然後傳送給 LLM 以回答問題。
因為它擁有所有必要的上下文,所以 @workspace 參與者可以回答開發人員更可能提出的問題。例如,有關程式碼不同部分如何互動的問題
- “
@workspace通知是如何安排的?”
或者需要了解相關程式碼、依賴項和設計模式的問題
- “
@workspace新增表單驗證,類似於時事通訊頁面”
@vscode
VS Code 可以透過多種方式進行自定義,即使是 VS Code 團隊的成員在發現一些隱藏功能時也會感到驚喜。為了幫助我們的使用者和團隊成員充分發揮 VS Code 的力量,我們建立了 @vscode 參與者。
這個參與者瞭解所有關於 VS Code 的資訊,可以幫助您彌合自然語言與 VS Code 命令和自定義之間的差距。@vscode 參與者內部使用工具,使其能夠訪問所有設定和命令的索引,我們正在新增一個工具,以便該參與者也可以使用 VS Code 文件。現在您可以問一些模糊的問題,例如“@vscode vscode 假裝開啟檔案時那個東西叫什麼?以及如何停用它?”

請注意,響應中有一個在設定編輯器中顯示按鈕。這是因為 @vscode 參與者不僅瞭解 VS Code 的工作原理,而且還有一個工具來呼叫設定編輯器或命令面板。
此外,命令面板現在支援相似性搜尋,因此您在搜尋命令時不再需要知道確切的名稱。您不再需要說出獨特的 VS Code 行話來解鎖團隊每月釋出的所有好東西。
這僅僅是 @vscode 參與者的開始。我們計劃支援越來越多的場景,讓使用者能夠更好地理解和完全控制 VS Code。
斜槓命令
聊天參與者還可以貢獻我們所說的斜槓命令,這是參與者提供的特定功能的快捷方式。回答問題時的任務之一是確定意圖,瞭解您想要做什麼。
我們可以推斷“使用 Node.js Express Pug TypeScript 建立一個新的工作區”意味著您想要一個新專案,但“@workspace /new Node.js Express Pug TypeScript”是明確、簡潔的,並節省了您的打字時間。

一旦意圖明確,@workspace 參與者就有更好的機會滿足使用者的需求,儘管自然語言固有的模糊性。@workspace 可以建議目錄結構,使用者可以點選建議的檔案進行預覽。有一個建立工作區按鈕,它將在新資料夾中生成這些檔案。

可擴充套件性
“VS Code 只是一個外殼,您需要擴充套件程式才能讓它發光!”——這是在 VS Code 擴充套件程式上工作的微軟團隊的常見會議口號,自豪地炫耀他們在 VS Code 成功中的作用。我們作為 VS Code 核心團隊,完全同意他們——如果沒有豐富的擴充套件程式生態系統,VS Code 就不會是今天的樣子!AI 也不例外,雖然核心 AI 體驗透過 Copilot 點亮,但我們的願景是,我們生態系統中的所有擴充套件程式都可以參與進來,讓 LLM 模型擁有最佳的上下文和基礎。今天,我們透過在提議狀態下新增 聊天參與者 API 為這一願景奠定基礎。
聊天參與者 API 允許擴充套件程式貢獻可以回答使用者特定問題的參與者。@workspace 和 @vscode 參與者都是使用此 API 實現的。透過聊天參與者,使用者可以將來自其內部和外部迴圈工具的豐富且最新的資訊帶入 AI 對話,同時保持在編輯器流程中。參與者就像某個領域的專家,當用戶在提示中明確提到 @participant 時,該提示將轉發給貢獻該特定參與者的擴充套件程式。
參與者可以使用 Markdown 回覆簡單的文字和影像響應,或者他們可以使用檔案樹或按鈕進行更具互動性的體驗。例如,當參與者建議為使用者建立一個新的工作區時,檔案樹可以用作預覽。參與者可以為每個響應提供後續行動,將它們想象成關於如何進一步推進對話的建議。為了提供流暢的使用者體驗,整個 API 是基於流的。如前所述,參與者可以引入斜槓命令——特定功能的快捷方式。例如,@docker 參與者可能會貢獻一個 /generate 斜槓命令,導致以下示例使用者提示“@docker /generate workspce 的 DOCKERFILE”。當前顯式且簡潔的語法可以方便地節省時間。儘管如此,我們正在研究意圖檢測,以允許 VS Code 核心根據使用者的自然語言提示自動選擇正確的參與者和斜槓命令。
想象一下,直接在 VS Code 中安裝一個瞭解 Azure 或 Docker 的聊天參與者。或者您可能只需要一個 DALL-E 參與者,它使用影像生成作為工具來呈現一隻可愛的動物,確認您做得很好。

參與者可以帶來任何特定領域的內容,同時訪問該領域的工具。例如,1ES 代表 One Engineering System,是微軟內部的工程系統。1ES VS Code 擴充套件程式貢獻了一個 @1es 參與者,可以回答微軟內部工程師的特定問題。@1es 參與者正在動態規劃並顯示它實際在做什麼。它使用 LLM 模型中可用的一些公共資料,但它也識別微軟內部的細節並將兩者結合起來提供最佳答案。

由於參與者具有當前上下文,因此它可以繼續討論

我們還在新增一個 API,允許擴充套件程式訪問 LLM,並且可以選擇使用 LLM 來處理和回答使用者查詢。今天,這個 API 僅限於實現參與者的那些擴充套件程式。聊天參與者 API 將精確的使用者提示傳遞給貢獻的參與者,並且透過 LLM 訪問 - 參與者可以方便地將這些語言提示轉換為特定的後端 API 呼叫。我們將謹慎和透明地處理此 API 的使用,以便使用者瞭解參與者使用了多少請求和令牌。
聊天參與者 API 仍處於提議狀態,我們正在尋求有關如何改進它的反饋,目標是在不久的將來最終確定該 API。您今天就可以嘗試一些東西,最好的入門方法是檢視我們的 聊天參與者可擴充套件性示例。我們迫不及待地想看到您創造的面向開發人員的 AI 驅動創新。
便利性
我們對參與者及其帶來的無限可能性感到非常興奮,但我們也想談談我們正在新增到 VS Code 中您常規工作流程中的由 Copilot 提供支援的便捷小互動。您不應該為了利用 AI 而重新學習您的編輯器。
智慧操作
智慧操作無縫整合到您的 VS Code 流程中(例如,在快速修復和上下文選單中),它們根本不需要您編寫任何提示。最強大的智慧操作是 /fix。這是一個相對簡單的 TypeScript 快速排序演算法,其中包含一個錯誤,指出“Argument of type 'number' is not assignable to parameter of type 'never'”。單擊燈泡並選擇使用 Copilot 修復。

此選項會開啟填充了 /fix 以及錯誤訊息的內聯聊天。在幕後,我們引入了額外的 VS Code 診斷上下文,然後讓 Copilot 提供修復——更新 left 和 right 陣列以使用正確的型別宣告。

我們注意到 /fix 對於 shell 等語言特別有用,在這些語言中,傳統工具有時會缺乏。

為了幫助使其建議更清晰,Copilot 會嘗試解釋為什麼它提出了特定的修復。我們很高興得知使用者接受建議的 Copilot 修復的比例約為 60%。有時修復可能與燈泡附近的程式碼無關,需要安裝缺失的依賴項——在這種情況下,/fix 會建議可以在整合終端中執行的命令。
與 /fix 類似,/doc 智慧操作在使用者中很受歡迎。要使用 /doc,請選擇一段程式碼,右鍵單擊,然後選擇Copilot > 生成文件。Copilot 將為您的程式碼生成文件註釋,我們認為您會對文件質量感到驚訝。

生成提交和拉取請求訊息
有時意圖非常清楚。在這種情況下,與 AI 的體驗會感覺幾乎神奇。我現在最喜歡的是讓 Copilot 自動生成提交訊息的能力。在安裝了 Copilot 的原始碼檢視中,您會在提交訊息欄位旁邊看到一個新的閃光圖示。選擇閃光圖示,Copilot 將填寫訊息!

我對這種體驗感到非常興奮,前幾天我甚至在使用 vscode.dev/github 編輯 Markdown 時進行了這次提交,因為 Copilot 擴充套件程式尚未啟用 Web。
回到我們的流程,讓我們繼續建立一個拉取請求。我安裝了 GitHub Pull Requests and Issues 擴充套件程式,它知道 Copilot Chat 擴充套件程式的存在。當我發出 PR 時,標題和描述旁邊有另一個閃光圖示。選擇它,Copilot 會自動編寫一個很好的描述!

這是 AI 可以幫助您提高生產力的另一個領域,它透過自動處理您每週進行數十次或數百次簡單而繁瑣的任務。
你說什麼?!
最後,要製作一個真正智慧的 AI,意味著要讓互動儘可能輕鬆。
在過去幾年中,我們作為一個行業在語音識別技術方面取得了很大進步。我們知道很多人一直渴望將語音助手與高階 LLM 結合起來。現在,您可以在 VS Code 中將兩者結合使用。
新的 VS Code Speech 擴充套件程式為 VS Code 帶來了語音轉文字支援。安裝後,您會在所有自然語言輸入對話方塊中看到一個麥克風圖示。選擇它,向 Copilot 提出您的問題,享受這種魔力吧。

你覺得怎麼樣?!我告訴過你我的孩子非常聰明!

該擴充套件程式仍處於預覽階段,目前僅支援英語,但在接下來的幾個月中,我們將繼續使用新語言和功能對其進行更新。
更聰明地工作,而不是更努力地工作
以上所有內容以及更多內容都可以在今天的 VS Code 中使用!您只需要安裝 GitHub Copilot 擴充套件程式。您可以在我們的文件中瞭解有關 Copilot Chat 功能的更多資訊
謝謝!
Chris 和 VS Code 團隊
祝您智慧編碼愉快!
