大多數 AI agent 是一次一回合的。你打字,它回應,它等下一句。循環是你在跑,agent 只是被呼叫的那個函式。
Hermes Agent 預設就是這一種。但它還帶了另一種叫 /goal 的模式——這次反過來,循環交給 agent 自己跑。你設一個目標加幾條驗收標準,agent 就一輪一輪地提案、執行、自評、重試,跑到另一個 judge 模型確認條件達成為止。v0.14.0(2026 年 5 月 16 日)又補了一個 /subgoal,讓你能在跑到一半的循環裡再疊新的判據上去,不用重啟(#25449)。
這篇文章把這件事拆開看:它底下到底在做什麼,什麼時候它是對的工具,什麼時候它會反過來咬你。
預設模式(先拿來做對照)
Hermes 裡每一段聊天,節奏都是一條使用者訊息對一回合。agent 把你的訊息讀完,需要的話呼叫幾個工具,把回應吐回來。任務沒做完的話,得你來戳它:「接著做」、「再試一次」、「那 X 怎麼辦」。外層循環是你在跑。
幹探索性的活兒這套挺好——「解釋一下這段程式碼」、「起草一份備忘」、「幫我找個 bug」。你就是想讓 agent 每走一步停一下,方便你隨時撥方向。
但碰上那種成敗說得清、路徑又得反覆磨的活兒,這套就不靈了。「把這個模組重構到 pytest 通過」——你一回合一回合手動推,是個三十回合的活。換成 /goal,一條指令就夠了。
/goal 到底做了什麼
/goal Make all tests in tests/api/ pass. Don't change the test assertions. Done when pytest exits 0.
你把這條丟過去之後,三件事會發生:
- 1.目標文字變成 worker 的 target prompt。 接下來的每一輪,worker 模型會拿到一條系統訊息,裡面帶著目標和當前的最佳嘗試。
- 2.每跑完一輪 worker,會單獨再呼叫一次「judge」模型。 judge 看到的是目標、當前狀態、worker 給的這版完成稿。它要麼回 "done"(循環退出),要麼回「繼續,還差這些」。
- 3.判定是 judge 說的算。 它不點頭循環就不停——直到 judge 同意為止,或者你用
/stop自己叫停,或者打到設定好的迭代上限。
judge 是整套東西的關鍵。它和 worker 不是同一次 LLM 呼叫,它也看不到 worker 的思維鏈——它只看目標和當前狀態。這層分離正是 /goal 能成立的原因:一個已經被自己說服答案是對的 worker,是個糟糕的法官。一次沒有任何上下文、白紙一張被叫起來的 LLM,做這件事好太多了。
這套模式在 Hermes 程式碼庫內部被叫作 "Ralph loop",名字來自那一段經典虛擬碼——while not done: do(work); ralph = judge(work)。v0.14.0 加的 /subgoal 擴充,是讓使用者能把新的判據塞進一個還在跑的循環裡。
/subgoal —— 跑到一半再追加判據
你起了一個 /goal 來重構一個模組。跑到第三輪你忽然想到——這次重構最好順便把每個函式的圈複雜度壓到 10 以下。你又不想停掉重來。
/subgoal Each function must have cyclomatic complexity <= 10.
judge 下一次跑的時候,會把這條新約束一起算進來。當前最佳嘗試如果沒過這一條,循環繼續。如果過了,循環退出。
這種功能在 release notes 裡只是一行 bullet——「使用者可以往進行中的 /goal 追加判據」——但你一旦真用過這個循環,會發現它是一根承重柱。真實的目標是你看著 agent 幹活時一邊看一邊精細化出來的。沒有 /subgoal,你要精細化只能 /stop + 重新寫 + 再 /goal 一次——跑到一半的狀態全丟了。
幾個實際例子
重構到測試通過
/goal Refactor src/api/users.py so the User class follows the new naming convention in src/conventions.md. Don't break any existing tests. Done when:
1. pytest exits 0
2. The User class matches the convention rules in conventions.md
worker 一輪一輪試重構,judge 檢查這兩條。兩條都綠了,循環退出。
反覆調一個 UI
/goal Make the button on /pricing more prominent. Done when:
1. The button is the largest interactive element above the fold on desktop
2. It uses the primary brand color (#FF5A50)
3. Existing Lighthouse accessibility score doesn't drop
worker 改 CSS,judge 用 browser 工具截圖來核對。可以跑很多輪迭代——你不用一直盯著。
揪一個 bug
/goal Find the cause of the intermittent test failure in tests/auth/test_session.py::test_logout_clears_cookie. Done when you produce a minimal failing repro and a one-paragraph explanation.
這裡 judge 要核對的是交付物的兩部分都得在——最小重現和一段解釋——而不是只要湊齊一邊就行。如果第一稿的解釋太虛,/subgoal 讓你能補一條比如「解釋裡必須引用到對應的請求/回應鏈路」。
什麼時候不該用它
/goal 在下面這些任務裡是錯的工具:
- •成敗判據本身是糊的。 「把這個寫得更優雅一點」——judge 沒法穩定打分,循環要麼來回震盪,要麼直接蓋章放行。這種用回逐回合。
- •你想邊看邊介入。 每一輪都得跑完 worker 再起 judge,過程中沒有逐步可見度。要中途審,用回逐回合,或者上
/handoff。 - •你更在乎成本,不是速度。 一輪 = 一次 worker 呼叫 + 一次 judge 呼叫。十輪的目標就是二十次 LLM 呼叫。重構活兒值這個錢,「幫我想個變數名」就是浪費。
- •你根本沒認真想成功標準。 判據糊弄 → 循環也糊弄。
/goal獎勵的是寫得具體;判據有漏洞,agent 會從漏洞鑽過去。
/goal 怎麼和 /handoff 一起用
v0.14.0 同時也出了 /handoff——它能在不丟上下文的前提下,把一個正在跑的會話從一個模型搬到另一個(#23395)。這兩個能拼起來用:一個跑著的 /goal 撞到快模型搞不定的地方,你可以把它熱遷到一個更擅長深推理的模型上。judge 還是按同一套判據打分,只不過 worker 換成更靠譜的那個了。
/sessions(#20805)也類似——你可以把一個 /goal 臨時打斷,去別的會話裡轉一圈,回頭再續上。循環狀態有 checkpoint。
它在 agent 這一整套譜系裡的位置
自治程度從低到高,agent 幹活有三種形狀:
- 1.逐回合 —— 你駕駛,agent 應答。對話式。
- 2.
/goal—— 你定判據,agent 自己跑到判據達成。有邊界的自治。 - 3.Cron 排程 —— agent 按點無人值守地跑,結果投遞到聊天平台。時間維度上沒邊界的自治。
/goal 占在中間這一格。它適合那一類原來你要麼得一直盯著、要麼得自己寫腳本的活兒。v0.14.0 那個 /subgoal 讓循環跑著也能撥方向——就這一下,它從「挺有意思的功能」變成了日常工具。