一項新的基準測試將程式碼搜尋與實際修復分開評估,揭露了 AI 程式碼代理的一個隱藏弱點。這些代理雖然能找到正確的程式碼區域,卻錯失了關鍵的修復點。
直到現在,AI 程式碼的表現大多是根據結果來判斷:代理是否修復了錯誤?然而,這個單一指標隱藏了實際問題所在。也許代理從未讀取相關程式碼,或者它看到了正確的檔案卻仍然寫出錯誤的修補程式。無論哪種情況,最終結果看起來都一樣。
一個由上海交通大學參與的國際研究團隊,正透過 SWE-Explore 解決這個盲點。這個基準測試僅評估程式碼修復過程的第一階段。代理會收到一個錯誤描述和一個軟體專案,然後回傳一份它認為相關的程式碼區塊排名清單。
傳統基準測試只測量修復率,無法揭示代理是否讀取了相關程式碼。SWE-Explore 則將這個上游的搜尋階段獨立出來進行評估。
要手動找出哪些程式碼區塊真正重要幾乎是不可能的任務。因此,研究團隊採取了不同的方法。對於資料集中 848 個問題中的每一個,至少有兩個來自強大模型(如 GPT-5.4、Gemini 3 Pro、Claude Sonnet 4.6 或 Kimi K2.6)的成功解決方案。
研究人員從這些執行記錄中提取出 AI 在修復錯誤之前實際檢查了哪些檔案和程式碼行。多個獨立解決方案路徑匯聚的程式碼段落,被視為有用上下文的訊號。這些段落並非嚴格要求,但強烈暗示其重要性。一個獨立的驗證步驟會補齊個別的關鍵段落,然後團隊會再次手動審查每個區域。
研究團隊並非手動定義必要的位置,而是從成功解決方案的讀取軌跡中推導出其參考基準。第二項測試則檢查更好的搜尋分數是否也能帶來更成功的修復。
該資料集涵蓋了來自十種程式語言的 203 個開源專案。在 848 個任務中,Python 佔了 547 個,其次是 Go、JavaScript 和 Rust。
這項比較將傳統搜尋方法與五個通用程式碼代理(包括 Claude Code、Codex 和 OpenHands)以及四個專為程式碼搜尋而建構的研究系統進行對比。
傳統的關鍵字搜尋幾乎只比隨機猜測好一點。在一項案例研究中,作者們解釋了原因。例如,「RuntimeWarning on Overflow」這樣的錯誤描述,其術語在專案的範本和文件中出現的頻率遠高於實際原始碼。AI 代理則明顯表現更佳,因為它們是逐步搜尋專案,而非一次性排序所有匹配結果。
程式碼行層級的準確度急劇下降。
在檔案層級上,代理的表現尚可。它們能找到正確的原始碼檔案,並將其提前排序,保持選擇的精確性。然而,一旦測試聚焦到單獨的程式碼行,系統的表現便會崩潰。通用程式碼代理只能覆蓋實際關鍵程式碼行的 14% 到 19%。
對於特定任務,代理的排名命中清單會與從成功執行中提取的核心區域進行比較。在檔案層級上,命中率很高,但程式碼行層級的覆蓋率仍然參差不齊。
即使使用更強大的語言模型也無法解決這個問題。研究團隊使用來自 OpenAI、Anthropic、Google、Moonshot 和 Zhipu 的六種不同模型來執行相同的代理。GPT 系列表現領先,但模式依然存在:檔案命中率始終高於實際的程式碼行覆蓋率。
各種代理架構的表現驚人地接近。Claude Code、Codex、OpenHands、Mini-SWE-Agent 和 AweAgent 在所有指標上都取得了幾乎相同的分數。
CoSIL 研究系統是個例外。它將程式碼視為相互連接的構建塊網路進行掃描,並實現了更高的程式碼行覆蓋率。在專門的定位系統中,AutoCodeRover 運作精確但較為保守,而 OrcaLoca 產生的雜訊較少,卻錯過了許多相關位置。
修復在最低上下文閾值以下會失敗。
在一項受控的消融實驗中,研究團隊人為地改變了上下文。修復模型只看到了 0%、25%、50%、75% 或 100% 的核心區域,有時還會加入不相關的非核心程式碼。對於資料集中較簡單的任務,出現了明顯的閾值效應。只要可見的必要核心區域少於一半,修復大多會失敗。
成功率僅在覆蓋率達到 50% 到 75% 之間時才會顯著提升。修復並非逐步改善,而是需要最低限度的線索才能奏效。對於較困難的任務,這種效應則窄得多。如果問題本身已經超出模型的能力範圍,即使提供更好的上下文也幫助不大。
一旦關鍵位置可用,不相關的額外程式碼幾乎不會造成阻礙。讀取太少的代理表現會比讀取太多的代理更差。未來改進的方向很明確:減少過濾,增加讀取。相關程式碼和資料可在 GitHub 和 Hugging Face 上取得。
大約兩年前,一個研究團隊創建了 SWE-bench,這是一個針對真實 GitHub 問題報告來測試 AI 程式碼代理的基準測試。這催生了一系列涵蓋更多語言、更乾淨資料和更困難專業任務的變體。然而,最近其底層的成功指標受到了多方質疑。研究機構 METR 的一項研究發現,專案經理會拒絕自動審查員接受的大約一半解決方案,其中許多是因為基本的程式功能錯誤。
