重點
- 中國人民大學高瓴人工智慧學院與新加坡國立大學提出 Agent-Reflex,目標是讓 agent 在工具回傳錯誤、使用者中途糾正時,自己察覺並修正。
- 研究團隊重放九個公開 agent 基準,收集 177,700 筆工具回傳,其中 24,510 筆是錯誤,歸成 8 類故障,再注入 557 個以 MCP 服務為主題建成的可執行環境。
- 從九個模型的成功與失敗軌跡對照中,挖出 1,170 條以環境為索引的反省技能,再經 ReSFT 與 ORPO 兩階段訓練內化進模型,推論時不需要技能提示。
- 以 Qwen3-8B 為底,五個長程工具基準的整體分數從 40.2 升到 58.6;在 AgentNoiseBench 上被噪音帶偏的比例從 56.1% 降到 28.5%。
- 仍落後 GPT-5.2、Claude-4.5-Sonnet 等前沿模型,技能庫是固定快照,主要只在 8B 規模驗證。
要解決什麼問題
近年的 agent 訓練大多靠擴充環境:合成可執行的工具、資料庫與可驗證的任務,讓模型在大量環境裡練習。論文認為這些環境有一個理想化假設:工具回傳穩定乾淨,使用者很少介入。
實際部署有兩個落差:
- 工具回傳有噪音:MCP 服務會逾時、回 500、回權限錯誤。訓練時沒看過這些情況的 agent,不太會偵測失敗、也不太會恢復。
- 使用者會中途糾正:agent 偏離意圖時,真實使用者會出手修正推理或動作。現有的使用者模擬器多半用固定模板,糾正指令的類型與互動風格涵蓋有限。
論文的圖 1 顯示,連 GPT-5.2 與 Claude-4.5-Sonnet 在加入使用者噪音或工具噪音後,成功率都明顯下降。
作者把「反省」當成可以學的 meta-skill:先從執行失敗中明確挖出可轉移的恢復規則,再透過可驗證的訓練逐步內化進策略。
第一階段:RSD,從真實錯誤挖技能
RSD(Environment Reflection Skill Discovery)分成建環境、注入故障、挖技能三步。
建環境
- 從 Smithery 註冊表依累計使用次數選出 557 個高用量的 MCP 伺服器規格,每個當成一個環境主題。
- 沿用 Agent-World 的做法:研究 agent(有搜尋、瀏覽器、程式、作業系統工具)為每個主題建資料庫並擴充 3 輪;程式 agent 產生候選工具與單元測試。
- 只保留能編譯、通過所有測試、符合狀態轉移限制、支援可執行驗證的工具。
- 每個環境 60 個有驗證器的任務。兩個 agent 都用 GPT-OSS-120B,跟 Agent-World 設定一致,避免環境建構佔到較強模型的便宜。
故障從哪來
作者強調故障要從觀察到的錯誤歸納,不自己發明。他們在九個公開 agent 基準(MCP-Atlas、τ³-Bench、AutomationBench、OfficeQA Pro、JobBench、Harvey LAB、GDPval、Workspace-Bench、SkillsBench)上重放 agent,記錄每一筆工具回傳:
- 共 177,700 筆工具回傳,24,510 筆是錯誤
- 依表面形式歸成 8 類(可多重歸類,比例是命中次數佔比)
| 故障類別 | 佔比 | 典型訊號 | 恢復方式 |
|---|---|---|---|
| 伺服器/閘道不可用 | 33.6% | 500/502/503/504 | 有上限的退避重試,達停止條件後換 endpoint |
| 認證/權限 | 17.9% | 401/403 | 更新憑證、請求授權或往上通報,原樣重試沒用 |
| 逾時 | 14.7% | timeout | 先確認狀態有沒有改變,再重試或縮小請求 |
| 資源不存在 | 10.5% | 404 | 核對識別碼,或用搜尋/列表工具找資源 |
| 參數/驗證 | 10.2% | 400/422 | 修正 schema、型別、必填欄位或列舉值後再試 |
| 一般執行例外 | 8.3% | 工具或操作失敗 | 讀回傳內容,選對應的恢復方式,不盲目重複 |
| 速率限制 | 4.5% | 429 | 退避、遵守配額、批次處理或換允許的服務 |
| 網路連線 | 0.3% | reset/refused | 當成暫時性基礎設施故障 |
注入方式:每個工具回傳位置以 p_inj = 0.2 的機率獨立替換成故障。故障類別均勻抽樣,不照實際比例,讓罕見類別也有足夠樣本可以學恢復。乾淨任務要能驗證解法、加了故障的任務要能驗證恢復,才會保留。
挖技能
- 用九個模型(五個家族,4B 到 284B 參數)在同一組噪音環境上跑每個任務,包括 Qwen3 的 4B 到 235B-A22B、Llama 3.1-8B、Gemma 4-31B、GPT-OSS-120B、DeepSeek-V4-Flash。用多個模型是為了避免軌跡集中在單一模型的推理習慣。
- DeepSeek-V4-Flash 當分析模型,跟環境驗證器一起標記對錯,兩者不一致就丟掉。錯誤軌跡另外標出第一個出錯的回合與當時的環境狀態快照。
- 同一個任務內配對成功與失敗軌跡,每個任務貢獻的配對數有上限,每個環境至少要來自 5 個不同任務。
- 分析模型比較配對,歸納出「壞模式 → 修正動作」的恢復規則。
最後得到 1,170 條反省 meta-skill,以環境為索引。每條技能是結構化紀錄:觸發條件與支持/反駁的證據、診斷出的故障類別、恢復模板(何時重試、換 endpoint、問使用者或中止),以及可逆性與部分生效的標記。
第二階段:ReSFT,把技能變成訓練資料
ReSFT(Reflective Supervised Fine-Tuning)用 Qwen3-8B 自己當產生器,針對錯誤軌跡做三種取樣:
| 取樣方式 | 從哪裡開始 | 給模型看什麼 | 存進資料時 |
|---|---|---|---|
| SR(自我反省) | 還原到第一個出錯回合前的狀態 | 歷史 + 對應技能 | 拿掉技能文字,學的是從自己的錯誤狀態局部修復 |
| KR(技能恢復) | 重設回初始狀態,從原任務重來 | 任務 + 對應技能 | 拿掉技能文字,學的是重新規劃整體路線 |
| UR(使用者糾正) | 還原到出錯回合 | 歷史 + 模擬使用者的糾正訊息 | 保留使用者訊息,技能本身從未進入上下文 |
幾個細節:
- UR 的使用者模擬器是 GPT-4.1,把技能改寫成自然的使用者訊息。它被要求涵蓋直接糾正、部分提示、模糊指示,以及刻意給錯的建議,讓模型學到依證據重新規劃,不一味服從。
- 只有環境驗證器接受的續寫才會收進資料。
- 環境狀態快照只用來還原環境,不會出現在上下文裡。
- 最終資料約 54K 條軌跡,包括 Qwen3-8B 自己驗證成功的軌跡,以及三種反省修正樣本。
- 所有訓練軌跡都由 Qwen3-8B 產生。較大的模型只拿來提供對照與分析錯誤,不當訓練目標。
第三階段:ORPO,強化學習加技能引導的蒸餾
ORPO(On-Policy Reflective Policy Optimization)從 ReSFT 的 checkpoint 開始,結合兩個目標。
噪音環境下的 agent RL
- 任務直接重用 EnvScaler 的 2.5K 個 RL 任務,不用 RSD 合成的任務,方便跟 EnvScaler 直接比較。
- 每組 rollout G = 8 條,其中 ν = 0.25 的比例在加了故障的環境裡跑,其餘在乾淨環境。
- 在整組混合 rollout 上做 group-normalized advantage(類似 GRPO),不分乾淨與噪音兩層各自正規化。作者的理由是讓真實失敗留在 on-policy 分布裡,又不讓它們自成一組對照。
- rollout 時不給技能提示。
反省引導的 on-policy distillation(OPD)
- 每個 EnvScaler 任務本來就標明所屬環境,直接載入該環境的技能卡,不需要檢索。EnvScaler 用到的 100 多個環境都在 557 個 MCP 環境裡。
- 同一個策略在「有技能卡」的上下文下,對學生已經取樣出的同一批 token 重新打分。兩個分數的差距經 sigmoid 轉成信心權重:技能讓機率上升的 token 權重高,差距弱或為負的 token 權重低。
- 估計式沿用 SEED。技能分支只做前向傳播、梯度截斷,不需要額外跟環境互動,增加的成本是一次前向傳播。
- 總目標是 RL 損失加上 λ 倍的 OPD 損失。
推論時技能提示完全拿掉,部署的模型不需要存取技能庫。
結果
所有訓練方法都從同一個 Qwen3-8B 出發。每個分數是三次獨立執行的平均。
五個長程工具基準
| 方法 | VitaBench | τ²-Bench | BFCL V4 | ACEBench | ToolSandbox | 整體 |
|---|---|---|---|---|---|---|
| Qwen3-8B | 11.4 | 26.2 | 40.4 | 54.0 | 69.1 | 40.2 |
| Reflexion-8B | 6.8 | 34.5 | 42.7 | 64.0 | 75.4 | 44.7 |
| NoisyAgent-8B | 15.3 | 42.8 | 35.6 | 52.0 | 71.5 | 43.4 |
| EnvScaler-8B | 15.8 | 37.9 | 47.6 | 72.5 | 80.5 | 50.9 |
| Agent-World-8B | 14.5 | 54.6 | 51.4 | 72.0 | 75.6 | 53.6 |
| Agent-Reflex-8B | 17.5 | 62.1 | 52.9 | 78.0 | 82.5 | 58.6 |
| GPT-5.2 | 37.7 | 80.0 | 62.9 | 68.0 | 73.3 | 64.4 |
| Claude-4.5-Sonnet | 38.0 | 84.7 | 73.2 | 82.0 | 85.0 | 72.6 |
ACEBench 的進步主要來自多回合互動:turn-level 準確率 73.3,step-level 跟最強基線同為 85.0。turn-level 要求一個回合裡每次呼叫都正確,對錯誤傳遞比較敏感。
AgentNoiseBench
AgentNoiseBench 在 τ²-Bench 與 VitaBench 的環境上注入工具噪音(錯誤、不完整、誤導、冗餘、錯誤回傳)與使用者噪音(模糊、離題、矛盾、冗餘、試探邊界)。評分用 Stability-Gated Success:整條軌跡沒被噪音帶偏、答案也正確才算成功,碰巧答對不算。作者表示他們的故障分類、注入方式與環境都跟這個基準無關,訓練時沒用到它的任何環境,所以算是分布外測試。
| 方法 | ANB-τ² 平均 | ANB-Vita 平均 | 整體 |
|---|---|---|---|
| Qwen3-8B | 20.2 | 4.4 | 12.3 |
| EnvScaler-8B | 27.1 | 9.3 | 18.2 |
| NoisyAgent-8B | 37.6 | 14.2 | 25.9 |
| Agent-Reflex-8B | 45.9 | 12.3 | 29.1 |
| GPT-5.2 | 66.5 | 45.0 | 55.8 |
| Claude-4.5-Sonnet | 61.0 | 41.0 | 51.0 |
在 AgentNoiseBench 的細分軸上,把工具端與使用者端合起來算,rollout 被噪音帶偏的比例:
- Qwen3-8B:56.1%
- EnvScaler-8B:44.8%
- Agent-Reflex-8B:28.5%
依論文附錄,差距最大的是誤導性回傳與不完整資訊。這兩類回傳格式正常,不會觸發 schema 檢查,只能從內容裡的證據看出問題。使用者端差距最大的是「認知過載」,也就是指令本身有缺陷、需要重新界定需求的情況。
消融
AgentNoiseBench 上每次拿掉一個元件的結果:
| 版本 | ANB-τ² | ANB-Vita |
|---|---|---|
| 完整 Agent-Reflex | 45.9 | 12.3 |
| 拿掉 SR | 41.3 | 8.9 |
| 拿掉 KR | 42.4 | 10.2 |
| 拿掉 UR | 43.0 | 10.9 |
| 拿掉 OPD | 43.7 | 9.5 |
| 只拿掉信心權重 | 44.5 | 10.4 |
拿掉任何一個元件,兩個設定都會退步。SR 影響最大,作者解讀為察覺失敗與局部修復是反省行為的基礎。保留技能庫但拿掉 OPD 也會明顯退步,表示進步來自 token 層級的反省訊號,光讓模型看過技能不夠。
在 100 步 RL、相同任務池與預算下,ORPO 在 BFCL V4、τ²-Bench 與真實噪音上都優於 GRPO、DAPO、REINFORCE++,也優於同樣有 OPD 訊號的 SEED 與 NoisyAgent RL。訓練獎勵曲線上,ORPO 在 GRPO 與 SEED 趨平後還繼續上升。
跟既有方法差在哪
論文把相關工作依「修正訊號放在哪裡」分類:
| 路線 | 代表方法 | 修正訊號 | 作者指出的不足 |
|---|---|---|---|
| 推論時反省 | Reflexion、Self-Refine、ExpeL | 推論時的自我批評或檢索經驗,不更新參數 | 批評來自原本失敗的同一個策略;工具回傳格式正常但內容錯時,上下文裡沒有東西能反駁原計畫。Reflexion 與 ExpeL 在 VitaBench 上甚至低於原始 backbone |
| 從修正軌跡學 | Agent-R、ReflectRL、LoongReflect | 針對單條軌跡合成修正 | 每次修正只貼合產生它的那一回,累積不成跨 episode 可重用的環境知識 |
| 噪音環境訓練 | NoisyAgent | 混合乾淨與噪音 rollout,只有 episode 層級的純量獎勵 | 只知道這回合比較難,不知道這個失敗該怎麼恢復 |
| 環境擴充 | EnvScaler、Agent-World、AWM、EnvACE | 增加可解的環境數量 | 驗證器回 0 只說明失敗,沒說是哪一步出錯、該怎麼修 |
Agent-Reflex 沿用資料庫支撐的可執行環境,把環境裡的失敗轉成監督訊號:在同樣注入的噪音下比較多個模型的成功與失敗,每個環境挖一次技能,存成可重用的環境層級規則,再用 SFT 與 RL 兩階段內化。ORPO 的估計式直接沿用 SEED,作者說它的貢獻在特權上下文裝什麼:既有做法多半用較大的模型或單一 episode 的事後改寫,ORPO 用的是從實際工具故障挖出的環境技能卡。
限制
- 仍落後前沿模型:五個工具基準整體 58.6,GPT-5.2 是 64.4,Claude-4.5-Sonnet 72.6,Gemini 3 Pro 72.8;AgentNoiseBench 整體 29.1,GPT-5.2 是 55.8。
- VitaBench 絕對分數低:17.5,前沿模型約 38 到 48。AgentNoiseBench 的 VitaBench 部分(12.3)也低於 NoisyAgent-8B 的 14.2。
- NoisyAgent 的比較有前提:Table 2 裡 NoisyAgent 的數字引自原論文,那些結果是在被評測的領域上直接做 RL 得到的;Table 1 的 NoisyAgent、Agent-R、Agent-World、EnvACE 是作者自行重現,因為原作沒有釋出 checkpoint。
- 技能庫是固定快照:工具介面、服務行為或環境動態改變時不會自動更新,需要定期重挖。作者也提醒,線上更新若環境多樣性不足,挖出的技能可能只適用於個別環境。
- 規模:主要在 8B 驗證,技能庫也只在 8B 規模挖過一次,是否能轉移到其他容量、能否跨環境組合,還沒測。分析與挖技能用的是更大的 DeepSeek-V4-Flash。
- 故障類型以文字訊號為主:延遲、並行、部分寫入這類時間性故障還不在分類裡。
作者釋出了 ReSFT 與 ORPO 的訓練資料、完整技能庫、Agent-Reflex-8B checkpoint,以及訓練與評測程式碼。