ExpeRepair團隊 投稿
量子位 | 公眾號 QbitAI
AI 學會像人一樣修復錯誤了!
「這個錯誤我上週才剛修正過」「這個錯誤訊息怎麼又出現了」「新人怎麼又在同一個地方踩雷」……
如果你是程式設計師,是否經常遇到這些令人抓狂的場景?
現有的 AI 修復工具就像「金魚」,只有 7 秒記憶,每次遇到問題都從零開始。人類工程師最大的優勢,恰恰是能從歷史經驗中快速找到解決方案。
而現在,這個優勢被 AI 學會了:
ExpeRepair——具有「雙重記憶」的倉庫級缺陷修復系統,它透過模擬人類認知的兩種記憶模式:
- 情境記憶:儲存歷史修復案例(如「具體如何修復 Sympy 專案的安全漏洞」)
- 語義記憶:提煉高階修復策略(如「處理資源洩漏時需同時關閉檔案和釋放句柄」)
當遇到新問題時,ExpeRepair 會同時喚醒兩種記憶:從情境記憶中調取相似案例作為參考,從語義記憶中提取通用策略指導決策,動態生成量身定制的修復方案。
在權威評測 SWE-Bench Lite 上,ExpeRepair 以 60.33% 的修正率登上榜首:
這項研究由來自中國科學院軟體研究所的團隊提出,以下是更多細節。
揭密 ExpeRepair「最強大腦」
1、雙重記憶系統:像人類一樣學習
ExpeRepair 模擬人腦的兩種記憶模式:
1)情境記憶:
記錄具體的修復案例,儲存完整修復軌跡(問題描述、測試腳本、修復程式碼、驗證結果),包含成功和失敗案例,形成正反兩方面經驗。
2)語義記憶:
提煉抽象的修復策略,透過 LLM 自動總結高階經驗,例如「處理檔案操作時,必須同時考慮權限檢查和資源釋放」。
2、動態知識更新:越用越聰明
記憶系統會持續進化:
1)新增:發現全新問題模式時添加新經驗
2)合併:優化相似經驗的表述
3)淘汰:刪除過時或矛盾的經驗
同時,保持記憶庫精煉(不超過 15 條核心策略)。
3、智能檢索:精準匹配歷史經驗
遇到新問題時,像資深工程師一樣「借鑒」歷史解決方案:
1)透過 BM25 演算法快速匹配相似歷史問題
2)提取 top-3 最相關的修復案例
3)結合抽象策略生成動態提示
拆解 ExpeRepair 修復流程
ExpeRepair 將複雜的自動程式修復問題分解為三項任務:測試生成、補丁生成和補丁驗證。
它採用兩個智能體,即測試智能體和補丁智能體,透過協作來處理這些任務,這與人類開發人員分類和解決軟體問題的方式相似。
測試生成
重現測試對於證明問題的存在以及驗證候選補丁的正確性都至關重要。
現有的方法通常僅根據問題描述生成重現測試腳本,這存在兩個主要局限性:
(1)由於遺漏依賴項、配置或特定環境設置,導致執行頻繁失敗;
(2)問題重現不充分,因為這類腳本往往僅狹隘地針對問題描述中的症狀,而沒有捕捉更廣泛的故障背景。
ExpeRepair 透過使測試智能體能夠基於動態回饋和從過去修復軌跡中累積的記憶,迭代地生成和優化重現測試,來解決這些局限性。
具體而言,智能體首先從情境記憶檢索出最相關的演示案例,這直接解決了局限性(1):當前測試執行遇到失敗(例如,缺少函式庫或配置錯誤)時,與相同或類似失敗相關的演示案例提供了過去成功處理這些失敗的具體範例。然後,智能體會從語義記憶中提取所有總結性的自然語言見解,這些見解捕捉了從先前修復中提煉出的可推廣的高級策略。例如:「在測試安全敏感功能時,實施全面的測試用例,驗證對惡意輸入、邊緣情況和潛在攻擊向量的正確處理,確保進行穩健的驗證和適當的錯誤回應」。這些見解透過將智能體的推理擴展到狹隘地重現所述症狀之外,幫助解決了局限性(2)。
補丁生成
在成功重現問題後,ExpeRepair 會啟動補丁生成流程,以生成能夠解決故障同時保留現有功能的候選修復方案。
在生成補丁之前,首先確定問題發生的位置至關重要,本方案採用了一種分層定位策略:首先根據問題描述和程式碼庫結構識別可疑檔案,然後在已識別的檔案中定位具體的故障程式碼行。
正如先前的研究所指出的,LLM 生成的補丁往往不完整,因為修復一個程式碼庫級別的問題通常需要協調程式碼多個部分的變更,或者執行一系列修改操作。
為解決這一問題,與測試生成過程類似,ExpeRepair 會迭代地呼叫情境記憶和語義記憶,並利用這些記憶來生成和優化補丁。補丁智能體會按照測試生成階段相同的流程,檢索相關的演示案例並提取反思性見解。
補丁驗證
當候選補丁成功透過重現測試後,並不會立即被採納為最終補丁。
這是因為團隊透過實證觀察發現,重現腳本通常僅狹隘地聚焦於問題描述中的特定症狀,這可能導致誤判——即補丁雖能透過有限的測試,卻在更廣泛的場景中失效。為緩解這一問題,ExpeRepair 會提示補丁智能體對補丁進行修訂和增強,以解決邊緣情況處理、回歸風險以及是否符合特定語言最佳實踐等問題。
接下來,團隊會透過生成額外的驗證測試來擴充重現測試套件。測試智能體會被要求建立針對邊界條件和極端情況的測試。這一過程能夠降低那種僅解決報告的表面症狀、卻未全面處理潛在缺陷的狹隘且脆弱的修復方案出現的風險。
在選擇最終補丁時,ExpeRepair 首先會讓所有候選補丁在包含重現測試和驗證測試的擴展測試套件中執行。然後,將候選補丁及其相應的測試結果提交給專門的審查智能體,該智能體會根據正確性、是否符合最佳實踐等標準來選擇最終的補丁。
實戰效果
以下是部分實驗結果。
在 SWE-Bench Lite 上,ExpeRepair 採用 Claude-3.5 Sonnet + o4-mini 能夠取得 48.3% 的修復通過率,超越採用同類模型的其他方法。
採用 Claude-4+o4-mini 能夠取得 60.3% 的修復通過率,位於 SWE-Bench Lite 榜首。
實驗還表明,不管將情境記憶還是語義記憶去掉,都會帶來顯著的效能下降。