同步至個人站點:Harness 工程:不是新詞,而是 Agent 工程終於被講明白了

這兩天,Agent 圈突然開始密集討論一個詞:Harness。
很多人第一次看到它,會覺得這是個新框架、新範式,甚至像是什麼「下一代 Agent 技術名詞」。
但我看了一圈後,第一反應其實很簡單:
這不就是我之前在做 memo code 時,一直在做的那套東西嗎?
更準確一點說:
Harness 不是一個新技術發明。它更像是 Agent 工程裡那部分一直存在、但過去沒有被完整命名的「軟體工程現實」。
前段時間我去高校做 Agent 開發交流時,也一直在講一個非常樸素的判斷:
Agent = Loop(LLM + Context + Tools)
這個 loop 本身並不複雜。
真正難的,還是 軟體工程。
現在回頭看,所謂 Harness,某種意義上就是把我當時說的「軟體工程」這件事,具象化了、命名了、體系化了。OpenAI 在 2026 年 2 月發布的官方文章裡,幾乎就是這麼描述的:工程師的工作正從「寫程式碼」轉向「設計環境、指定意圖、建立回饋迴路,讓 agent 能可靠工作」;他們甚至用小團隊在幾個月裡借助 Codex 產出約百萬行程式碼作為案例。
所以這篇文章,我不想把 Harness 當作一個「熱詞解讀」。
我更想做另一件事:
把 Harness 這件事,從 Agent 工程的角度,完整講明白。
先說我的定義:
Harness 不是模型。不是提示詞。不是工具呼叫。不是框架。Harness 是 Agent 運行時的「工程環境總和」。
這個「環境總和」裡包含什麼?
至少包括這幾類東西:
如果你把 Agent 想成一個「會呼叫工具的大腦」,那 Harness 就是:
你給這個大腦配的身體、感測器、護欄、操作台、流程制度、回執系統,以及出事後的保險。
所以我更願意把它翻成:
Harness = 駕馭系統或者更工程一點:
Harness = 讓 Agent 能被穩定駕馭的環境系統
OpenAI 後續關於 Codex App Server 的文章也把這件事說得更具體:所謂 harness,不只是「使用者–模型–工具」的核心 loop,還包括執行緒生命週期與持久化、配置與鑑權、工具執行與擴展、用戶端與執行時之間的協定層。也就是說,真正的 harness 不是一個提示詞檔案,而是一個完整的執行時。
因為業界終於開始承認一件事:
Agent 的問題,越來越不是「模型夠不夠聰明」,而是「環境夠不夠好」。
同一個模型,放到不同系統裡,表現會差得非常大。
有的 agent:
而有的 agent:
這也是我當時做 memo code 時非常在意的一點。
我故意沒有把測試重心放在「最新最強模型」上。相反,我很長一段時間都在用一個已經發布將近一年的 DeepSeek 模型來測。原因很簡單:
我想驗證的不是「模型天賦有多高」,而是「環境設計能把一個普通模型托到什麼程度」。
如果一個相對古早的模型,在這套環境裡仍然能做成事,那說明這套工程方向是對的。這比「換個新模型突然變強」更有價值。
這也和最近公開的一些工程經驗是對齊的。OpenAI 把重點放在支架(scaffolding)、環境約束、回饋迴路和可讀程式碼庫上;OPENDEV 那篇論文則把重點放在安全控制、上下文壓縮、工作負載路由、記憶系統和事件驅動提醒上。兩邊說法不同,但本質一致:
Agent 的能力,不只是模型能力,而是模型 × 環境。
因為從原理上講,Agent 真的不複雜。
我在分享裡說過:
Agent = Loop(LLM + Context + Tools)
或者更直白一點:
在一個迴圈裡,提供一些工具、維護一個上下文,再呼叫大型語言模型(LLM)。
這件事的抽象層面,你甚至十幾分鐘就能給它寫個最小版本。你給模型一個系統提示詞,給它幾個工具,讓它在迴圈裡不斷決定「要不要繼續做事」,這就已經是 agent 了。
所以真正的問題不在「能不能做出一個 loop」。
真正的問題在於:
一個 loop,為什麼會在生產環境裡爛掉?
答案通常不是因為模型突然變笨了,而是因為下面這些工程問題開始集中出現:
這些問題,全部都不是「模型理論問題」。
它們是徹頭徹尾的軟體工程問題。
而 Harness,這個詞的價值就在這裡:
它提醒你,Agent 專案的真正主戰場,不是模型層,而是運行環境層。
我看到不少討論會把 Harness 和 Context Engineering 混在一起。
我覺得可以這樣區分:
1)Prompt Engineering(提示詞工程)
關注的是:怎麼說
比如系統提示詞怎麼寫,few-shot 怎麼擺,措辭怎麼調。
2)Context Engineering(情境工程 / 上下文工程)
關注的是:給模型什麼資訊
比如:
3)Harness Engineering(駕馭系統工程)
關注的是:模型在什麼環境裡做事
它比 Context 更大一層。
因為它不只管「餵什麼」,還管:
所以我會說:
Context Engineering 是 Harness 的一個組成部分,但 Harness 不等於 Context。
OpenAI 官方中文頁裡有一句話我很認同:情境是一種稀缺資源,巨大指令文件會擠掉任務、程式碼和相關文件,導致 agent 開始圍繞錯誤約束優化。這個觀察本身說的是 context,但他們整篇文章講的解決方式,其實已經進入 harness 級別了:程式碼庫結構、AGENTS.md、審閱回路、驗證手段、倉庫作為紀錄系統、熵管理。
如果讓我用 memo code 的經驗來拆,我會把 Harness 至少拆成五層。
很多人以為系統提示詞就是一份大 Markdown。
其實不是。
在 memo 裡,我更在意的是:提示詞不是靜態文件,而是動態拼裝系統。
我在那篇《系統提示詞架構解析》裡把它拆成六層:
這個拆法的重點不是「層多」,而是:
不同來源的資訊,有不同優先級、不同新鮮度、不同職責。
它們不能全塞進一個大 prompt 裡,然後指望模型自己理解層級關係。你必須先在工程上把層級關係建好,再交給模型。
這就是 Harness。因為你不是在「寫提示詞」,你是在「設計上下文的注入機制」。
一個 agent 只要開始接工具,複雜度會立刻上升。
因為工具不是「多幾個 function call」這麼簡單。工具系統背後至少有四個問題:
我在 memo 的工具系統設計裡,把這件事拆成三層:
這個設計的重點不是「優雅」,而是:
讓工具呼叫成為一個可治理系統,而不是一堆裸奔介面。
很多 Agent 專案為什麼一開始能跑,後來越來越不穩?
因為它們的工具系統不是「系統」,只是「工具列表」。
而 Harness 的一個核心任務,就是把工具從「模型可以呼叫的能力」提升成「可控、可審計、可演化的執行時能力」。
只要 agent 能寫檔案、跑 shell、改設定,它就不再是一個「聊天模型」。
它已經是個作業系統參與者了。
這時候安全問題不是「以後再說」,而是第一天就存在。
我在 memo 的安全設計裡,最後收斂成了三道防線:
這裡最關鍵的一點是:
安全不能只靠模型自覺。
你不能把「請不要執行危險命令」寫在提示詞裡,然後假裝問題解決了。真正的安全邊界,必須落在執行時。
這也是 Harness 和很多「Demo Agent」的根本差別。
Demo 級別的 agent 靠的是「模型大概會乖」。Harness 級別的 agent 靠的是「即便模型不乖,系統也有邊界」。
Agent 之所以能持續做事,不是因為它會一直「想」。
而是因為它會不斷收到回饋。
比如:
在 memo 的提示詞架構裡,我專門用 XML system_hint 去承載一些異常狀態,比如:
很多人會覺得這只是「小技巧」。
但我不這麼看。
這其實是 Harness 裡非常重要的一件事:
你要把系統內部發生的事,翻譯成模型能消費的回饋語言。
如果沒有這層翻譯,模型只能看到「失敗了」。而有了這層翻譯,它才能理解:
這直接決定了 agent 是否能做出下一步正確行動。
這是我覺得很多人會忽略,但其實特別關鍵的一層。
Agent 一旦持續運行,系統一定會逐漸「變髒」。
表現形式包括:
OpenAI 在那篇文章裡其實已經非常明確提到了這件事:當一切都重要時,一切都不重要;大而全的說明文件會迅速腐爛。
所以 Harness 不是「搭完就完了」。
Harness 還有一個長期任務:
持續做熵管理。
也就是:
如果沒有這層意識,再強的 agent 也會越跑越歪。
如果一定要我用一句話概括,我會這麼說:
Harness 工程,就是把 Agent 從「會呼叫工具的模型」,變成「能在約束中穩定完成任務的系統」。
這裡面最重要的詞不是 Agent,也不是模型。
是三個詞:
因為真實世界裡的 agent,不是靠「聰明」活下來的。
是靠:
活下來的。
所以我一直覺得,Agent 的重點從來都不在模型。
模型當然重要。但模型更像引擎。
真正決定這台車能不能上路、能不能跑長途、會不會翻車的,是底下那整套工程環境。
也就是 Harness。
如果以前我會說:
Agent = Loop(LLM + Context + Tools)
那現在我會更進一步,把它升級成:
Agent = Loop(Model + Harness)
為什麼我要這麼改?
因為 Context 和 Tools 其實都已經屬於 Harness 的一部分了。
真正決定 agent 上限的,越來越不是「你有沒有這些元件」,而是:
你有沒有把這些元件工程化成一個可以長期運轉的環境。
同樣是:
有人做出來的是玩具。有人做出來的是生產系統。
差別就在 Harness。
我給一個非常實用的落地順序。
先把環境搭起來。
因為環境是可複用資產,換模型能繼承;但只靠換模型,通常不能替你補環境債。
至少做到:
把 prompt 當成裝配系統,不要當成單文件。
不要把安全寄託在提示詞上。
讓系統錯誤能回流成模型能理解的回饋。
沒有狀態管理,就沒有真正的持續執行。
規則、記憶、會話、文件,會腐爛。你不清理,系統就會慢慢失控。
我很少會因為一個新詞本身而興奮。
但這次我覺得 Harness 這個詞是有價值的。
因為它終於把很多 Agent 開發者長期在做、但總說不清的事情,命名清楚了:
它把這些零散經驗,收束成了一個更明確的討論入口。
所以我不認為 Harness 是什麼「橫空出世的新發明」。
我更願意說:
Harness 讓 Agent 工程這門課,終於有了一個更準確的詞。
回頭看 memo code,我越來越確認一件事:
我當時真正做的事情,不只是「做一個 coding agent」。
我其實一直在做一套 Harness。
我做的那些看起來很「工程瑣事」的東西:
這些東西單拿出來都不性感。
但正是這些東西,決定了一個 agent 最後到底是:
所以如果今天再讓我用一句最簡短的話來講 Agent,我可能會這麼說:
Agent 的核心很簡單,真正難的是 Harness。
或者更直白一點:
Agent 的重點不在模型,而在環境。
這句話,我之前是這麼想的。現在我只是終於有了一個更流行的詞,來把它說得更完整一點。
(完)