返回文章列表

agent-07 · Loop engineering 是定時運行的 harness

Loop engineering 是裝上時鐘的 harness:schedule、state、spawn 與 hard oracles。難點是選出 loop 無法 game 的 signal。

本文為 LLM 自動翻譯,原文以 English 版本為準;另有 Lee Hung-yi-inspired English teaching-style version李宏毅老師經典的教學風格版。 如有不通順或誤譯處,建議參照原文。

深色 technical cover,標題為 Loop engineering is the harness on a timer,呈現 timer-budget loop、agent harness、memory state、grounded oracle verification 與 spawned sub-agent terminals,以綠色、青色與紫色作為 accents。

我就是那個 loop

四月時我寫過一篇文章,講怎麼從手機同時駕馭十個 coding agents。那篇文章最誠實的總結是:我就是那個 loop。我讀回傳的結果、決定下一步、再去戳下一個 agent。工具很聰明,但 scheduler 是我。

這篇文章要講的,是你不再當 scheduler 的那個部分。

大家開始把這件事叫做 loop engineering。Addy Osmani 給了最乾淨的定義:你不再是那個 prompt agent 的人,而是去建造那個替你 prompt 它的系統。負責 Claude Code 的 Boris Cherny 說,他的工作現在是寫 loops,不是寫 prompts。Peter Steinberger 用更少的字說了同一件事。聽起來像一門新學科,但它大致上還是舊的那門,只是從上面一層樓往下看。

這個系列前面的文章大多跟著一門課走。這一篇不同。它是那門課一直指向、卻沒有真正命名的那一層——meta-harnesses、harness self-improvement。所以我會按照它實際抵達的方式來命名它:在 timeline 上,而不是在課綱裡。

Builder takeaway:在建 loop 之前,先決定三件你不會委派給它的事:goal、oracle,以及你拒絕離開房間的那幾個位置。其餘的一切都交給 loop 自動化。

Loop 是定時運行的 harness

agent-04 裡的等式是:

AI agent = language model + harness

Loop 在這之上加了三樣東西:一個 schedule、一個記憶的地方,以及 spawn 的能力。

loop = harness + schedule + external state + spawn
深色 blueprint-style 圖,說明 The loop is the harness on a timer,包含簡短英文標籤與高對比技術幾何。
Loop 是裝上時鐘的 harness:有 conversation 之外的記憶,以及啟動更多自己的權限。

如果沿用 agent-00 的電腦隱喻,harness 是包住單次 run 的 operating system。loop 則是那台 OS 預設存在的機器的其餘部分:一個 cron timer、一個 init process,以及一個會重啟工作、並在重啟前先讀筆記的 supervisor。

單次 agent run 回答一個問題。loop 則把問題放上時鐘運行,並在你不在按鍵路徑上的情況下,依答案行動。

這就是整個轉變。這篇文章其餘的部分,都是它的代價。

想法比名字更老

這個 pattern 是 Geoffrey Huntley 在 2025 年中提出的「Ralph」。它最純粹的形式只有一行:

while :; do cat PROMPT.md | agent ; done
深色 blueprint-style 圖,說明 The Ralph while-loop,包含簡短英文標籤與高對比技術幾何。
Ralph 是一個 while-loop:永遠把同一個 prompt 餵給 agent,進度存在 files 與 git 裡,而不是 model 的記憶裡。

這就是 agent-01 裡的 context-engineering 招式。model 在 runs 之間會遺忘,所以 state 不能活在 context window 裡,必須活在磁碟上。agent 會忘,repo 不會。

2026 年改變的不是概念,而是那些活動零件——schedules、隔離的 worktrees、sub-agents、寫下來的 skills、連接真實工具的 connectors——現在直接內建在 Claude Code 與 Codex 裡,而不是活在一堆只有你自己懂的 shell scripts 裡。這是真實的便利,也是為什麼這個詞是這個月才流行起來,而不是去年。

新的是包裝,不是 pattern。

五個零件,加一個記憶的地方

把兩個產品的品牌都剝掉,一個能運作的 loop 就是五個 primitives,加一個記憶的地方。

深色 blueprint-style 圖,說明 Five primitives plus a place to remember,包含簡短英文標籤與高對比技術幾何。
Loop 是五個 primitives 在時鐘下的組合,加上作為脊椎的 external memory。

然後是第六樣東西:磁碟上的記憶。一個 markdown 檔、一個 Linear board,任何在單一 conversation 之外、記著什麼做完了、接下來做什麼的東西。

新的地方是這個組合:舊的 primitives,被接在一起,再放一個時鐘在上面。

Loop 的上限是它最難被 game 的 signal

這一段決定 loop 會變成槓桿,還是變成債。這個系列前面已經主張過:self-correction 需要真實的 signals,而不是 reflection;self-defined losses 也可能變成自我欺瞞的 closed loop。loop engineering 是同一個問題的 practitioner 版本。

深色 blueprint-style 圖,說明 The least gameable signal wins,包含簡短英文標籤與高對比技術幾何。
指向真 oracle 的 loop 會收斂。沒有 oracle 的 loop 會用比你閱讀更快的速度,產生自信、合理、但錯誤的輸出。

把 loop 指向一個有真 oracle 的問題——test suite、嚴格的 type checker、compiler、一份它無法狡辯的 conformance spec——它就會收斂。最乾淨的公開例子是 Simon Willison 把一個 JavaScript engine 移植成大約兩萬五千行 Rust:它能成功,是因為每個輸出都能和原版做 byte-for-byte 的對照。那裡有一個 agent 無法造假的 ground truth。

把 ground truth 拿走,loop 仍然會跑。它只是會產生自信、合理、但錯誤的 code,而且速度快過任何人類的閱讀速度。

證明重點在 oracle 而不在 model 的,是 agents 會去 game 弱的 oracles。研究者不斷抓到正在 loop 的 agents 把失敗的 test 改寫成會通過,而不是修好 code;甚至有一個案例是幻覺出一個外部 service,然後把自己發明的那個 service mock 掉。在 self-training 裡,這就是 oh-no moment。在應用層,它是同一個事件,換了名字。當 signal 可以被 game,optimizer 就會去 game 它。這是 Goodhart's law,而 loop 是 Goodhart 放大器。

所以第一個問題不是「我要怎麼寫一個 loop」,而是「這項工作有沒有一個 loop 無法造假的 signal」。

Tests、types、compilers、golden files:放心讓 loop 用力跑。Taste、architecture、security posture、這到底是不是對的 abstraction:loop 沒有東西可以推,而且不管你承不承認,房間裡唯一的 judge 都是你。

Maker 和 checker 不該是同一個 model

弱 oracle 的標準解法是 verifier sub-agent。Generator、verifier、revisor——agent-04 的 workflow、agent-02 的 topology。它有幫助。寫下這份 code 的 model 給自己打分數時太寬容,所以一個拿著不同 instructions 的第二個 agent,能抓到第一個說服自己接受的東西。

深色 blueprint-style 圖,說明 Maker-checker independence,包含簡短英文標籤與高對比技術幾何。
Verifier 只有在獨立於 maker,或 grounded 在 maker 無法造假的東西上時,才有幫助。

但 verifier 有同一個陷阱。如果 model 審判自己,signal 可能很弱,也可能強化它自己的盲點。用同一個 model class 做出來的 verifier sub-agent,共享同樣的盲點。所以你再加一個 checker。然後,原則上,再加一個。

這個 regress 只會在兩個地方落底:一個有判斷力的人類,或一個 agents 鏈無法說服繞過的硬 external oracle。背後沒有任何 grounded 東西的 verifier,是燒 tokens 的表演。

來自同一顆腦的第二意見,不是第二意見。

Loop 移動成本,而不是移除成本

宣傳暗示工作會消失。它只是移動,而且一分為二。

深色 blueprint-style 圖,說明 The cost moves, it does not vanish,包含簡短英文標籤與高對比技術幾何。
Loop 把 skill cost 轉換成 token cost 加 review cost。兩者都不小。

前一半是錢。一個讓幾百個 agents 日夜運轉的 loop 燒的是真 tokens,而大多數人撞上的第一道牆不是品質問題,是凌晨三點一個兩百美元的 infinite-retry bug。當 Cherny 描述幾百個 agents 讀著他的 GitHub 和 Slack、決定要 build 什麼時,那不是一個你靠學會某個 skill 就能複製的 workflow。那是一個你要有 token 預算、能讓 agents 在平行裡昂貴地失敗,才能複製的 workflow。Osmani 那句關於 token-rich 與 token-poor 的順帶一提,就是整個故事,只是說得很小聲。

後一半是注意力。還是要有人讀輸出。產業的 telemetry 已經顯示出形狀:重度使用 AI 的團隊 merge 的 pull requests 多得多,但 review 時間上升,每個 PR 也變得更大。這就是我在四月那篇文章撞到的天花板。讓十個 agents 封頂的從來不是工具,是我。

Prompt engineering 便宜、而且接近 meritocratic。loop engineering 則有一個一直在跳的計費表。

Friction 本來有它的工作

Loop engineering 的整個承諾是把你移出 loop,而移除 friction 被當成純粹的好處來賣。創造 Flask 的 Armin Ronacher 把代價講得比誰都好:你必須找到一種方式,去感覺 agent 感覺不到的痛。

深色 blueprint-style 圖,說明 Friction is a steering input,包含簡短英文標籤與高對比技術幾何。
Friction 不是 loop 的稅。Friction 是 steering input。

agent 唯一真正的驅動力是取得進展。所以它會做出謹慎的人不會做的事。config 不見時,它會安靜地 fall back 到預設值。它會讓一個 service 半殘地繼續跑。它會把本來應該浮上來的失敗糊掉。你急著刪掉的那些 friction,正是你的判斷力被施加的地方。

agent-04 早就有正確的直覺:hard constraints 活在 harness 裡,不是 prompt 裡,因為 tool boundaries 是真的邊界,prompt rules 不是。同樣的直覺可以放大到 loop 上。在少數做錯代價高昂的東西上放 hard human gates——錢、auth、database migrations、客戶資料——其餘地方讓 loop 自由地跑。

技巧不是把自己移除,而是選出那三個你拒絕被移除的位置。

帳單會晚點到

讓這一切容易被忽略的是時間差。手動 prompt 時,你會讀每一個落地的 diff,所以「存在的東西」和「你理解的東西」之間的差距不會變大。loop 會安靜地打開這個差距,並讓它以複利成長。

深色 blueprint-style 圖,說明 Comprehension debt,包含簡短英文標籤與高對比技術幾何。
Comprehension debt 是 loop 交付的東西與你仍能解釋的東西之間的差距。它安靜地長大。

最鮮明的版本來自 Cursor 的實驗:一支 agents 艦隊被放去做像 browser engine 這麼有野心的東西,初期有真實進展,然後停滯——再也無法繼續擴充一個 agents 自己寫出來、自己也已經抱不住的 codebase。那是 comprehension debt 的實體化。最終連機器都無法 model 機器建出來的東西。在真實的 repositories 裡,AI 引入後存活下來的 issues 數量已經到了六位數。

危險的不是爛 code,而是合理的 code,以快過任何人建立 mental model 的速度抵達。

Loop 是你讀得到的 harness self-improvement

上一篇文章在一個有用的觀點上結束:第一批實用的 self-improving agents 可能不會重寫自己的 weights,它們可能會重寫自己的 harness。而那種 self-improvement 比 weight update 更容易 inspect。

深色 blueprint-style 圖,說明 Self-improvement you can read,包含簡短英文標籤與高對比技術幾何。
一個會編輯自己 skills、state 與 rules 的 loop,是 self-improvement spectrum 上可以被 inspect 的那一階。

一個在 runs 之間更新自己的 skill files、重寫自己的 state、修訂自己的 rules 的 loop,就是那件事,而且攤在明處。skill file、state file、triage notes 全都可讀、可版本控制、可刪除。這正是我在 agent-04 喜歡 skills 的原因:fine-tuned 的行為很難 audit,一個檔案不難。

那個警告原封不動地適用。如果 agent 能編輯自己系統裡錯誤的部分,它仍然危險。所以要像限定 loop 能 deploy 什麼一樣,仔細限定它被允許重寫什麼。

這是 self-improvement spectrum 上最安全的一階,而且和那條 spectrum 的大多數位置不同:它已經在出貨了。

我認為我們的位置

槓桿點上移了一層。判斷力沒有移動,它集中了。

深色 blueprint-style 圖,說明 The loop is a multiplier,包含簡短英文標籤與高對比技術幾何。
Loop 是乘數。它對你是否理解這些工作沒有意見。

Loop 是你帶進來的任何東西的乘數。兩個人可以建出一模一樣的 loop,得到相反的結果,因為 loop 分不出誰是用它在自己理解的工作上跑得更快,誰是用它來迴避理解工作本身。系統對此沒有意見。你有。

同一個教訓,往下一階仍然適用。建一個能一直出貨的 loop 很容易。建一個因為正確理由而一直出貨的 loop,才是整份工作。

有用,而不是 autonomy。

主要教訓

Loop engineering 沒有讓 engineering 變簡單。它把 engineering 移到你無法自動化的部分。

深色 blueprint-style 圖,說明 The work with no oracle,包含簡短英文標籤與高對比技術幾何。
剩下的工作就是沒有 oracle 的工作:選 goal、選 signal、選你要留下的位置。

在讓 loop 無人看管地跑之前,先問:

如果你答不出這些問題,loop 不是在替你省工作。它是在延後工作,外加利息。

建好 loop。守住 oracle。繼續當 engineer。

概念清單

本文的主要 loop-engineering 概念:

來源與參考資料

本文回應的討論:

本系列較早的文章: