← All posts / Research

把程式碼變教材:小米與港大的 CodeMidas 只靠原始碼就造出 5,545 個 RL 環境

小米 MiMo 團隊與港大等機構的新論文證明:不需要 issue、不需要 commit 紀錄、不需要文件,單靠現有原始碼就能自動建構數千個可驗證的 RL 訓練任務,讓 MiMo-V2.5 在五個程式碼基準上全面提升。

把程式碼變教材:小米與港大的 CodeMidas 只靠原始碼就造出 5,545 個 RL 環境

用強化學習(RL)訓練程式碼代理(coding agent)的每個實驗室都會撞上同一道瓶頸:RL 需要成千上萬個多樣化的任務,而每個任務都需要一個可靠的驗證器(verifier),能分辨「真正正確的解法」與「看起來很像對的錯誤解法」。業界標準做法是去挖開發歷程的副產品——GitHub issue、pull request、commit 紀錄——因為它們天然自帶任務描述(issue 本文)與標準答案(diff)。問題在於覆蓋率:只有開發者剛好留下紀錄的地方,才做得出訓練任務。

小米 LLM Core 團隊與北京大學、香港大學、中國人民大學的研究人員在 9 月 18 日發表的論文提出了更激進的起點。CodeMidas(arXiv:2609.22068)只以原始碼本身作為任務特定的輸入,就能建構可執行的 RL 環境——不需要 issue、不需要 commit 歷史、不需要文件。這個名字正是向其能力致敬:如同點石成金的 Midas 之手,它把既有的平凡程式碼轉化為訓練用的黃金。

為什麼現有方法會撞上天花板

論文的相關工作部分把這個領域梳理得很清楚。SWE-bench 式的管線直接從 issue 和 pull request 衍生任務描述;R2E-Gym 從 commit 產生任務;SWE-smith 用突變程式碼的方式合成 bug,直到現有測試掛掉為止;MindForge 則依賴文件加上參考程式。這些方法全都把任務生成綁死在「有留下紀錄的變更、測試或文件」上——這意味著開源程式庫中已經實作完成、正常運作的大量功能,對訓練而言完全是隱形的。

CodeMidas 把邏輯倒轉過來。已實作的功能本身同時包含任務的基礎與候選答案:公開介面與可觀察行為定義了代理該做什麼,而執行原始程式碼則提供測試預期的證據。周邊的程式庫可以改寫成一個寫實的開發起點,保留真實的專案結構與相依套件。

一條由代理建造、給代理用的管線

這套管線最特別的地方,是每一個階段都投入了代理運算:

  1. 任務設計與程式庫改編 — 代理探索儲存庫中已實作的功能,圍繞它撰寫行為式的任務描述,並把程式庫改寫成「目標功能尚未實作」的起始狀態。任務描述刻意採行為式:明確規定必需的行為,但保留內部實作方式的自由,才不會誤殺其他正確解法。
  2. 以執行為本的測試建構 — 代理實際執行原始程式碼後據以撰寫測試,並用一致性檢查確保測試編碼的是真實行為而非憑空猜測。
  3. 環境準備 — 每個任務都附帶可執行的開發環境,候選任務必須在全新容器中通過執行檢查。驗證協議相當嚴格:從起始程式庫出發跑兩次必須失敗,裝上參考解法後跑四次必須通過——以此淘汰不穩定的環境,並確認「失敗轉通過」的轉變確實存在。
  4. 訓練後過濾 — 對抗式 rollout 用來探測可利用的漏洞(不通過真正實作也能讓測試過關的捷徑),解法審查把驗證器的判定與任務要求核對,rollout 成功率則指引最終的任務篩選。

最終成果:從 3,185 個開源程式庫中萃取出 5,545 個可驗證的訓練任務,橫跨 23 種程式語言與 15 個技術領域。Python 佔 21.4% 居冠,其次為 TypeScript(18.3%)、Go(16.2%)、C++(12.5%)與 JavaScript(11.3%)。領域方面,系統軟體(17.4%)、網路技術(14.6%)與開發者工具(13.6%)合計佔了近半資料集。

實測數字

團隊用 GRPO 演算法、二元執行獎勵(通過即 1、失敗即 0)在完整任務集上訓練小米的 MiMo-V2.5——不用獎勵模型、不用學習出來的驗證器。結果在全部五個外部基準上都有提升:

  • DeepSWE(issue 修復):通過率從 10.0% 升至 21.7%(+11.7 個百分點)
  • ProgramBench(完整程式建構):Almost Solved 分數從 4.5 升至 21.5(+17 分)
  • Terminal-Bench v2.1(終端機作業):通過率從 63.7% 升至 72.2%(+8.5 個百分點)
  • 在 SWE-bench Pro 與 RepoZero C2Rust(程式碼翻譯)上同樣有斬獲,完成了橫跨儲存庫修復、程式碼翻譯、程式建構與終端作業的全面勝利。

這種遷移能力正是論文的關鍵發現:從既有功能建構出來的任務,能夠泛化到形式上與訓練任務毫不相似的軟體工作。在留出的 CodeMidas Val 驗證集(200 個與訓練集互斥的任務)上,通過率從 35.0% 升至 44.7%,且從訓練第 40 步起就穩定高於初始策略 8 到 10 個百分點。

品質勝過數量

論文中一項極具實務價值的消融實驗,比較了任務規模與任務品質。用 1k → 3k → 5,545 個過濾後的高品質任務訓練,在 SWE-bench Pro、DeepSWE 與 CodeMidas Val 上的分數逐步上升。更值得注意的是:3k 個過濾後的任務,表現勝過 8k 個未過濾的基準——後者是環境清理、執行一致性檢查與訓練後過濾之前抽樣的約 8,000 個任務——三項評估全面領先。完整過濾資料集比原始 8k 樣本分別高出 0.59、4.59 與 4.49 個百分點。在程式碼 RL 環境建構中,過濾管線不是額外開銷,它本身就是產品。

代理學會了怎麼工作

分數之外,軌跡分析同樣引人深思。比較訓練前期與後期的 rollout,經 RL 訓練的代理不只是答對率變高,連工作方式都變了:

  • 程式庫探索(第一次編輯前的讀取/搜尋呼叫次數)從 27.2 次升至 40.1 次
  • 程式碼草擬率(寫下的程式碼中事先推理過的比例)從 0.358 升至 0.629
  • 編輯後執行的自我驗證指令種類從 2.03 種升至 2.53 種

代理在動手之前讀得更多、規劃程式更縝密、驗證自己作品的方式也更多元——而且這些行為轉變同樣出現在留出的外部任務上,證明這是真正的泛化,而非對基準的過擬合。

為什麼重要

時機點值得注意:這篇論文發表在業界「代理」熱潮高漲之際(AI Weekly 的實體追蹤器顯示本週代理相關報導暴增逾 900%),以及程式碼 RL 基礎設施的平行爆發。CodeMidas 的主張——數億行已寫好的開源程式碼構成了一座大致未開採、可自我驗證的教材寶庫——在經濟上意義重大,因為它把任務供給與開發副產品的存在與否脫鉤。任何程式庫,無論文件多麼稀疏,都成了潛在訓練資料。

當然有限制。建構環境本身就要消耗代理運算,這條管線等於是把人工標註成本換成推論成本。行為規格是模型寫的,驗證器品質的上限因此受制於建構代理自身的理解程度。而「失敗轉通過」的驗證協議雖然嚴謹,卻意味著原始程式碼行為不一致的任務會被剔除——這是合理的篩選,但也塑造了資料分布的樣貌。

儘管如此,方向已經很明確。正如論文所言,這些結果「確立了原始碼作為建構 RL 環境之可擴展基礎的地位」。當下一世代的程式碼代理在陌生儲存庫中導航的能力明顯變強時,像這樣的課程——挖的不是開發者關於程式碼寫了什麼,而是程式碼本身——將是原因的一部分。