重點
- 浙江大學 Lingfeng Bao 等人的 arXiv 論文 2610.28069(部分工作在 LIGHTSPEED 實習期間完成)提出 HarnessAdapt-RL:用 GRPO 訓練 coding agent 的同時,讓另一個模型依當前策略的軌跡改寫工具與執行期 hook。
- 修改只在「通過率或可訓練率至少一個上升、另一個沒有下降」時採用。可訓練率衡量的是有多少 rollout 能為 GRPO 提供獎勵差異。
- Qwen3.5-9B 上,pass@1 比純 GRPO 高 9.8(SWE-bench Verified)、12.6(Multilingual)、6.4(Pro)個百分點,也贏過用 OpenHands 人工 harness 訓練的 GRPO。
- 訓練時的提示只講修復機制、不給檔案與程式碼時效果最好;直接給接近答案的提示,訓練成功率較高,拿掉提示後反而比 GRPO 差。
- 訓練產出的是一組模型加工具:部署時拿掉演化出的工具與 hook,權重不變,pass@1 最多掉 7.7 個百分點。每種配置只訓練一次。
要解決的問題
coding agent 由兩部分組成:模型決定動作,harness 提供指引、工具與執行回饋。常見的訓練只更新模型、harness 固定。另一條路線(Meta-Harness、HarnessEvolve 等)反過來,固定模型只優化 harness。Co-Harness 則是輪流更新 harness 與對軌跡做 SFT。
作者的觀察是,訓練過程中暴露的問題會隨著策略改變。一個例子:第二個 epoch 時策略跑的驗證測試變少,即使測試工具與提醒都還在。
| 配置(第二個 epoch 的 harness) | 第 1 epoch | 第 2 epoch | 變化 |
|---|---|---|---|
| GRPO(H₀) | 2.87 | 1.58 | −45% |
| Skill-Mechanism(H₀) | 3.16 | 1.78 | −44% |
| H₁+Mechanism(H₁) | 2.83 | 1.21 | −57% |
(每條訓練軌跡平均執行測試次數,取各 epoch 前 10 次更新。)
固定的 harness 跟不上這種變化,所以他們讓 harness 在強化學習中途跟著調整。
方法
兩個老師模型各管一件事。
修復提示(skill):凍結的 GLM-5.3-Flash 比較同一個任務的兩條當前策略軌跡(盡量一成一敗),寫出「什麼情況下、為什麼要用某種修復策略」,去掉檔案路徑、程式符號與程式碼。提示平均約 100 個英文字,抓到洩漏答案就重生成。提示只在訓練時用,評測與部署時拿掉。
工具與 hook 演化:GPT-5.6 Sol 透過 Codex 讀當輪所有軌跡,找出跨任務重複出現的互動問題,設計並實作一個候選修改。程式碼不經人工修改,先過格式、schema 與 smoke test,再拿來跟現有 harness 比:同一個策略、同一批 46 個任務、每邊 184 條 rollout。
選擇規則看兩個比率:
- 通過率:補丁通過任務測試的 rollout 比例。
- 可訓練率:能拿來更新策略的 rollout 比例。GRPO 靠同一題多次嘗試的獎勵差異學習,全對或全錯的組沒有訊號;被截斷的 rollout 也不算。
候選修改只有在兩者都沒下降、至少一個上升時才採用。每個 epoch 開頭最多五輪演化,之後 harness 固定,策略繼續用 GRPO 訓練。
訓練設定:
- 基底模型 Qwen3.5-9B,基礎 harness 是 mini-swe-agent。
- 訓練任務從 R2E-Gym-Lite 取 1,058 題,與三個評測集去重後沒有重疊。
- 兩個 epoch、共 46 次更新;獎勵是補丁通過測試就得 1。
- 訓練 rollout 上限 64K context、60 輪;評測 128K、150 輪。
- 純 GRPO 基準每題取 8 條 rollout,其他配置取 4 條。
主要數字
pass@1(%),評測時不給提示,各配置保留自己的最終 harness:
| 配置 | Verified | Multilingual | Pro | 平均 |
|---|---|---|---|---|
| 基底模型 | 42.2 | 19.3 | 31.8 | 31.1 |
| GRPO | 47.8 | 24.7 | 33.3 | 35.3 |
| OpenHands-GRPO | 51.4 | 33.3 | 32.3 | 39.0 |
| Skill-Hint(接近答案) | 45.4 | 22.3 | 30.4 | 32.7 |
| Skill-Mechanism(機制層級) | 52.2 | 28.0 | 34.6 | 38.3 |
| Skill-Bank(通用技能庫) | 48.2 | 20.3 | 33.8 | 34.1 |
| Pre-Evolved | 55.2 | 33.0 | 37.0 | 41.7 |
| H₁+Mechanism | 55.4 | 32.7 | 37.7 | 41.9 |
| HarnessAdapt-RL | 57.6 | 37.3 | 39.7 | 44.9 |
幾個對照各自回答一個問題:
- 要不要在訓練中途演化:Pre-Evolved 用同樣的搜尋步驟與任務,但搜尋時策略固定在基底模型。HarnessAdapt-RL 在三個評測各高 2.4、4.3、2.7 個百分點。
- 第二個 epoch 要不要再演化:H₁+Mechanism 跟完整方法共用第一個 epoch,之後 harness 不動。再演化的版本高 2.2、4.6、2.0 個百分點。合併三個評測的 95% 信賴區間是 [+0.9, +4.3],個別來看只有 Multilingual 的區間不含 0。
- 提示該給多具體:接近答案的提示讓訓練時的全對組佔 27.5%,機制層級是 13.8%;有對有錯、能提供學習訊號的組,機制層級佔 46.5%,較高。接近答案的軌跡平均比 GRPO 短 40.8%,策略跳過了定位程式碼與決定怎麼改的步驟,拿掉提示後就不會做。
演化出了什麼
兩個 epoch 共九個候選,採用六個。
第一個 epoch 主要是管 context 與提交:
- 有輸出上限的
read_file、grep,省下 context。 - 直接替換文字的
edit_file,減少因引號或語法出錯的 shell 指令。這一組讓通過率相對提高 13.7%。 prepare_patch、view_diff與提醒保留提交步數、標記重複動作的 hook。
第二個 epoch 轉向測試與修正:
prepare_patch改成自動挑出與改動相關的現有測試來跑,由 hook 回報失敗,對應前面「測試變少」的問題。- 新增
restore_file,只還原單一檔案、保留其他檔案的修改。
被拒絕的例子也有參考價值。一個「請策略對照需求自我審查」的 hook 讓通過率相對提高 2.7%,可訓練率卻降 7.0%,因此被拒;之後老師把審查跟 view_diff 綁在一起重新提案,兩個比率都上升才被採用。
部署時要帶著哪些東西
把訓練好的模型權重固定,分別配上基礎 harness H₀ 與最終的 H₂:
| 模型 | Harness | Verified | Multilingual | Pro |
|---|---|---|---|---|
| Skill-Mechanism | H₀ | 52.2 | 28.0 | 34.6 |
| Skill-Mechanism | H₂ | 54.2 | 33.3 | 36.9 |
| HarnessAdapt-RL | H₀ | 52.8 | 29.6 | 35.0 |
| HarnessAdapt-RL | H₂ | 57.6 | 37.3 | 39.7 |
兩個觀察:
- 只在 H₀ 下訓練的模型,換上 H₂ 也會進步;跟 H₂ 一起訓練的模型進步更多,合併三個評測的差距是 2.5 個百分點,信賴區間 [+1.0, +4.2]。
- HarnessAdapt-RL 拿掉 H₂ 回到 H₀,三個評測各掉 4.8、7.7、4.7 個百分點。
另外,把已經演化出來的 H₂ 拿去從頭訓練新的策略(Frozen-H₂+Mechanism),分數與完整方法差距在 1 個百分點內。一旦找到 harness,下一次訓練不必重跑演化。但在基底模型上先搜尋的 Pre-Evolved 找不到同樣好的 harness,所以這個重用結果仍需要先跑過一次訓練中的演化。
成本
整個訓練排程的 rollout 數:
| 配置 | 訓練 | 準備(用來生提示) | 比較候選 | 合計 |
|---|---|---|---|---|
| GRPO | 16,928 | 0 | 0 | 16,928 |
| Skill 系列 | 8,464 | 6,280 | 0 | 14,744 |
| HarnessAdapt-RL | 8,464 | 6,280 | 3,312 | 18,056 |
提示生成另需 1,570 次老師請求,harness 演化 10 次老師呼叫;論文沒有報告老師的 token 用量。rollout 數也不等於算力,因為各配置的軌跡長度不同。部署時不用老師,只多了工具與 hook。
限制
- 每種配置只訓練一次。三次重複是對同一個 checkpoint 的評測,信賴區間只反映題目間的變異,沒有涵蓋重新訓練或重新搜尋 harness 的變異。
- 採用規則看的是有限 rollout 上的觀察值,沒有做顯著性檢定,rollout 雜訊可能影響哪些修改被留下。
- 只測了 SWE-bench 式的程式修復,網頁操作、資料分析等領域沒有測。
- 只用一個 9B 模型。較大的模型可能本來就做得好這些工具包裝的操作,增益未必一樣。
- 合併三個評測的差距大多顯著,但部分單一評測的信賴區間包含 0,例如對 OpenHands-GRPO 在 Multilingual 的 +4.0 是 [−0.3, +8.3]。
- 老師模型的版本沒有固定快照,當時的 CLI 版本也沒保存,重現演化過程有難度;模型權重、演化出的 harness 與訓練程式碼已公開。