8 月 13 日,DeepSeek端上了一道新菜DeepSeekHarness,但這道菜初看讓人有點摸不著頭腦。
項目首頁的介紹是Everything is a Plugin,一切皆外掛。
我們其實已經見過太多Harness了,外掛在我們理解中似乎就和MCP一樣是呼叫工具的。
但這回,DeepSeek 是把過去 Harness 裡很多默認屬於Harness「底層框架」的東西也拆成了外掛。官方架構文件明確列出的最核心一層有 7 個包,Session(會話日誌)、System Prompt(系統提示組裝)、Tools(工具系統)、Agent(Agent 註冊與介面)、Agent Loop(智能體循環)、Scope(範疇註冊)和 LLM(模型適配介面)。
而這在之前的Harness中都是關鍵的,不更新版本不會動的核心元件。
甚至往外展開以後,默認模型選擇、持久化、Sandbox(沙箱)、審批策略、設定、憑據等也全部做成外掛。
再上一層,則再加上 Context/Instructions、Compaction(上下文壓縮)、Skill、Sub-agent、Workflow、Goal、Jobs、File System、Shell、Storage、UI、API 等。
這裡面才是過去Harness裡部分開放給外掛的部分。
而且除了最底下的 Cordis Runtime(Cordis 執行階段), Agent 幾乎沒有那一塊天然擁有不可動的特權地位。
而這個不動的 Cordis,只提供六種最基礎的操作:裝一個元件(use)、記錄一次可撤銷修改(effect)、提供一種能力(set)、讀取一種能力(get)、把同一種能力隔離開(isolate),以及在能力外面加一層使用規則(intercept)。
剩下的事情由 Runtime 自動完成。一個外掛缺少依賴,就先不啟動,依賴齊了再載入。依賴的元件被替換,它會重新載入。外掛退出,它留下的作用會按記錄撤銷,如果別的外掛還依賴它,則先讓下游外掛退出,再真正把它拿掉。
它管的不是 Agent 怎麼幹活,而是這些零件怎麼裝、怎麼接、怎麼換,以及換完以後怎麼安全的把依賴都拆掉。
這確實是一種完全不同於當下市面上所有Harness的模式。不論是CLaude Code還是Codex,乃至Hermes、Pi都是底層核心都給你配置好不能動,想要附加功能可以搭外掛的模式。
毫無疑問,市面上的那種Harness更適合開箱即用的C端使用需求和穩定性的要求。而DeepSeek的這套Harness對一般使用者來講,看起來實在太複雜了,光模式就有四種。
實際上,如果你選擇標準模式,那基本上就和別的Harness一樣,是一套經過DeepSeek 配置好的默認模式。程式碼模式則是加了程序化工具呼叫,更適合多工具呼叫的一種基礎配置。
但一般人看到四種模式就已經懵了。為什麼要搞這麼麻煩呢?
因為DeepSeek做的這套系統,有著更大的一層野心。其出發點也並不是設定好一個最適合開箱即用的Harness架構,而是為了自進化打好基礎。
01. DSH不止是個外掛系統,而且能讓外掛真正獨立
與 Harness 一同被擺上檯面的,還有一篇由北京大學和 DeepSeek-AI Harness負責人崔添翼共同完成的論文《A Programming Paradigm for Spatiotemporal Composability》(時空可組合性的程式設計範式)。
論文中提出的Harness模式和DSH的構架基本完全一致,可以看作是DSH的理論基礎。
從這篇論文中,我們也可以看出DeepSeek的外掛和其他外掛其實定義上完全不同。它必須是可乾淨的拆卸,可溯源其影響的外掛。
過去的外掛系統,像VsCode,拆換外掛的解決辦法其實就是重啟整個處理程序。整個處理程序重啟以後,cache、連接、partial computation(中間計算狀態)等也一起丟掉。為了維持服務,還可能不得不準備副本。
但這只能說明這個系統其實對於某個元件究竟給環境增加了什麼,它依賴的是什麼也並不清楚,也就無法只撤銷這個元件貢獻的部分。
但DSH的外掛希望做到這一點。
這首先要求 temporal composability(時間可組合性)。獨立元件運行後對共享環境造成的修改,在元件解除安裝時必須能夠恢復。
為此作者引入 revertible effects(可回退效應),每一次 effect (模組造成的效應)在執行修改的同時,都向 runtime 返回一個對應的 inverse(逆操作),也就是如何恢復的說明書。runtime 將這些逆操作累積起來,解除安裝元件時再按相反順序執行。
論文裡有大量的數學推導,它們其實就是在證明,只要每個局部 effect 都能正確給出逆操作,那這些逆操作在堆疊組合以後仍然能正確恢復整個組合。
這時,Harness就可以無損的恢復到沒加外掛之前的狀態,而只撤掉外掛自己的貢獻。
但如果多個元件同時運行,事情馬上變複雜。
假設元件 A 做了一個修改,然後元件 B 又做了另一個修改。現在我想只解除安裝 A,而保留 B。這意味著 A 的逆操作不再是在「它剛剛執行完」的那個狀態上執行,而是在一個已經被 B 改過的狀態上執行。
此時要保證,撤銷 A,只拿掉 A 的貢獻,不能順手把 B 的東西也毀掉。
所以作者又引入了independence(獨立性)。只有互相獨立的多個元件,才可以單純通過這種方法只取消掉它的貢獻。
但是現實世界不可能要求所有元件完全獨立,元件之間本來就是要互相依賴的。因此就需要Spatial Composability(空間可組合性),去讓不同元件之間的依賴被顯式表達,而且一個元件出現、消失或者被替換以後,依賴它的元件能自動重新調整自己的狀態。
傳統的軟體系統當然也有 dependency injection(依賴注入),但大多數依賴關係是在初始化階段解決的。程序啟動時把 A 接給 B,之後默認這個關係一直成立。
可在一個真正動態的系統裡,這個假設不成立。A 可能運行到一半被解除安裝,也可能被 A2 替換。此時僅僅知道B 需要 A是不夠的,runtime 還必須持續知道A 現在還在不在,B 此刻究竟連接的是誰,以及這種關係發生變化以後 B 應該進入什麼狀態。
論文把這種能夠動態聲明、發現和重新協調元件依賴關係的能力稱為 spatial composability。
為瞭解決它,作者引入了第二套機制,叫reactive coeffects(反應式共效應)。如果說 effect 描述的是「這個元件對環境做了什麼」,那麼 coeffect 描述的就是反過來「這個元件要正常運行,需要環境給它什麼。」
比如一個外掛可以明確聲明,我需要 database 和 logger,另一個外掛則聲明自己可以提供 database。這樣,元件之間原本散落在程式碼呼叫中的隱式關係,就被提升成 runtime 可以直接看到的一張依賴的拓撲關係圖。
有了這張圖,runtime 就可以持續檢查一個元件所聲明的依賴現在是否全部滿足。
如果原本缺少資料庫,後來一個新的資料庫被裝進來了,那麼這個元件就從 unsatisfied(依賴未滿足)變成 satisfied(依賴滿足),runtime 可以自動把它啟動。反過來,如果原來依賴的元件消失了,runtime 會讓它進入停用流程。
那現在如果要拆卸一個外掛,從這一刻開始,新的元件已經不能再把 A 當成可用,依賴 A 的 B 也會發現自己的依賴條件已經不滿足,於是開始退出。但 A 原來提供給 B 的 binding(繫結)暫時仍然保留,所以已經依賴 A 的 B 還可以在 teardown(拆卸)過程中繼續完成自己的收尾工作。等所有依賴 A 的元件都完成退出之後,A 才真正執行自己的逆操作,把自己對系統的影響徹底撤銷。
時間可組合性保證的是「我能把自己留下的東西撤乾淨」,空間可組合性保證的則是「在我撤掉之前,所有和我發生關係的元件都能被正確處理」。
也正因為效用(effect)和依賴性都被顯式化,在DSH中,所有元件/外掛的變化才不再是一場對整個程序影響未知的程式碼替換,而變成了一個影響範圍可以被 runtime 追蹤和管理的局部操作。
寫到這裡,我們看到的就是一個很好的外掛工程升級,在動態系統中插拔外掛變得容易了,很好,那它和自進化又有什麼關係呢?
02. Harness自進化的三個兩難困境
就在 DeepSeek Harness 發佈的前後,AI 研究圈內最火的一個概念就是 Recursive Harness Improvement / Recursive Harness Self-Improvement(RHI,遞迴式 Harness 自我改進)。
過去幾個月,Meta-Harness、AHE、Self-Harness、RHI、HarnessBank、Harness-R1 等論文密集的開始出現。
之所以這個領域火了,是因為它是局部調參這條RSI最成熟路徑外,最好操作的一條路徑。
一個幾百億、幾千億參數的神經網路,本質上仍然是一個連續、高維、強耦合的參數空間。模型即使知道「自己長期規劃做得不好」,也沒有一個語義坐標告訴它,第多少層、第多少個參數對應長期規劃。真正修改參數,通常還得繞一圈,設計新的資料、獎勵、課程或者 RL 環境,再讓梯度下降完成更新。
但自進化 Harness 並非如此。 相比直接進化模型權重,它有幾個天然的優勢。
第一,修改點相對離散。改 Prompt、換 Tool、增加一條 Retry、改變一個 Agent 的通訊規則,這些修改本身就是自然語言、程式碼或者配置。LLM 能看懂,也能直接寫。我們需要考慮的最佳化搜尋空間,並不像模型本體那麼無窮無盡。
第二,試錯便宜。後訓練一個模型的成本,比起改改Harness架構可貴太多了。而且容易回退。效果不好,上一版 Harness 還在那裡,切回去就行。
其三,則是有快速的現實反饋。當自進化完成一輪修改後,馬上就能看到當前 Agent 的行為變化並對其進行評測。
效果確實不錯。比如 在2026年 7月Sakana AI發佈的《Recursive Harness Self-Improvement》中,研究者在量化金融、機器人和藥學三個領域構造了 30 個機器學習研究任務,只用幾輪 Harness 更新,就讓低 reasoning effort(低推理預算)的 Agent 超過高推理預算模型的表現,同時最多降低約 60% 推理成本。
進一步分析還發現,主要增益並不是模型突然「多想了一會兒」,而是來自任務特定的 Context Management(上下文管理)和更高效的 Agent 間資訊流。也就是說,模型沒換,工作方式換了,能力就變了。
這讓 Harness 看起來像是今天最適合先做 self-improvement(自我改進)的地方。
但根據最近的一系列研究,落地後的RHI可以說是全無統一路徑,因為三個問題一直都沒有得到澄清。
第一個問題是到底進化什麼?
這聽起來很奇怪。既然都叫 Harness Improvement,那當然是在最佳化 Harness。問題是,大家嘴裡的 Harness 根本不是同一個東西。
Harness 到底是 Prompt,還是 Prompt + Tool,還是連 Memory、Middleware(中介軟體)、Agent Topology(智能體拓撲)、Runtime 和 Evaluator(評估器)都算?修改空間的邊界在那裡?
3 月,史丹佛發表的《Meta-Harness: End-to-End Optimization of Model Harnesses》(簡稱Meta-Harness)定義的修改範圍其實比較模糊,就是直接把 Harness 的可執行程式碼交給一個 Coding Agent。這個 Proposer(提案器)可以像程式設計師查程式碼倉庫一樣,自己讀取原始碼、歷代候選的成績和原始執行軌跡,再決定下一版程式碼怎麼改。也就是說,它眼裡的 Harness 已經接近「整個決定模型如何保存、檢索和看到資訊的程序」。
4 月,復旦發表《Agentic Harness Engineering: Observability-Driven Automatic Evolution of Coding-Agent Harnesses》(簡稱 AHE)。這篇文章則直接提出了修改問題混亂的問題,他們認為自動改 Harness 面臨的第一個困難,就是heterogeneous action space(異質動作空間),Prompt、工具、Middleware(中介軟體)、Skill(技能)、長期記憶這些東西性質完全不同,卻全混在一個搜尋空間裡。AHE 的處理方式,是把每一個可編輯元件單獨檔案化,讓修改發生在那裡、改了什麼、能不能恢復都更加清楚。它把這叫 component observability(元件可觀測性)。
到了 8 月,Luan Zhang 等人的《HarnessCompass: Guiding Automatic Harness Evolution toward Generalizable and Effective Agent Harnesses》(《HarnessCompass:引導 Harness 自動演化走向更好的泛化和效果》)又把問題往前推進了一步。作者發現,如果 Prompt、工具、中介軟體、記憶等 Harness 元件一起最佳化,很容易出現 cross-component interference(跨元件干擾):一個修改覆蓋另一個修改,兩個修改重複做同一件事,或者彼此抵消。
因此 HarnessCompass 乾脆先做 component-wise optimization(元件級最佳化),分別最佳化,再重新整合。在 SWE-bench Verified 上,它用 GPT-5.4 隻演化 5 輪,就把 Pass@1 從 54% 提升到 66%,同時比此前方法表現出更好的留出任務泛化。
但問題是,改什麼,要改的離散部件怎麼做處理才比較好,這裡面沒什麼統一的答案。
第二個問題是Harness到底應該怎麼進化?
是應該花大成本尋找一個可以跨任務復用的「最好 Harness」,還是承認不同任務、不同模型本來就應該使用不同 Harness,讓系統現場適應?
早期大家會想像有一個非常完美的基礎 Harness,會適應所有任務。我通過一次次進化,讓這個通用Harness變得越來越強大,趨於完美即可。
但最近越來越多證據,對這種玫瑰色想像打了臉。
7 月 14 日,艾倫人工智慧研究所發表論文《Rethinking the Evaluation of Harness Evolution for Agents》。它問了一個問題,Harness Evolution(Harness 演化)自己也要花推理預算。為了得到第五版 Harness,你已經看了五輪反饋、跑了五輪任務,那為什麼不把同樣的計算直接拿去多解幾遍題?
於是作者把 Parallel Sampling(平行採樣)、Sequential Refinement(連續修訂)和 Harness Evolution 放到相同反饋、相同推理預算下比較。結果現有自動 Harness Evolution 並沒有穩定勝過簡單的測試時擴展方法。
但是我們可以說,至少Harness進化出來的是固定的,搞好了後面省預算啊。
但這個前提是它得確實通用,確實泛化。換一組題它就不好使了,那這麼最佳化有什麼意義?
問題就出在這個泛化上了。研究者只在訓練任務上演化 Harness,再拿到完全留出的 Terminal-Bench 2.1 任務上測試,Claude Opus 4.6 隻比初始 Harness 提升 1.2 個百分點,GPT-5.4 提升為 0,平均只剩 0.6 個百分點。
也就是說,很多看起來很漂亮的 Harness 漲點,很可能吸收了訓練任務的特殊反饋,並沒有變成真正可以復用的工作原則。
更雪上加霜的是,7 月 20 日UC Berkely的另一篇論文《Automated Discovery Has No Universally Superior Harness》,把這個「泛化不好」的問題做了更深層的推演。研究者們拆開了 OpenEvolve、TTT-Discover 一類自動探索系統,把 Archive(候選檔案)、Parent Selection(父代選擇)、Exploration(探索策略)、Budget Allocation(預算分配)等部件重新組合成 30 套 Harness,在 12 組「模型—問題」組合上跑了超過 310 萬次 LLM Rollout。最後沒有任何一套固定 Harness 能在所有模型、所有任務上穩定最好。
作者因此提出,Harness 的選擇更像一個依賴具體模型和具體問題的超參數,而不是一張永遠正確的萬能配方。
也許從一開始,要求「最終 Harness 必須通用」就是錯的。但也許,是當前進化的方法不對,要求進化的東西不對?
比如在AHE 論文的實驗中,它演化出的 Harness 凍結以後換到其他模型家族,仍然能獲得 +5.1 到 +10.1 個百分點的收益,而且真正能夠遷移的主要是 Tools(工具)、Middleware(中介軟體)和 Long-term Memory(長期記憶),而System Prompt(系統提示詞)遷移後掉分非常明顯。
這意味也許完整的Harness確實不存在通用,但某些 Harness 原語確實可能跨模型、跨任務復用。
8 月的香港城市大學論文《HarnessCompass: Guiding Automatic Harness Evolution toward Generalizable and Effective Agent Harnesses 》,訓練Harness Agent的方式是,只拿 SWE-bench Verified 的 50 道題演化 Harness,把另外 450 道完全封存起來,並設定一個 Generalization Gate(泛化門),要求所有修改都必須是特定任務無關的,也就是不能針對某一道具體任務打補丁,而要尋找更普遍的 Harness 改進。
只加這一條約束,留出任務就從 51.6% 提高到 58.4%。
所以現在至少有一條可能的路線,並不是尋找一套萬能 Harness,而是主動從大量具體任務裡,把那些不依賴具體任務的共同結構篩出來。最終 Harness 可以因任務而異,但 Tool、Memory、Middleware、Recovery、Context Management 這類更小的結構單元,可能逐漸沉澱成一套可以反覆呼叫的通用原語。
但目前,至少有三種完全不同的東西可以叫「通用」。
最強的是一個完整成品通用,所有任務都用同一套 Harness。目前的證據對這個假設越來越不友好。
弱一點的是原語通用,整個 Harness 不一樣,但 Tool、Memory、Recovery、Context Management、某些 Agent 協作結構可以跨一批任務復用。
再往上一層,則是適應能力通用。最後長出來的 Harness 完全可以不同,真正穩定的是「看到什麼任務、什麼模型、什麼失敗以後,知道應該怎樣重新組織 Harness」
第二、第三條路徑,那個更優,似乎也沒有最終解。
第三個問題,則是怎麼才算真正遞迴?
如果 Harness 從初始改成版本1,再改成版本2,但負責產生這些修改的 Optimizer(最佳化器)始終是同一個固定模型、同一套搜尋策略,那麼不斷變化的只是 Harness,怎樣改進自己這項能力本身並沒有不斷進步。
RHI 名字裡最重的詞其實不是 Harness,而是 Recursive。
今天大部分 RHI 的確都有循環。
當前 Harness 跑任務,得到結果和軌跡。Optimizer 根據這些歷史生成下一版 Harness。新 Harness 再跑,再修改。所以版本升級這種進化是確實存在的。
但產生 H1、H2、H3 的那個東西,變了嗎?
當下的實踐中,大部分時候並沒有。
前面的 Meta-Harness、AHE,包括 HarnessBank,本質上都可以讓 Harness 一代代變化,但負責提出修改的核心最佳化器仍然可以是固定的。
最佳化器讀到的歷史越來越多,外面的 Archive(檔案)、Memory(記憶)、Verifier(驗證器)不停在變動,卻不意味著怎樣修改 Harness 這項能力本身在學習。
在進化的Optimizer(最佳化器)要到 8 月的論文《Harness-R1: Learning to Edit Executable Runtime Harnesses from Agent Failure Trajectories》中才嶄露頭角。
在這篇論文中,研究者單獨訓練了一個 9B Harness Engineer(Harness 工程模型)。它先看目標 Agent 的失敗軌跡,生成可執行修改,把修改裝回凍結的目標 Agent,再重新運行任務。到這兒為止,它和AHE都很像。
但改動最後真實的性能變化不是只用來決定這個Harness變動補丁要不要留下來,還會直接反過來更新 Harness Engineer。
論文先用 SFT(監督微調)冷啟動,再用 Online GRPO(線上組相對策略最佳化)繼續訓練。Qwen3.5-9B 的平均成功率從 44.3% 提高到 53.6%。目標 Agent 本身微調以後,專用 Harness Engineer 還能進一步把 59.2% 提高到 64.2%。
這套巢狀元學習的模式,確實非常古老了。但優質的實踐,才剛剛開始,遠未成熟。
這三個問題都還沒解決,都不用上升到我們之前文章提到的如何擴大搜尋空間,如何擴大問題域的問題,RHI領域就會一直在一團亂麻之中。
03. 一種可能的 Harness 世界觀
7 月有一篇MIT CSAIL在研究界挺出圈的文章《Language model harnesses are compositional generalizers》(《語言模型 Harness 是組合泛化器》)。它提供了一種很重要的 Harness 世界觀,恰好可以把前面三個看似分散的問題放進同一個框架裡理解。
在他們的理解中,Harness 最重要的能力,是承擔基礎模型不太擅長的更高層的compositional generalization(組合泛化)。
所謂組合泛化,就是碰到一道以前沒見過的新題,系統不一定需要重新學習一種完整的新能力,而應該儘可能把自己已經會的東西重新組合起來。
現在的大模型後訓練越來越像「那裡不行補那裡」,Coding 不夠,就專門做 Coding RL。任務從幾十步變成幾百步,就繼續做更長的 Rollout(執行軌跡)。
這種辦法當然有效,但代價是每出現一種新的任務形態,我們都傾向於重新訓練模型。但現實世界裡的任務組合幾乎是無窮的。
今天訓練寫程式碼,明天可能就需要查資料寫程式碼。如果每增加一種組合,都要重新把完整任務放進模型訓練分佈裡,泛化就靠一個訓練了。
論文的作者認為,這裡面缺少的一項能力恰恰是,如果新任務只是舊能力的一種新組合,那乾脆找個系統去自己重新組織這些舊能力,這不比重新學一遍省錢嗎?
而這個去組合舊能力的系統就是Harness。
Harness 並不是一個單純包在模型外面的工具箱,它更像外部世界和神經網路之間的一層程序。外面的 Environment State(環境狀態)可以很複雜,可能同時包含幾百萬 Token 的文件、幾十個網頁、多個 Tool 返回結果、歷史狀態和 Sub-agent(子 Agent)的中間結果。
基礎模型不需要把這一整個世界一次性吞進去,Harness 可以先決定那些資訊留下、那些資訊送進 Context(上下文),任務怎樣切分,那些子任務交給誰,中間結果放在那裡,最後又怎樣聚合回來。
好的 Harness 可以先替模型把問題「切好」,把一個整體陌生的大任務拆成很多模型早就會做的小任務。
作者把這種狀態叫作 Locally In-Distribution(LID,局部分佈內)。整道任務完全可以是 OOD(Out-of-Distribution,分佈外)的,但每一次真正送進模型的局部呼叫,最好仍然落在模型比較熟悉的分佈裡。
Harness 的意義,就是把第一次見到的完整任務,轉換成已經會做的局部動作 + 一種新的組合方式。
雖然這篇論文的目的本身是訓練一個會組合原始模型分佈內技能的模型RLM,但它提供了一個可能的Harness世界觀,去解決我們當下的三個難題。
這個世界觀就是:Harness 可以把一個巨大的連續任務世界,重新表示成一個由少數高層動作組成的組合空間。模型不需要記住所有任務,而可以學習怎樣組合這些動作。
這恰好給前面 RHI 的第二道困境提供了一個新的出口。在前面的討論中,我們大機率可以確定沒有一套完整 Harness 能夠在所有模型和任務組合上穩定最好。
但如果 Harness 本來就是一個組合系統呢?我們並不需要要求所有任務最後使用同一套 Harness。那Harness做的就是在這樣一個空間範圍內進行元件間的組合泛化。
面對 Coding,可以是一種組合,面對搜尋任務可以是另一種,底座模型換了,因為不同模型的弱點不同,組合關係也完全可以跟著改變。
而達成這種泛化需要兩個條件。
一是相對穩定的 Harness primitives(Harness 原語)。二是組合這些原語的能力。
如果沒有穩定原語,每次面對新任務都重新生成幾百行程式碼,過去的經驗很難積累。但如果只有一堆固定元件,沒有一套根據當前任務重新組織它們的能力,那又重新退化成了人工設計 Harness。
這樣一來,如果未來 Harness 真正承擔的是一個高層組合層,那麼我們要找的就不再只是「那些檔案允許改」,而是「AI 的工作方式應該被拆成那些相對穩定的基本動作」。
所以在這種世界觀之下,RHI的任務,就變成了逐漸沉澱一套可復用的 Harness 原語,上面則學習一套能夠針對 Task(任務)、Model(模型)、Environment(環境)動態組合這些原語的策略。
而這也第一次把前面 RHI 的三道問題一攬子解決了。
進化什麼,變成了 Harness 的 Representation(表示)問題:先把一個開放的任意程序空間,逐漸表示成一組穩定、離散、有語義的修改單位。
怎麼進化,變成了 Composition(組合)問題:不再追求唯一最優的完整 Harness,而是沉澱可復用原語,並學習不同任務下的組合策略。
如何遞迴,則變成了 Learning(學習)問題:過去每一次「狀態—修改—結果」的經歷,能夠有效的以此反過來訓練負責組合這些原語的最佳化器。
這套 Harness 的離散元語從那裡來?恰恰就在這裡,DeepSeek Harness 的Everything is a Plugin(一切皆外掛),就有了RHI方向上的意義。
它做的,正是在把這套元語做出明確的、可學的規範,讓 Harness 自己也擁有一套可以被組合,且能夠用於自進化的語言。
04. 外掛,是比原來的功能劃分更好的元語
今天讓一個 Agent 自己改 Harness,最常用的方式就是給它整個工作倉庫,讓它去讀程式碼,發現問題,直接 Patch。這種自由度看起來最高,但對 RL來說並不友好。
比如,Meta-Harness 就把整個 Executable Harness Code(可執行 Harness 程式碼)交給 Coding Agent 修改,自由度最大,但一次修改究竟屬於 Prompt、Memory 還是 Workflow,並沒有統一的語義坐標。
但強化學習要從過去的經驗裡學出 Policy(策略),一個最基本的條件是過去和未來的 Action(動作)至少得有某種穩定的共同含義。如果第一個 Action 是修改 Prompt 第 37 行,第二個 Action 是重寫一個 500 行 Middleware(中介軟體),第三個又一次性改變三個 Agent 的通訊邏輯,那麼雖然這些操作最終都可以用 Token 表達,最佳化器卻很難總結出什麼情況下應該重複什麼動作。
今天大部分 Harness Evolution 的搜尋空間,雖然已經比直接最佳化模型權重清楚很多,但本質上仍然是程式碼空間。
我們之前提到,自進化Harness的好處之一就是Harness是離散性的,所以需要嘗試調整的部件少。但離散空間完全可能巨大得離譜,比如上面提到Meta Harness用的整個程序空間也是離散的,所有程式碼最終都可以表示成 Token。
真正要讓這些離散的部分有益於後訓練,還有一個條件,就是離散訊號最好可歸因,不耦合,能讓 Reward Assignment(獎勵歸因)這件事變得更乾淨。
強化學習真正想學的,不只是這次做對了做錯了,而是要從最終 Reward 反推出前面那些選擇值得以後繼續做,那些選擇應該被削弱。這就是 Credit Assignment(信用分配)的核心作用。
一個任務最後成功了,如果系統只知道整條軌跡成功,卻不知道成功主要來自那一種干預,那麼 Reward 就只能粗暴地強化整個行為序列。
真正需要被獎勵的,不是一個元件脫離環境之後永恆的價值,而是在當前 Harness 結構下,對某一部分做一次干預所帶來的條件收益。
這就是之前那些RHI論文中,把 Harness 切成幾個元件的缺陷。
比如 AHE、HarnessCompass ,雖然已經可以把 Prompt、工具、記憶、中介軟體這些元件拿來分開做實驗,但其實這些元件之間仍然可能高度耦合。記憶換掉以後,Workflow 的最佳形態可能跟著變化。而Verifier 單獨沒有收益,卻可能和重複配合以後突然有效。
所以 Reward Assignment 真正困難的地方是這次修改究竟改變了系統裡的那一組關係,最終收益又依賴那些其他結構。
如果這些耦合關係像之前的RHI論文方案裡那樣,仍然隱藏在任意程式碼呼叫裡,那麼元件雖然在檔案層面被拆開,Reward 依然很難形成穩定、可遷移的訓練訊號。
DSH 真正可能有價值的地方,就是試圖把 Harness 切成有穩定語義、可以獨立干預、可以撤銷、可以觀察影響範圍的離散單元。只有這樣,最終 Reward 才有機會往這些單元上分。
DSH/Cordis 往前多做的一步,就是它並不假裝這些元件彼此獨立,而是把「耦合」本身也變成了 Runtime(執行階段)可以看到的結構。
一個元件需要聲明自己依賴什麼能力、由那個 Provider(能力提供者)提供;Provider 發生變化以後,那些下游元件因此需要解除安裝、重新載入,Runtime 都能沿著依賴關係處理。
Cordis 甚至專門討論了 Mutual Dependencies(相互依賴)。如果兩個看似獨立的元件實際上存在雙向關係,就可以繼續拆出專門承載互動的 Integration Component(整合元件)。
也就是說,它追求的不是把複雜系統硬拆成彼此毫無關係的小塊,而是把原本藏在程序裡的關係,變成顯式的節點和連接。
這對 Reward Assignment 的意義很直接。在RSH的框架下,一次 Reward 變化以後,最佳化器能知道,這次真正替換的是那個元件,誰依賴這個元件,那些元件因為這次變化重新載入,新的執行軌跡從那兒開始起作用。
Spatial Composability(空間可組合性)的意義因此不只是外掛之間不會互相搞壞,它實際上給 Reward Attribution(獎勵歸因)提供了一張結構上的地圖,告訴系統這次干預真正波及了那一個局部子圖。
Temporal Composability(時間可組合性)則解決另一個更關鍵的問題,這些歸因能不能通過反事實實驗被驗證。
Cordis 要求通過 Context 產生的 Effect(效應)攜帶逆操作,元件解除安裝時 Runtime 可以恢復這些修改。
於是 Optimizer 可以在當前 Harness 上加入元件 A,跑一次。然後撤銷 A,儘量恢復到原狀態,再替換成 B,或者測試 A+B。
這時 Reward Assignment 就不再只是看 Log 猜功勞,而開始能夠依賴真實 Intervention(干預)去估計在當前結構 H 下,加 A 的邊際效果是多少?換成 B 怎麼樣?
所以從 RL 的角度看,DSH 真正可能比普通 Harness 元件化更優的地方,不是它把搜尋空間變得更小,甚至也不只是更離散,而是它把這個空間變得更適合歸因。
元件有身份,依賴有結構,運行影響可以追蹤,修改還能夠局部撤銷。這樣一次昂貴 Rollout 留下來的就不只是一個最終 Reward,而是「當前結構—這次干預—影響範圍—軌跡變化—最終結果」這一整條訓練訊號。
這件事對 RHI 尤其關鍵。因為在組合泛化Harness的世界觀下, RHI 最終想訓練的並不是一台記住無數成功補丁的機器,而是一套越來越會判斷「下一次應該改那裡」、「應該在這個情況下如何組合」的最佳化器。
要做到這一點,Harness 首先必須成為一個可以做 Reward Assignment 的自我修改空間。
從這個意義上說,DSH 的一切皆外掛只是第一步。Reward 第一次有機會不是只落到這一版 Harness,而是落到「在這種結構下,這一次結構干預」上。
而只有做到這一層,離散化對於 Harness 自進化的意義才真正成立。
更有意思的是,作為GPRO演算法提出者的DeepSeek,這次居然做了一個有利於Reward Assignment 的系統。這是為什麼?
GRPO 好用,本身就說明很多時候,一個很粗的終局 Reward 就夠了,根本不需要細拆獎勵配。
在 Reasoning RL(推理強化學習)裡這麼粗的訊號經常夠用,但到了 Agent / Harness RL 裡這一套其實就不太好用了。
因為在推理強化學習裡,環境中的比較條件相對幹淨。
同一道數學題,給模型采 16 個回答。16 個 Rollout(執行軌跡)都從同一個題目開始,外部世界在每次Rollout時都沒變。一個答案得 1,另一個得 0,我們雖然不知道具體是那一步造成差異,但至少可以相對有把握地認為Reward 的差異主要來自這 16 條策略軌跡本身。
所以 GRPO 可以選擇不追究到底是那一步有功,而用 Monte Carlo(蒙特卡洛)式的方法幹一件比較暴力但有效的事情,讓模型把好軌跡整體多學一點。
Rollout 足夠多以後,真正反覆出現在成功軌跡裡的行為自然更容易被強化。
但在 Agentic RL 中,環境也開始進入學習循環,而且環境狀態本身會被 Agent 的歷史行為改變。
比如一個有長期記憶的 Agent。第一條 Rollout 在第 3 輪寫進了一條錯誤記憶,後面 20 輪都繼承這條錯誤狀態。但第二條 Rollout 沒寫這條記憶。到了第 20 輪,一個成功一個失敗。你現在拿最終 Reward 做 GRPO 相對比較,實際上比較的已經不只是兩個 Action 那個更好,而是兩個已經分叉很久的環境狀態。
這時候事情就不一樣了。
今年 5 月的論文《Memory-R2: Fair Credit Assignment for Long-Horizon Memory-Augmented LLM Agents》就拿記憶元件舉了個例子。記憶會把 Agent 過去的動作 變成未來 Environment(環境)的一部分。一旦不同 Rollout 寫入、修改和刪除了不同記憶,它們就不再處於相同的 intermediate state(中間狀態)。
論文明確表示,這會破壞 GRPO 這類 group-relative method(組相對方法)進行「公平比較」的條件。因此它專門從相同中間 Memory State 重新 Rollout,比較不同動作的後果。
而7月的TRACE這類 Agentic RL 工作之所以專門做 Turn-level Credit Assignment(輪次級信用分配)或者 Hindsight Credit Assignment(事後信用分配),就是因為終局 Reward 到長時程 Agent 上會越來越稀疏、方差越來越大。
TRACE 甚至直接指出,一條最終失敗的 Rollout 裡可能包含大量其實正確、有價值的中間 Action,但 Outcome-only RL 會把它們和最後那次錯誤一起處罰。
因此,Agentic RL,需要一個更穩定的可以進行細化reward Assignment的環境。
而DSH 對 Harness RL 最重要的潛在價值,就是通過可回退效應和顯式依賴的外掛,提供更穩定的實驗狀態和更清楚的干預邊界,能讓用來比較的幾次嘗試是在足夠相似的世界裡發生的。
這或許正是 DeepSeek 在 DSH 中藏下的真正底牌。
過去幾年,整個行業將絕大部分精力投入在連續參數空間的煉丹中,試圖用更大的算力和更多的資料灌出一個全知全能的巨獸。但 DSH 的出現,意味著前沿探索正在向一個新的維度拓荒,從單純的最佳化模型權重走向最佳化智能體工作結構的離散空間。它不再把 Harness 視作供人類調遣 AI 的靜態腳手架,而是將其變成了 AI 能夠自我感知、自我驗證且自我重組的賽博物理法則。
當基礎模型的智力增長開始不可避免地遭遇邊際效應,這種基於底層原語的組合泛化與自我進化「或許才是通向 AGI 下一階段的真正鑰匙。」
DeepSeek 端出的這道看似繁瑣的新菜,從一開始,就不是做給現在的開發者吃的,而是為明天的 AI 準備的進化溫床。 (騰訊科技)
