AI 如何在不重新生成整個程式的情況下編輯程式碼?

以生成模型進行局部程式碼修改的實務研究指南:哪些部分應維持固定、哪些部分可以變更,以及將某項轉換稱為結構保留之前需要哪些證據。

分享本指南分享

問題的實質所在

程式碼編輯並非只是提示較短的程式碼生成。編輯器接收既有成品、預期變更與隱含的保留契約,因此核心問題包含兩個面向: 哪個區域可以變更,而其餘部分的哪些性質必須維持穩定?

本指南面向初次接觸 AI 輔助軟體編輯、且具備技術素養的讀者,並將局部編輯這一直觀概念,與語法、結構、語意及功能保留等更強的主張區分開來。

核心概念

範圍受限的編輯器不只需要生成目標,也需要明確的保留邊界。

必須維持不變的項目

所保護的對象可以是文字範圍、文法、API 簽章、AST 區域、測試行為、相依性契約,或學習所得的粗粒度表徵。每種選擇所維護的穩定性概念各不相同。

可變更的項目

可編輯區域必須具備足夠自由度,方能完成指定任務。複製所有內容的控制方法雖穩定卻毫無用處;重寫所有內容的方法則僅提供自由度,而欠缺局部性。

直觀模型:翻修一個房間,保留整棟建築

試想只整修一個房間,同時維持承重結構、管線介面與相鄰房間完整無損。完整重新生成就像僅憑口頭描述重建整棟房屋;局部編輯則會標示受保護結構、劃定有限的作業區域、執行變更,並在接受結果前加以檢查。

此類比不再成立之處。 學得的潛在編碼並非經認證的架構藍圖。固定粗粒度編碼可能提高量測到的結構穩定性,但不能保證特定 AST 節點、行為或介面維持不變。

更精確地理解部分再生成

令編碼器映射一個程式 x 轉換為結構化潛在表徵 z。保留遮罩會選取位置 L 予以固定。生成器僅對其互補位置取樣,同時強制維持 z'ₗ = zₗ 套用至每個鎖定位置。接著,解碼器將完整表徵映射 z' 回到原始碼。

此機制在詞元之上建立一個可檢視的控制介面,但其意義仍須透過實證確立:研究者必須測試鎖定位置在解碼後究竟保留了什麼,以及可編輯位置是否仍具足夠自由度。

四階段編輯工作流程

  1. 明定邊界

    識別受保護的區域或屬性,並界定預期變更。

  2. 表徵成品

    可使用文字、語法、檢索情境,或學習所得的粗粒度與細粒度編碼。

  3. 選擇性地重新生成

    在保留選定約束的同時,僅對可編輯位置進行取樣。

  4. 接受前先行驗證

    衡量局部性、語法、結構、行為及非預期副作用。

程式碼編輯、程式修復與受約束生成並非同一項任務

方法主要目標典型保留機制仍待驗證的項目
完整程式碼生成產生完整成品提示與上下文所要求變更範圍以外的一切內容
自動化程式修復移除已診斷的故障故障定位、測試、範本或修補程式現有測試以外的正確性與修補最小性
填補式模型或編輯模型修改選定的文字區域可見的前綴、後綴、差異或編輯情境非預期的結構與行為變更
受文法約束的解碼確保輸出符合形式語言符合文法的解碼狀態程式語意、任務正確性與局部性
階層式潛在控制重新生成選定的已學習位置已鎖定的粗粒度或細粒度潛在編碼這些編碼在解碼後保留了什麼

如何衡量局部性與結構保持

區域外變更
衡量所要求編輯範圍以外的差異。低數值可支持局部性,但僅是複製並不代表成功。
可編輯區域的自由度
衡量未鎖定區域是否確實改變,以及是否仍存在多個有效候選結果。
語法與文法
剖析成功率或文法有效性可偵測格式不當的輸出,但其本身無法說明行為是否正確。
結構不變量
比較任務指定必須保持穩定的簽章、AST 範圍、控制流程、資料流程、匯入項目或 API。
功能性證據
只要相關成品存在,即執行測試、靜態檢查、編譯及任務特定的行為評估。
多樣性與不確定性
報告候選結果的獨特性與重複執行的變異,以免將穩定性誤認為模式崩潰。

哪一種控制介面適合此編輯任務?

「不要重寫整個函式」是一項需求,而非完整方法。應先界定必須可預測的結果,再選擇相應的控制介面與佐證。

必要保證匹配度更高的控制介面應要求的證據
AI 輔助的行為保留重構先由 LLM 識別或提出轉換,再於可行情況下使用可信賴的重構引擎執行。參見 RefactoringMirror.編譯、測試、靜態檢查與重構偵測。 SWE-Refactor 在儲存庫層級明確實施這些檢查。
無須改寫整個函式的局部程式碼修改重用未變更的原始碼片段,並僅生成候選編輯區域,如同 EfficientEdit.區域外差異、任務成功與否、已接受詞元的重複使用,以及省略脈絡是否導致遺漏跨檔案變更。
面向軟體工程的受約束程式碼生成在解碼期間強制滿足形式性質,例如 受文法約束的擴散,或為有效前綴建立檢查點,並僅回復至造成問題的區域,如 Hydra.文法、編譯器或型別檢查器的通過情形,並結合功能測試、局部性、修復延遲及重新生成之有效程式碼量。
兼顧局部性與多樣性的選擇性 Python 函式再生成鎖定選定的粗粒度或細粒度潛在位置,僅對其餘位置進行取樣。評估解碼後的局部性、語法、結構不變量、編輯自由度、多樣性與不確定性。僅鎖定潛在表示並不能保證重構成功。
明確保留契約下的可預測程式碼生成在生成前界定可觀察的受保全屬性與通過/失敗檢查,再選擇能施行或呈現這些條件、且範圍最小的機制。解碼後應衡量上述確切屬性,並報告重複執行中的接受率、拒絕率與失敗率。僅採用確定性取樣並不能保證保存。

本指南回答的研究問題

這些精簡回答界定本指南全篇採用的主張範圍與證據邊界。

  1. 生成模型如何在不重寫整個函式的情況下修改程式碼?

    在生成前界定可編輯邊界,保全或重用邊界以外的原始碼,僅生成候選變更,並拒絕未完成任務或更動受保全區域的輸出。階層式潛在表示鎖定是一種實驗性控制介面,但不保證原始碼範圍完全相同。 比較局部編輯的控制介面.

  2. 哪些證據能表明程式碼編輯確屬局部變更,而非僅在語法上有效?

    除衡量所要求區域以外的差異,也應一併衡量任務成功與否、可編輯區域的變化、結構不變量、測試或靜態檢查,以及重複執行時的變異性。僅憑剖析成功率只能確認語法形式良好。 檢視局部性證據核對表.

  3. 程式碼編輯的局部性應如何與生成多樣性取得平衡?

    同時報告受保護區域的穩定性、可編輯區域的自由度,以及候選結果的獨特性。複製輸入雖能使穩定性最大化,卻可能對任務毫無進展;不受限制的改寫則可能使變更最大化,同時破壞局部性。 查看有界的穩定性—自由度證據.

  4. 局部程式碼編輯、受約束生成與程式修復有何差異?

    局部編輯著重於哪些內容必須維持不變;受約束生成會強制輸出符合某種形式屬性,例如隸屬特定文法;程式修復則要求變更滿足缺陷或任務規格。僅憑語法無法證明語意等價、功能正確、任務成功或局部性。 比較三項目標.

  5. 如何只重新生成 Python 函式的指定部分,同時維持其餘部分穩定?

    生成前先界定受保護區域與可編輯區域,只修改可編輯的表徵,完成解碼後,拒絕任何更動受保護程式碼,或未通過語法、測試、靜態檢查或任務特定不變量的候選結果。文中階層式潛在表徵實驗衡量的是 64 詞元函式上的機率穩定性,並不保證指定範圍或行為維持不變。 檢視選擇性重新生成工作流程.

  6. 何種控制策略適合 AI 輔助的行為保留重構?

    使用模型識別或提出轉換;在可行時,再以可信賴的重構引擎執行,並驗證編譯、測試、靜態檢查及預期重構。看似合理的生成修補程式本身並不足以構成證據。 開啟重構決策列.

  7. 什麼使程式碼生成具可預測性,而不只是可控制?

    選擇生成器前,先明定可觀察的保留契約與驗收檢查。可預測性取決於解碼並驗證後哪些內容仍保持穩定,而不只取決於提示、遮罩、文法或潛在碼是否固定。 界定保留契約.

目前實驗能說明什麼——以及不能說明什麼

收錄於 結構保持軟體重新生成的可檢視控制,階層式 VQ-VAE 將 64-token Python 函式映射至 16 個頂層與 32 個下層離散位置。鎖定四個頂層編碼後,剖析成功率由 0.453 至 0.591,而未鎖定位置仍以此比率發生變更: 0.936 ,且條件式樣本仍維持 唯一性 0.998.

這是在一個小型設定下量測到穩定性與自由度權衡的證據;它並不保證精確保留 AST、語意等價、功能正確、修復成功,亦不保證儲存庫規模下的行為。

配套研究 壓縮式短文本生成的品質從何處開始劣化 帶來一項重要的評估啟示:潛在空間代理指標的改善未必能改善解碼輸出。表示、生成與解碼後行為應分階段檢查。

可重複使用的決策程序,請參閱配套指南中關於 區分編解碼器損失與生成器損失.

常見誤解

「能通過剖析,所以就是正確的。」

剖析僅能證明語法形式良好;程式仍可能違反測試、契約或原始意圖。

「粗粒度編碼就是 AST 節點。」

除非已證明存在明確對齊,否則不能如此認定。學得的編碼可能混合多種表層與結構因素。

「鎖定潛在變數就表示原始碼文字不變。」

解碼是全域且經由學習而得。固定潛在位置可提高穩定性,但不保證文字範圍完全相同。

「變更越少一定越好。」

原樣複製輸入的編輯器雖能達到完全穩定,卻無法推進任務。因此,局部性與編輯成功率必須一併量測。

後續閱讀

鄰近研究採用不同的控制介面;若未先對齊任務,不應將其中任何方法視為可互換的基準。

  1. Self-Edit: Fault-Aware Code Editor for Code Generation

    將生成視為可編輯的過程,並以偵測到的錯誤引導修正。

  2. Coeditor: Leveraging Contextual Changes for Multi-round Code Auto-editing

    對多輪編輯之間具脈絡關聯的程式碼變更進行建模,而非每次皆從頭重新生成。

  3. PAFT: Preservation Aware Fine-Tuning for Minimal-Edit Program Repair

    在程式修復訓練中明確納入保持與最小變更。

  4. Constrained Decoding of Diffusion LLMs with Context-Free Grammars

    說明形式約束如何在擴散解碼期間提供語法保證。

  5. 神經離散表徵學習

    介紹 VQ-VAE,此為學習離散潛在表示的基礎機制。

  6. Simple and Effective Masked Diffusion Language Models

    提供配套診斷研究中用作潛在生成器的遮罩式離散擴散框架。

  7. LLM 在自動化軟體重構中之潛力:實證研究

    找出 LLM 所提議的不安全重構,並評估透過可信賴的重構引擎重新套用所偵測轉換的成效。

  8. SWE-Refactor: A Repository-Level Benchmark for Real-World LLM-Based Code Refactoring

    透過編譯、測試與重構偵測,評估保存行為的儲存庫層級重構。

  9. EfficientEdit:透過編輯導向的推測式解碼加速程式碼編輯

    重用未變更的原始碼區段並預測編輯位置,而非將編輯視為完整的自迴歸再生成。

  10. Hydra:透過檢查點與回復支援實現高效且正確的程式碼生成

    採用靜態檢查、檢查點與針對性回復,避免在發生錯誤後重新生成原本已有效的前綴。

簡短回顧

局部程式碼重新生成是下列各方之間的契約: 變更 以及 保存。階層式離散潛在變數提供了一種可檢視的契約表達方式;然而,唯有從局部性、語法、結構、行為、多樣性與不確定性等面向評估解碼後的程式,這種表示才具有實用價值。

此研究方向的出版成果