模型真的能「反思程式碼」嗎?北航發布倉庫級理解生成基準,刷新大型語言模型理解評估範式

大型語言模型(LLMs)在程式碼理解和生成領域取得了長足進步,能夠跨越多種程式語言提供智慧回饋、偵測潛在錯誤並基於人類指令更新程式碼片段。程式碼反思(Code Reflection)作為 LLM 檢查並修改其先前回應的能力,顯著提升了開發效率和程式設計可存取性。

儘管 HumanEval、LiveCodeBench 等基準測試評估了程式碼生成和現實相關性,但現有工作忽略了在程式碼倉庫中修改程式碼的實際場景。

考量到提高反思能力和避免動態基準中資料污染的挑戰,本文提出了 LiveRepoReflection,一個挑戰性基準,用於評估多檔案倉庫情境中的程式碼理解和生成能力,包含跨 6 種程式語言的 1,888 個經過嚴格篩選的測試案例,確保多樣性、正確性和高難度。

我們建立了 RepoReflection-Instruct,一個大規模、品質過濾的指令調整資料集,用於訓練 RepoReflectionCoder,透過涉及程式碼生成和錯誤驅動修復的兩輪對話過程。我們的排行榜評估了超過 40 個 LLMs,綜合反映了模型在基於倉庫的程式碼反思方面的表現。

圖像:模型評估流程圖

專案首頁: http://livereporeflection.github.io/

論文標題: Turning the Tide: Repository-based Code Reflection

評測資料: https://github.com/LiveRepoReflection/LiveRepoReflection

程式碼連結: https://github.com/LiveRepoReflection/LiveRepoReflection-Project

圖像:背景說明

背景——倉庫級程式碼反思任務

圖像:程式碼反思與傳統程式碼生成任務比較

與傳統程式碼生成任務相比,程式碼倉庫反思面臨更為複雜的挑戰。如上圖所示,相較於從頭生成程式碼的簡單任務,倉庫反思要求模型理解多檔案的依賴關係,並能根據編譯或執行時錯誤進行系統性的程式碼修改。

LiveRepoReflection 基準透過設計嚴格的評估流程,測試模型是否能夠:

1. 理解完整倉庫結構和多檔案依賴關係

2. 根據錯誤資訊進行有針對性的程式碼修改

3. 在不同程式語言間保持一致的高效能

圖像:自動動態管道建構流程圖

自動動態管道建構

為避免資料污染和基準過度擬合問題,作者提出了一套自動動態的資料建構流程:

1. 從 Exercism 等來源提取倉庫程式碼,優化倉庫檔案結構

2. 從 GitHub、Hugging Face 和 Stack Overflow 等公開來源收集程式碼片段

3. 按程式語言篩選資料

4. 使用隨機選擇的「創意型」 LLM 從種子資料生成程式主題和定義

5. 使用多個「推理型」 LLM 生成單元測試和參考解決方案

6. 交叉執行驗證每個單元測試-解決方案對,篩選異常,保留通過率最低的測試和通過率最高的解決方案

7. 將所有內容打包為最終的倉庫結構

圖像:資料建構流程圖

這一流程確保了基準的高品質和動態更新能力,有效防止了模型對特定資料集的過度擬合。

同時,我們盡可能標準化倉庫結構,提供了 Python,Java,Rust,CPP,Go 和 JavaScript 共六種程式語言的標準結構。

圖像:程式語言支援圖示圖像:LiveRepoReflection評測基準

LiveRepoReflection 評測基準

為確保 LiveRepoReflection 的品質和難度,研究團隊採用了嚴格的篩選流程:

1. 可執行程式篩選:從自動流程生成的 10 萬個倉庫案例中,在沙箱中運行,包括環境設置、編譯和測試,剔除所有 LLM 都能通過或運行時間超過 180 秒的案例,保留 1 萬個高難度、高正確性的案例。

2. 難度篩選:10 個主流強推理 LLM 對每個程式碼程式案例進行測試,每個 LLM 有一次修改機會。根據通過率將案例分為「簡單」、「中等難度」和「高難度」,保留 2300 個高品質、高難度、高多樣性的案例。

3. 人工標註:8 位研究生在完整程式碼運行沙箱環境中對每個案例進行檢查,確認程式碼程式案例的合理性、環境配置、檔案結構、參考答案和單元測試的正確性,最終保留 1,888 個測試案例。

圖像:測試案例篩選流程圖圖像:LiveRepoReflection與Aider Polyglot基準比較圖

與現有 Aider Polyglot 基準相比,LiveRepoReflection 在多個維度上實現了顯著提升:問題數量增加了 8 倍以上,提供了更豐富的問題描述和範例情境,平均每個倉庫包含更多檔案,更真實地模擬了實際程式碼庫的複雜結構。

圖像:RepoReflectionCoder訓練流程圖

RepoReflectionCoder 訓練

為訓練高效能的 RepoReflectionCoder,研究團隊建構了 RepoReflection-Instruct 指令語料庫:

1. 高品質資料篩選:從約 50 萬個自動管道生成的程式碼範例中,透過嚴格的拒絕採樣保留符合五項標準的高品質資料:

至少一個單元測試檔案

至少一個參考答案檔案

程式碼簽章檔案數與參考答案檔案數匹配

環境設定檔案與聲明的程式語言一致

檔案命名和擴展名標準化

2. 品質評分機制:使用加權評分函數評估每個程式碼程式,考量執行能力、新穎性、難度、程式碼風格和困惑度的逆向指標。

3. 資料去污染:透過 MinHash 演算法和 LSH 索引高效過濾與測試集相似度高於 0.8 的候選文本,確保訓練資料與測試集的純淨度。

4. 多輪互動生成:使用四個頂級模型模擬 84 萬多輪編碼對話,包括直接生成(40%)、錯誤驅動修復(40%)、風格標準化(10%)和對話總結(10%)。

圖像:RepoReflectionCoder多輪互動訓練示意圖

實驗結果

圖像:實驗結果表格1圖像:實驗結果表格2圖像:實驗結果表格3

實驗評估了 GPT-4.5、Claude-3.7、OpenAI o 系列 / GPT4 系列、Gemini、Qwen 系列以及 Grok 等 40 多個 LLM,採用四個關鍵指標:

1. Pass@1:LLM 首次嘗試完成的編碼任務比例

2. Pass@2:查看失敗程式碼和錯誤訊息後二次嘗試的成功率

3. 修正權重(FW):二次嘗試成功中錯誤診斷和修正的相對貢獻

4. 格式合規(WF):LLM 嚴格遵循系統提示中指定編輯格式的百分比

圖像:模型表現比較圖1圖像:模型表現比較圖2

結果顯示:

1. 領先的閉源模型在一次性和回饋後準確率方面始終表現最佳

2. 開源模型表現落後,但在允許二次嘗試時顯示類似的相對提升

3. 各系統發現 Python 任務最簡單,而 C++ 和 Rust 最具挑戰性

4. 幾乎每個模型的格式合規率都超過 90%

5. RepoReflectionCoder 明顯優於基礎 Qwen2.5-Coder,但仍落後於頂級閉源表現者。

與 Aider Polyglot 基準相比,LiveRepoReflection 更具挑戰性,幾乎所有模型在新基準上的表現都低於舊基準,證明了其更高的難度水平和對真實世界程式碼生成與修復能力的評估價值。

圖像:結論與展望

結論與展望

本研究提出了 LiveRepoReflection,一個針對多檔案程式碼倉庫理解和生成的高難度基準,透過自動化流程和人工驗證確保了測試案例的多樣性、正確性和挑戰性。同時,研究團隊建構了 RepoReflection-Instruct 指令集並訓練了 RepoReflectionCoder,在基於倉庫的程式碼反思能力方面取得顯著性能提升。

實驗結果表明,LiveRepoReflection 能夠真實有效地測量模型在跨檔案依賴和迭代修復場景中的反思和修復能力,為後續研究提供了堅實基礎。儘管模型性能還有提升空間,但本研究為多檔案倉庫程式碼理解和生成樹立了新的標準。

作者與機構

張蔚的肖像

張蔚,北京航空航天大學和上海人工智慧實驗室聯合培養在讀博士一年級,主要研究方向為程式碼智慧,曾經在通義千問實習。

楊健的肖像

楊健,北京航空航天大學電腦學院副教授,在 ICLR、NeurIPS、ACL 等國際期刊/會議發表第一/通訊作者 20 餘篇,谷歌學術引用 8000+ 次,並擔任 NeurIPS、ACL 等國際會議的領域主席。曾作為阿里星入職 Qwen,積極推動程式碼大型模型開源。

李舟軍的肖像

李舟軍,北京航空航天大學電腦學院教授,資訊安全系主任,智慧資訊處理研究所副所長。國務院學位委員會首屆網路空間安全學科評議組成員,中國人工智慧學會語言智慧專委會副主任委員,深圳智慧思創創始人與首席科學家。

主標籤:大型語言模型

次標籤:程式碼反思程式碼生成程式碼理解基準測試


上一篇:ReaGAN:讓圖中每個節點都成為智能推理專家

下一篇:注意力總是發散?人大與清華大學聯合提出LeaF:移除干擾型Token,引導模型學會自主聚焦

分享短網址