靈碼是JetBrains或VSCode整合式開發環境(IDE)中嵌入的一款智能開發助手工具,旨在通過人工智慧技術簡化軟體開發過程,提升開發效率。本文將介紹在開發過程中如何深度體驗多種協助工具功能。其主要功能包括:通用大模型問答、產生單元測試、提供情境最佳化、編寫說明文檔,以及根據您的代碼產生高品質AI驅動的代碼等。這些功能為開發人員提供了顯著的便利與效率提升。
快速鍵的運用
預設快速鍵
靈碼的多個操作均配備了開箱即用的快速鍵,以下列出了幾項常用的快速鍵。
功能 | Windows快速鍵 | macOS快速鍵 |
在任意位置觸發補全 | Alt + P | Option + P |
更換產生的結果 | Alt + ] | Option + ] |
採納全部產生的程式碼 | Tab | Tab |
逐行採納產生的程式碼 | Ctrl + ↓ | Cmd + ↓ |
關閉/開啟對話面板 | Ctrl + Shift + L | Cmd + Shift + L |
此外,在靈碼的問答面板中,使用者可以通過使用 Cmd+Enter(適用於 macOS/Linux)或 Ctrl+Enter(適用於 Windows)來實現換行功能。請注意,直接按下 Enter 斷行符號鍵將立即將當前提問內容發送給模型。
使用更換產生結果快速鍵會提高產生的多樣性參數(temperature),有時能產生更長或更發散的內容。
自訂快速鍵
JetBrains IDE
首先開啟功能表列中的設定頁面。
在面板左側選擇“快速鍵”(Keymap),隨後找到“外掛程式”(Plugins)中的“TONGYI Lingma”子項,展開後即可查看和編輯相關快速鍵。

VSCode
請單擊 IDE 左下角的設定表徵圖,隨後選擇鍵盤快速鍵菜單。

在頁面中搜尋“Lingma”,即可查看和編輯所有快速鍵。
說明為了便於識別,VSCode 的大部分靈碼快速鍵都是以 TONGYI Lingma 命名的,但觸發內聯建議、顯示上一個/下一個內聯建議快速鍵複用了已經存在系統級功能項,因此命名風格上稍有差異。
配置的運用
配置面板
JetBrains IDE
JetBrains IDE 的配置面板位於設定頁面的頂級菜單“Lingma”板塊。可以通過單擊狀態列中的靈碼小表徵圖,迅速選擇“進階設定”項進行訪問。

VSCode
VSCode 的配置面板同樣可以從狀態列右下角的靈碼表徵圖點擊“進階設定”進入。
常用配置項
按檔案類型禁用自動補全功能。
如果某些類型的檔案在使用自動補全時產生幹擾,可將該檔案的尾碼類型添加至列表中。多種尾碼之間應使用英文逗號分隔(例如:txt,md)。
IDE
配置
JetBrains IDE

VSCode
說明禁用特定檔案類型的自動補全功能主要是指禁用自動補全觸發。然而,在檔案內通過快速鍵手動觸發補全(預設快速鍵為 Alt+P)時,仍然可以使用大模型的內容自動續寫產生的功能。
下拉提示時保留補全結果。
預設情況下,當 IDE 有基於文法的下拉補全提示時,靈碼會自動停止展示大模型補全內容,避免視覺上的衝突。

若希望靈碼總是產生大模型補全,可以勾選該配置項,效果如下圖所示,此時按下 Tab 鍵將會採納大模型的產生結果。

IDE
配置
JetBrains IDE

VSCode

產生長度控制。
靈碼支援將自動觸發和手工觸發的代碼續寫能力分別設定產生長度參數。通常建議將手工觸發(預設快速鍵 Alt+P) 設定得比自動觸發稍長。
IDE
配置
JetBrains IDE

VSCode
說明這個配置項只是設定模型允許產生的最大長度,若模型某次補全產生的內容長度原本就較短,通過修改此配置並不能讓模型產生的內容變長。
代碼注釋的運用
通過注釋引導補全產生
在缺乏額外注釋引導的情況下,模型只能基於當前代碼的上下文,以及專案中引用和找到的相似代碼來推測接下來可能要編寫的內容。當模型的推測不準確時,可以通過增加代碼的方式來引導模型實現所需的代碼。
例如,在以下這段代碼中,模型首先推測了一個
CHAT_CONTEXT欄位,然而並不是我們所期望的內容。
接下來,我們添加一行注釋,以指示模型下一個欄位為記錄。隨後,模型產生了符合預期的欄位及其相應的資料填充代碼。

使用描述產生方法
通過“編輯區的代碼注釋引導補全”或“使用靈碼問答面板”,均可實現基於注釋產生整個方法的目標。由於靈碼的智能問答情境所使用的模型參數量通常大於代碼補全模型的參數量,因此,對於這類情境,通常建議在問答面板中直接提出所需產生的問題描述。

如果對期望產生的語言或方法簽名(包括方法名、參數類型、傳回值類型)有特殊要求,請在提問時詳細描述該方法簽名。

跨檔案索引的運用
及時儲存檔案並更新索引
靈碼的跨檔案索引是抑制代碼幻覺的重要機制。通過自動識別當前上下文中所涉及的類型和方法定義,模型能夠感知專案中其他檔案的類型所包含的成員以及方法所具有的參數。在首次開啟新專案時,靈碼將自動建立專案的檔案索引。此後,每次儲存檔案時,將觸發單個檔案的增量索引更新。然而,由於整合式開發環境(IDE)中的檔案通常存在記憶體緩衝,在剛剛編寫完一個檔案後切換到另一個檔案時,可能因本地索引尚未更新而無法識別新增加或修改過的內容,仍然按照原有的類型結構進行推理。例如在某代碼專案中,我們為 Pet 對象新增了一個 saleable 屬性。

隨後切換至另一個檔案,嘗試讓大模型進行補全,但模型推理出的邏輯使用的是另一個不太相關的欄位。

若要消除這種資訊差異,建議在編輯完前一個檔案後,主動按下檔案儲存鍵
快速鍵Ctrl+S,然後再繼續編輯其他檔案。這樣產生的內容將能夠正確引用到修改過的對象結構。
針對MyBatis情境的最佳化方案
除了 Java、Python、JavaScript 等主流程式設計語言專案跨檔案引用功能,靈碼還支援在編寫 MyBatis 的 XML 檔案時自動識別 Mapper 對象所引用的表結構類型。例如,在編寫如下的 insert 語句時,會利用當前專案中的 TaxiOrder 類型資訊,確保產生的每個欄位都為正確的。

及時清理上下文資訊
適時清空上下文
在同一次會話中,前文的對話內容會在每次向大模型提問時,自動作為上下文提供給模型。當實際提問的是一個與前文無關的問題時,這些額外資訊可能會對模型的回答產生幹擾。
此時,使用者可以單擊問答面板頂部的建立會話按鈕,以在新的會話中進行提問,或使用/clear context命令清空上下文,以減少前文對後續問答的幹擾。
查看歷史對話記錄
在建立新的會話後,如需尋找之前提問的內容,可利用記錄功能返回至先前的話題,並繼續進行追問。
基於代碼提問
通用問答
若需要基於特定程式碼片段的內容進行提問,除了可以直接將代碼內容粘貼到問答區外,還可以先在代碼編輯器中選擇一段代碼,然後在問答區針對該段代碼進行提問,例如。
內建代碼任務
靈碼內建了四項代碼任務:解釋代碼、產生單元測試、產生代碼注釋和產生最佳化建議。靈碼大語言模型針對這些任務進行了專項訓練。例如,在產生單元測試的情況下,使用內建任務的效果優於先框選代碼後再輸入產生單元測試的方式。
代碼任務有三種使用方式。其中最常用的方式是在方法定義的開頭,點擊靈碼的小表徵圖,並在下拉選項中直接選擇所需執行的任務。
第一種方式,是使用IDE下拉式功能表的方法。
IDE
配置
JetBrains IDE

VSCode

第二種方式,選擇代碼後按右鍵滑鼠,並從操作功能表中選擇“通義靈碼”選項。

第三種方式,選擇代碼後在問答面板輸入斜線(/)以啟用內建任務菜單,接著選擇相應的任務。

提示詞的提示
在提問中引用所選代碼
在提問時,如果同時在代碼編輯區選擇了文本或程式碼片段,所選擇的內容將自動以 Markdown 引用格式附加到提問內容的末尾。因此,若在提示詞中提及所選擇的代碼,應使用“如下代碼”或“以下內容”,例如。
正確的說法:請檢查以下代碼是否存在下標越界風險。
錯誤的說法:請檢查選中的代碼是否存在下標越界風險。 (模型並不知道選中的代碼是什麼)
在使用命令時,請附加相關資訊。
通過在命令後追加更多的輔助資訊,可以為問答提供更為豐富的上下文,從而獲得更符合預期的回複。

通過多輪對話產生有效代碼
在與大語言模型進行對話時,提供的上下文越豐富,產生的結果越能符合使用者的預期。因此,使用者可以在上一輪對話的基礎上繼續進行問答,從而增加後續提問的上下文資訊,這樣產生的結果能夠更好地反映整個歷史上下文。然而,上一輪的歷史資訊有時可能會造成幹擾,此時使用者需要適時清空上下文。
在上一輪的基礎上,進一步進行深入追問。
為模型提供參考樣本
當需要模型按照指定格式輸出或遵循特定前置規則時,提供一個參考執行個體往往能取得更好的效果,而非僅用文字描述。例如,某一程式的運行結果檔案可以使靈碼整理成特定的 JSON 結構文檔。首先,開啟檔案並全選問題內容,然後在問答地區進行提問。對比下述兩種提示詞,後者能夠更穩定地輸出預期的資料格式。
提示詞1:將測試報告整理為JSON格式,每個測試結果為一個JSON結構。用例名稱應放置於name欄位,成功與否應記錄於success欄位,運行耗時需在duration欄位中體現(單位為毫秒),測試覆蓋率則應放置在coverage欄位。detail欄位的值為一個JSON,包含每次用例的輸入和輸出,分別存放於input和output欄位中。
提示詞2:將測試報告整理為JSON格式,具體格式參照輸入報告。
…報告內容略…應輸出的資料如下。請根據此樣本產生測試報告。
[ { “name”: “超出有效頁碼範圍時,應返回空列表並提示無更多資料”, “duration”: 3434, “coverage”: 80, “detail”: [ { “input”: “…”, “output”: “…” } ] } ]