重點摘要
- 你以為的「3 個 Agent 上限」可能是創傷的外推,不是設計 — 來自一次 OOM 事故的過度修正,結果反過來殺死你專案的角色細分工
- 正確的限制是記憶體預算,不是數量 — 16GB 機器可用 ~11GB agent 預算,混合模型(Opus/Sonnet/Haiku)可以安全跑 8+ 個專職 agent
- 但更深的問題是:角色不是頭銜,是視角 — 你該問「這個計畫需要哪些思考視角」,不是「我有幾個 slot」
- 三個永遠不能省的視角:使用者、PM、測試者 — 即使是純技術、只有 Python、只有你一個人的專案,這三個視角的思考必須發生
- 視角打分模型:每個視角用「風險 × 範圍」打 0-9 分,高分獨立成 agent,低分 fold 到其他 agent 的 prompt
- 反直覺發現:小任務(3 行 API)比大任務更需要資深視角(架構師、運維、測試),因為實作已經不是風險,「該不該存在」才是
- 壞規則會透過 template anchoring 自我強化 — 修了 runtime 規則還不夠,必須連 template 一起改
我的 AGENTS.md template 有一條規則:Agent Team 最多 3 個同時跑。這條規則是對的 — 直到我發現它正在偷偷殺死我的專案設計。
這篇文章是一趟很誠實的反思紀錄。從一次 16GB 機器 OOM 當機開始,到發現我對 AI Agent Team 的所有規則其實都建立在錯誤的抽象層上。結論不是「解除限制、大膽開 agent」,而是更根本的東西:角色根本不是我以為的那個東西。
第一層:我的規則其實是創傷,不是設計
事情是這樣開始的。2026 年 3 月 3 日,我嘗試在 16GB 的 Mini PC 上同時跑 9 個 Opus agent 做大型重構,結果系統 OOM 當機。從那一天起,我的 MEMORY.md 多了一條 Iron Rule:「Agent Team 最多 3 個同時跑」。
這條規則是理性的。9 個 Opus × 1GB ≈ 9GB,加上系統和 Docker 的常態佔用,16GB 當然吃不下。3 個是「經驗上安全」的數字。但我沒注意到一件事:這條規則是在「全 Opus」的情境下歸納出來的。我直接把它當成所有情境的通用上限,沒考慮混合模型的狀況。
更糟的是,這條規則開始滲透到我的 AGENTS.md template、我的專案計畫、我對每個新專案的初始設計。結果是:即使某個專案明明應該有架構師、後端、前端、Kafka、SQL、Test、PM、QA 八個角色,我也會「收斂」到「全端 + 檢查者 + 架構師」三人組。我不是選擇了簡化設計,是我被一條舊規則綁架了設計想像力。
第二層:記憶體預算制取代數量制
第一個修正很直覺:限制應該是記憶體總量,不是 agent 數量。16GB 機器扣掉系統和 Docker 的 ~5GB,還剩 ~11GB 可以給 agent 用。而不同模型的記憶體占用差很多:
| 模型 | 記憶體 | 適合任務類型 |
|---|---|---|
| Opus | ~1.0 GB | 架構決策、跨檔案推理、複雜邏輯、資深思考 |
| Sonnet | ~0.6 GB | 實作、API、測試、文件 |
| Haiku | ~0.4 GB | 檔案掃描、config 對照、簡單查詢 |
換算一下:一個架構師(Opus 1.0)+ 兩個後端(Sonnet × 2 = 1.2)+ 前端(Sonnet 0.6)+ SQL(Sonnet 0.6)+ Kafka(Sonnet 0.6)+ Test(Sonnet 0.6)+ QA + PM(Haiku × 2 = 0.8)= 5.4 GB,8 個 agent。完全在 11GB 預算內,還有 5.6GB 的 headroom。
所以「3 個 agent」的舊規則其實是錯的。正確的說法是「全 Opus 時 ≤ 3 個;混合模型時可以到 8+ 個,只要總和在預算內」。這一步修完,我理論上可以解鎖原本想要的專職團隊設計。
但這還不夠:我一直在錯的抽象層解決問題
我以為修到這裡就結束了。結果真正的問題還在更上面一層。
記憶體預算制解決了「能不能開 8 個 agent」的技術問題,但沒解決「我該開哪 8 個角色」的設計問題。我仍然在用「頭銜思維」想 Agent Team — 有一個固定的角色清單(架構師、後端、前端、QA…),看看預算能放幾個,從清單挑幾個進來。
這個思維的錯誤在哪?它把「角色」當成頭銜 / headcount,而角色的本質其實是視角 / perspective — 一種「怎麼思考這件事」的觀點。兩個是完全不同的東西:
| 思維 | 頭銜 Headcount | 視角 Perspective |
|---|---|---|
| 單位 | angular-dev、backend-dev | 「使用者會怎麼用」「PM 會怎麼想」 |
| 數量 | 固定清單 | 每個 plan 動態決定 |
| 「只有 Python」專案 | 1 個 Python dev 就好 | 仍需使用者、PM、測試視角 |
| 小任務(3 行) | 給最便宜的 dev | 可能需要最資深的運維視角 |
三個永遠不能省的視角
這是最實用的一條發現。不管你的專案是什麼技術、什麼規模、幾個人做,這三個視角永遠必須存在:
- 使用者視角 — 誰會用這個東西?他們的心智模型是什麼?介面怎麼設計才順?
- PM 視角 — 這件事符合大方向嗎?是現在最該做的嗎?會影響別的優先級嗎?
- 測試者視角 — 什麼會壞?邊界 case 在哪?漏掉什麼?失敗模式是什麼?
這三個視角可以 fold 到其他 agent 的 prompt 裡(例如讓 backend-dev 在設計階段戴 PM 帽子),但絕對不能默默省略。省略它們的結果是:你會產出「技術上正確、實用上無用」的東西 — API 能跑但沒人想用、feature 完成但 PM 說這不是重點、code 過 review 但上線就爆 edge case。
「只有 Python」不是跳過使用者視角的理由。「只有你一個人」不是跳過 PM 視角的理由。「只是改一行」不是跳過測試者視角的理由。這三個視角的思考必須發生,差別只在「由誰承擔」,不在「要不要做」。
視角打分模型:風險 × 範圍
光知道「要列視角」還不夠,還要知道哪些重要、哪些次要。我用的打分模型很簡單:Score = Risk × Scope,兩個維度都是 0-3,總分 0-9。
- 風險:這個視角漏掉的話多慘?(0 = 無所謂,3 = 災難)
- 範圍:這個視角涉及多少產出物?(0 = 無,3 = 全部)
分數算出來後按以下規則分組到 agent:
- Score ≥ 6:獨立 agent,很可能要用 Opus 或高階 Sonnet
- Score 3-5:獨立 agent,或跟另一個視角配對(Sonnet)
- Score 1-2:fold 到其他 agent 的 prompt,明確列入該 agent 的優先順序
- Score 0:在計畫裡 acknowledge 就好,不花 agent 資源
最後檢查記憶體預算是否超過 11GB,超過就把分數最低的兩個合併。
反直覺發現:小任務需要更資深的視角
這是這整套方法論裡最違反直覺、也最容易忽略的一條。實作越簡單的任務,反而越需要資深視角。
原因很微妙:大任務的風險分散在許多實作細節裡,實作者視角得分最高(因為「寫錯」的機率大)。但小任務的實作幾乎免費 — 風險已經轉移到別的地方了:「這東西該不該存在」(架構師視角)、「會不會在奇怪情境下爆」(測試者視角)、「運維怎麼用這個 endpoint 做決策」(運維視角)。
具體例子:幫一個 Docker 服務加 /health endpoint,回 {"status": "ok"}。
- 實作者視角:風險 1 × 範圍 1 = 1 分(3 行誰都會寫)
- 運維視角:風險 3 × 範圍 2 = 6 分(這個 endpoint 決定服務要不要被 monitoring 重啟)
- 架構師視角:風險 3 × 範圍 1 = 3 分(「健康」的定義是最大問題)
- 測試者視角:風險 2 × 範圍 1 = 2 分
- 使用者視角:風險 2 × 範圍 1 = 2 分
結論:這個任務要派一個 Sonnet agent,但 prompt 的優先順序是運維 > 架構 > 測試 > 使用者 > 實作。它不是「後端 dev 寫 3 行」,是「一個有運維腦袋的人剛好以 3 行 code 為產出」。
這個例子回答了我長久的困惑:「小任務該加一個專職 agent,還是從 tester 出發、還是從 dev 出發?」答案是 — 從得分最高的視角出發,不從頭銜出發。小任務通常是資深視角得分高,所以該派的不是 junior implementer,是帶著資深視角的人。
三個完整案例
案例 1:純 Python script(200 行,讀 CSV 做統計)
視角枚舉:Python 實作者、使用者、PM、測試者、架構師
打分:實作者 6、測試者 6(資料邊界 case 是真風險)、使用者 2、PM 1、架構師 1
分組:2 個 Sonnet(~1.2 GB)
- Agent 1:實作 + 架構 + PM 視角(優先:實作)
- Agent 2:測試 + 使用者視角(優先:測試 — 資料邊界主導)
2 個 agent,但 5 個視角都被想過了。要的是「每個視角都有思考發生」,不是「每個視角都有一個人」。
案例 2:OMS 訂單退款功能(跨前後端/Kafka/SQL/admin)
視角枚舉:架構師、安全、後端、前端、Kafka、SQL、Admin UI、測試、使用者、PM、合規
打分:每個都 ≥ 4 分,因為範圍廣且風險高(金流)
分組:9 個 agent(~6.6 GB,預算內)
- Architect(Opus)、Security(Opus)
- Backend-dev、Frontend-dev、Kafka、SQL、Admin-UI、Tester(全部 Sonnet)
- 使用者 + PM + 合規視角 fold 到一個 Haiku
這就是大型專案值得完整專職團隊的時候。注意:即使 9 個 agent,使用者和 PM 視角還是被 fold 到一個 Haiku,不是各自獨立。視角沒被省,但不一定要佔獨立 slot。
案例 3:3 行 /health endpoint(已在前面詳細分析)
分組:1 個 Sonnet,所有 5 個視角都 fold,優先順序運維 > 架構 > 測試 > 使用者 > 實作。
計畫修訂時必須重算
一個容易忽略的點:staffing 是 live document,不是一次性決定。當計畫執行到一半發現:
- 新需求浮現(「喔原來這個也要接 Kafka」)→ 新視角需要打分,決定獨立或 fold
- 某視角發現其實很關鍵(原本 fold 的安全視角,發現有 PII 暴露)→ 升級為獨立 agent
- 某視角發現其實不必要(決定不做 admin UI)→ 該 agent 退場或重新分配
每次 plan 修訂都該觸發 staffing 重算。如果 AGENTS.md 跟當前 plan 不同步,應該先更新 AGENTS.md 再繼續 dispatch。
壞規則會自我強化 — template anchoring 的陷阱
最後我想分享一個元層級的教訓,是這整件事最讓我不舒服的部分。
我一開始以為只需要改 runtime 規則(把「3 個上限」改成「預算制」)就好了。但我後來發現:壞規則會透過 template 自我強化。我的 AGENTS.md template 原本的例子只有 2 個角色(implementer + reviewer),這個「低錨」讓我每次初始化新專案時,都自動往「3-5 個角色」的方向填,幾乎從不主動設計 7-10 個。
這形成一個 feedback loop:
- 創傷 → 記憶體規則收緊到「3 個」
- Template 的例子反映記憶體規則 → 錨在低數量
- 我用 template 寫新 AGENTS.md → 產出低角色的設計
- 低角色的設計變成「標準」→ 我的記憶認為「就是這樣」
- 循環加強
光改規則不夠,template 也得改。我最後把 template 改成強迫跑完整個視角打分流程的版本:頂部要求先讀「視角驅動 staffing」的 brain,中間有「Perspective Inventory」區塊要你填每個視角的 Risk × Scope 分數,再下面是「Memory Budget」計算區塊。沒跑完流程根本填不完 template。
這個 template 和配套的方法論 brain 都放在公開的領域腦 repo裡,歡迎 clone 參考。
跟 VCS / 版本控制的關係
如果你讀過我之前那篇 Jujutsu vs Git,可能會問:視角驅動 staffing 跟 jj 有什麼關係?
答案是:沒有關係,而且這個順序很重要。視角驅動 staffing 是計畫期的事 — 你在寫 plan、決定 Agent Team 編制時發生。VCS(git / jj / worktree / workspace)是執行期的事 — Agent Team 已經成立、開始跑、產出變動需要合併的時候才登場。不能倒過來。
我之前一度把這兩件事混在一起寫(在「VCS + AI 工作流」的 brain 裡討論 Agent Team 編制),後來意識到這是錯的。Staffing 決定「要做什麼」,VCS 決定「做的產出怎麼合併」。兩者相關但獨立,混在一起會讓人以為「切到 jj 就能多開 agent」— 不是的,能多開 agent 是記憶體預算 + 視角分析的事,跟 VCS 無關。
結論:為什麼這個順序重要
我從「Agent Team 最多 3 個」走到「視角驅動編制」的這段路程,對我來說最重要的一個 meta-lesson 是:你的限制規則可能不是來自設計,而是來自創傷。一次系統炸掉的記憶,會變成一條 Iron Rule,然後透過 template anchoring 滲透到你所有未來的設計決策。
修復這種規則不能只修表面。你得:
- 檢視規則的原始情境 — 它是在什麼條件下產生的?那些條件還成立嗎?
- 把規則轉成可計算的東西 — 不是「最多 3 個」,是「11GB 預算」;不是「寫 3 行 API」,是「運維視角 6 分」
- 上升到更對的抽象層 — 從「數量」到「預算」是一次升級,從「頭銜」到「視角」是又一次升級
- 同時改 template — 不然新專案會繼承舊錨,規則永遠修不乾淨
這個流程不只適用 Agent Team 編制,適用任何你「歸納」出來的工程規則。下次你發現自己下意識地拒絕某個選項(「不能這樣做,會爆」),請誠實問自己:這個規則是設計來的,還是創傷來的?如果是後者,它可能正在偷偷殺死你的系統設計,而你根本沒意識到。