Agent 自我改進實作課:讓 Agent 從自己的軌跡中學會更好
今日主題:Agent 自我改進與軌跡學習
2026-10-26 | 資料來源:史丹佛 STaR、史丹佛 TextGrad、Salesforce 軌跡歸納、SE-Agent、自我對局 SWE-RL
前言
多數 Agent 上線之後就定型了:提示詞寫死、模型固定、工具清單不變,表現好不好,全看部署那一刻的狀態。但真實任務每天都在變,新的錯誤型態不斷出現,舊的解法慢慢過時。一個不會從經驗中學習的 Agent,只能靠人工一次次修提示詞,愈修愈像在替它背書。
自我改進換一種思路:把 Agent 跑過的軌跡當成教材。成功的軌跡留下來當範例,失敗的軌跡拿去檢討,定期把學到的東西寫回提示詞、技能庫,甚至模型權重。Agent 不必一次變聰明,只要每一輪都比上一輪少犯一點錯,長期下來就是巨大的差距。
一、為什麼是軌跡,而不是感覺
人類工程師改 Agent 時,常常憑感覺:覺得某個步驟容易出錯,就加一句提醒。這種改法有兩個問題。第一,感覺不一定對,真正拖垮成功率的可能是更前面的步驟。第二,感覺無法累積,換一個人接手就得重新摸索。
軌跡解決了這兩個問題。每一次執行都留下完整紀錄:輸入是什麼、呼叫了哪些工具、每一步的觀察結果、最後成功還是失敗、失敗在哪一步。有了這些紀錄,改進就有了證據:哪一類任務最常失敗、哪一個工具最常被誤用、哪一種錯誤重複出現最多次,都可以算出來,而不是猜出來。
更關鍵的是,軌跡同時是評測資料。同一批軌跡既能指出問題,也能驗證改進有沒有效果。先把失敗案例凍結成測試集,再動手改,改完重跑一次,進步是真的還是錯覺,數字會說話。
二、三層自我改進:從快到慢
自我改進不是只有微調模型一條路。實務上可以分成三層,成本與速度差很多,應該由快到慢依序使用。
第一層:提示詞與上下文層
最快、最可逆的一層。把從軌跡中提煉出的原則寫成守則,放在提示詞或技能文件裡。例如從十次失敗中發現,Agent 常常在沒有確認檔案存在前就直接讀取,守則就可以寫成:讀檔之前先列出目錄,檔案不存在就先回報,不要憑空猜測路徑。
這一層的優點是當天就能上線,缺點是提示詞會愈來愈長。守則超過一定數量之後,必須定期整理:合併重複的規則、刪除已經不再發生的舊規則,否則上下文會被守則塞滿,反而拖垮表現。
第二層:技能與記憶層
如圖一,把經驗沉澱成可重用的資產。成功的解法寫成技能文件,失敗的教訓寫成檢查清單,常見任務的標準流程寫成劇本。下一次遇到類似任務,Agent 先檢索相關技能再動手,而不是每次從零開始推理。
這一層比改提示詞更結構化,因為技能可以按任務分類、按版本管理、按成效淘汰。某個技能連續三次沒有幫上忙,就該被降級或重寫,而不是永遠留在資料夾裡。
第三層:模型權重層
最慢、最貴,但也最根本的一層。把篩選過的成功軌跡拿去微調,讓模型本身學會更好的行為模式。史丹佛的 STaR 就是這條路線的起點:模型先用少量範例生成推理過程,答對的留下、答錯的用正確答案重新生成一次,再把最終答對的軌跡拿去微調,如此反覆,模型靠自己的輸出一步步變強。
權重層適合任務範圍窄、資料量夠大的場景。如果任務每週都在換,微調的成本還沒回收,任務就已經變了,這時候停在第一層或第二層反而更划算。
三、四種具體做法
做法一:成功軌跡再利用
只留下通過驗證的軌跡。驗證標準必須是外部的,例如單元測試通過、工具回傳成功、使用者確認結果正確,而不是模型自己說做得很好。把通過驗證的軌跡整理成範例,微調時用、提示詞裡用、技能文件裡也可以用。沒有驗證的自我學習,很容易把錯誤也一起學進去。
做法二:失敗軌跡提煉原則
失敗比成功更有教材價值。如圖二,把失敗案例分組:是工具選錯、參數填錯、步驟順序錯,還是根本誤解任務?每一組提煉出一條原則,寫進檢查清單。Salesforce 的研究就展示了類似思路:讓 Agent 從自己在軟體工程任務中的執行軌跡歸納出更通用的計畫,再用歸納出的計畫指導下一次執行,在 SWE-bench 驗證集上取得穩定的進步。
做法三:文字梯度優化
史丹佛的 TextGrad 把神經網路的反向傳播搬到文字世界。整個 Agent 系統被看成一張計算圖,提示詞、程式碼片段、工具輸出都是圖上的變數。當最終結果不如預期,另一個模型會寫出文字回饋,指出哪個環節該怎麼改,這份回饋就像梯度一樣沿著計算圖往回傳,逐一修正每個環節。實測中,TextGrad 把 GPT-4o 在 Google-Proof 問答上的零樣本準確率從 51% 提升到 55%,在 LeetCode 困難題上也取得約 20% 的相對進步。
做法四:自我對局
沒有現成教材時,就自己創造教材。讓 Agent 在沙箱裡同時扮演出題者與解題者:先注入一個錯誤,再嘗試修復,修得好就留下這對出題與解題的紀錄。自我對局的研究顯示,即使完全不依賴人工標註的議題與測試,這種做法也能在 SWE-bench 驗證集上帶來超過 10 個百分點的進步。關鍵是沙箱必須夠真實,否則 Agent 學到的只是沙箱裡的捷徑,回到真實程式碼庫立刻失效。
四、最小可跑的改進迴路
不需要一次建好整套系統。一個最小迴路只要四個步驟,每週跑一次就有價值:
def weekly_improvement_loop(traces, eval_set):
# 1. 只留下可驗證的軌跡:測試通過才算成功
good = [t for t in traces if t.verified]
bad = [t for t in traces if not t.verified]
# 2. 失敗分組,提煉原則(每組一條,不要貪多)
principles = distill_principles(group_failures(bad))
# 3. 先改提示詞與技能,凍結評測集再驗證
candidate = apply_principles(principles)
score = evaluate(candidate, eval_set)
# 4. 進步才合併,退步就丟棄,絕不憑感覺上線
return candidate if score > baseline_score(eval_set) else None
這個迴路有三個鐵律。第一,評測集在改動之前就要凍結,改完不能換題目。第二,驗證必須來自外部,模型自評不算數。第三,每次只改一層,提示詞、技能、權重不要同時動,否則進步了也不知道是哪一層的功勞。
五、自我改進的三個陷阱
第一個陷阱是自我肯定。模型傾向認可自己的輸出,如果用模型自己當評審,錯誤軌跡也可能被判定為成功。解法是讓驗證盡量外部化:測試、工具回傳、人工抽查,三者至少要有一種。
第二個陷阱是過度擬合舊任務。Agent 把某一類任務練得很好,卻在新任務上變差。解法是評測集要同時包含舊任務與新任務,任何一邊退步都算不合格。
第三個陷阱是災難性遺忘與漂移。權重層的改動一旦上線就很難完全收回,必須保留上一個版本的完整快照,隨時可以一鍵退回。提示詞層與技能層的改動也要留版本紀錄,改壞了才能精準還原。
結論
自我改進不是讓 Agent 自己亂學,而是給它一條有紀律的學習迴路:軌跡留下證據、失敗提煉原則、改動先凍結評測再驗證、進步才合併。先從最便宜的提示詞層開始,跑順了再沉澱技能,任務夠穩定、資料夠多時再考慮微調。Agent 真正的競爭力,不在於部署那一天有多聰明,而在於上線之後的每一個星期,它是不是都比上一個星期少犯一點錯。
資料來源
- STaR:Self-Taught Reasoner(史丹佛大學):https://arxiv.org/pdf/2203.14465
- TextGrad:Automatic Differentiation via Text(史丹佛大學):https://arxiv.org/pdf/2406.07496
- TextGrad 介紹(史丹佛 HAI):https://hai.stanford.edu/news/textgrad-autograd-text
- Software Engineering Agent via Self-Abstraction from Grounded Experience(Salesforce AI Research):https://www.salesforce.com/blog/sage-swe/?bc=OTH
- SE-Agent:Self-Evolution Trajectory Optimization(NeurIPS 2025):https://ar5iv.labs.arxiv.org/html/2508.02085
- Self-Play SWE-RL:朝向自我對局訓練軟體 Agent:https://scirate.com/arxiv/2512.18552











