一個人 + 幾個 AI agent = 一支工程團隊。工程師也該學著當當Manager了嗎?被自家的Hermes兇回來可是難得的經驗

我一直覺得 Karpathy 提過的 LLM Wiki 概念,可能是 PKMS 比較合理的答案。不是把知識整理成一套靜態筆記,而是讓 LLM 在需要時自己找出相關內容,組成當下真正需要的 context。

我先試了 Obsidian 的 OLW。它會自動分析、拆解和索引筆記,再在對話時把相關知識片段塞給 LLM。概念是對的,體驗也很好,但它原本只在本機上使用。如果想讓別人也能用,甚至支援多人和不同專案,就得把整套東西搬上雲端。

三個禮拜後,LLM Wiki Cloud誕生了。它支援多租戶和 BYOK,前端是 Next.js on Vercel,後端是 Go on Cloud Run,pipeline worker 透過 GCS FUSE 處理檔案,資料面則用 Firestore 和 GCS。從 infra、i18n、admin portal 到 rate limiting,幾乎都是我一個人和 AI 協作完成的。

現在可以到 wiki.rayer.idv.tw 點「試用 Demo」。裡面有生活筆記、AI 文件和模擬專業知識庫幾個專案。你可以在生活筆記裡搜尋「台北適合工作的咖啡廳」,再切換 Wiki 模式和完整模式,看看同一個 query 在回答深度和引用方式上有什麼不同。LLM Wiki 的核心不是再做一個聊天機器人,而是讓 LLM 先讀你的知識,再回答問題,而且能告訴你答案是從哪些條目來的。

產品還沒正式開放,還有一些東西要修。不過這篇真正想談的,不是產品功能,而是我後來摸索出來的開發流程:為什麼我不再把一整個需求直接丟給 coding agent,然後滿懷期待地看著它自己做完。

一個 Agent 打全部,問題不只是 Context 太長

「其實我腦袋記住的東西,都會反映在你付出的Token Fee帳單喔」

現在很多人的做法是打開 Cursor、Claude Code 或 Codex,用自然語言描述需求,讓 AI 自己讀 code、做設計、修改檔案、跑測試、開 PR。這種方式很爽,我也試過,但後來我放棄讓同一個 agent 同時負責所有事情。

問題通常不在於它寫的 code 能不能跑。多數時候可以。真正麻煩的是,你不知道它有沒有理解這次修改涉及的模組 contract,有沒有忽略某條隱含資料流,選的方案是不是超出產品真正需要的範圍。更麻煩的是,它寫的測試可能只是驗證自己對需求的理解,而不是驗證需求本身。

單一 agent 同時扮演 architect、PM、developer 和 reviewer,意味著它不只要理解 codebase,還要記得產品需求、測試方式、PR 規則、部署限制和各種隱含約定。Context 一大,重要訊息就很容易被埋掉。最後人類還是不敢不逐行看,等於 coding agent 加快了輸出速度,卻沒有真正降低理解和驗證成本。

有人會說,這可以用 sub-agent 解決。把大任務拆成小任務,交給不同 sub-agent,各自只讀一部分 context,當然比一個 agent 從頭扛到尾好。但我覺得這還不算真正的責任分離。

一方面,單一 coding-agent 平台內建的 sub-agent,通常仍受限於同一供應商提供的模型選項。就算設定不同,它們的錯誤模式仍可能高度相關。這不是說同一家族的模型一定會犯一模一樣的錯,而是多個 sub-agent 得出一致結論,不能直接視為獨立驗證。

另一方面,即使工具有保留 sub-agent 的執行紀錄,那些內容通常還是某次 session 裡的對話。真正出問題時,我需要的不是幾萬字 transcript,而是能快速回頭看懂:當初判斷的 root cause 是什麼、為什麼選這個方案、哪些替代方案被放棄、驗收條件是什麼。

所以我的做法不是讓 agent 彼此一直聊天,而是要求它們把結論寫進 ticket。

不是 agent 跟 agent 對話,是 agent 跟票對話。我說啊,會議都有紀要,總不能純對話聊天,然後明天就忘光光了吧?

AI降低了成本… 以極低的薪水幫你找隊友

「阿不就AI Agent不適用勞基法」 — 某次AI對話的吐槽… 我家Hermes被我養得怪怪的

目前我的流程有幾個明確角色:

我(Rayer)
  ↕ 討論產品方向、架構與 priority
Hermes(TPM + Orchestrator)
  ↕ 分析問題、整理 spec、開票、dispatch
Coding Agent(Codex / Grok Build)
  ↕ 讀 spec、列 plan、寫測試、實作、開 PR
YouTrack + Git repository
  ↕ 保存任務 context、長期規則與執行紀錄

PR review 階段,我通常還會再找另一個模型家族的 build agent來當吃瓜群眾Reviewer,提供一個比較獨立的觀點。

我的工作不是每次都逐行 review 所有 code,而是守住產品方向、架構邊界和高風險區域。小範圍 UI 調整或局部純函數,我主要看方向、測試和輸出;跨模組行為要看 contract 和 side effect;auth、權限、資料遷移、infra 這種東西,我還是會深入看。責任分離不是讓人類不 review,而是讓人類把注意力用在真正危險的地方。

Hermes 扮演的 TPM 也不是傳統上只整理需求的 PM。它必須能讀 codebase、定位問題、理解跨模組影響,並把問題整理成 coding agent 能執行的 ticket。它不需要親自寫 production code,但至少要先回答:root cause 是什麼、在哪個檔案和函數發生、什麼條件會觸發、fix 要怎麼做、可能影響哪些模組、哪些回歸測試一定要跑。

這些結論會寫進 YouTrack。理想上,一張票要詳細到讓 coding agent 不必重新理解整個產品歷史,但也不能把全專案所有資訊都複製進去。

後來我把 context 分成三層。長期穩定的東西,例如架構、模組邊界、API contract、安全規則、logging convention 和 ADR,留在 repo;當前任務的 root cause、scope、fix plan、acceptance criteria 和測試大綱,放在 ticket;實作完成後的 PR、測試結果、review concern 和未解問題,則留在 PR 和 ticket comment。

所以更準確地說,不是「所有 context 都在票上」,而是穩定規則留在 repo,任務決策留在 ticket,執行證據留在 PR 和 comment。

一個「重整頁面就被登出」的例子

有一張票的症狀是:使用者在頁面上按重新整理,就被強制登出。

第一眼看起來很像 auth token 過期。但 TPM 後來拆出了兩個彼此獨立的 root cause。

這就像天花板漏水。你以為只有樓上水管裂了,修完卻還是漏,因為排水孔同時也堵住。兩個問題各自獨立,但最後呈現的是同一個症狀。

第一個 root cause 在 API 層:token refresh 失敗時,不管原因是網路瞬斷、cookie 過期還是後端 500,前端一律當成「使用者未授權」,直接強制登出。

第二個 root cause 在頁面初始化:localStorage 裡明明已有可用 token,頁面載入時卻還是強制 refresh;只要這次 refresh 回傳 401,連原本可用的 token 也會一起被清掉。

兩個 root cause 都可能把使用者踢出去。只修其中一個,問題還是可能重現。

TPM 的工作不是在票上寫一句「修 auth refresh」,而是把兩條路徑拆開,說清楚各自在哪裡發生、觸發條件是什麼、哪些錯誤應該登出、哪些不應該,以及每一條路徑要怎麼驗證。Coding agent 不需要重新推導整個 auth flow 的歷史,但仍然要理解這次修改涉及的 contract。

Coding Agent 專心做個無情的寫code機器

…像極了愛情,不對,像極了我那加班寫Code的同事

我的 coding agent 會安裝 Superpowers。本文寫的是我當時使用的 v6 流程,大致是先讀 ticket 和 repo instructions,列 implementation plan,根據 acceptance criteria 寫測試,再實作、跑測試、開 PR,最後把 PR link、測試結果和 concern 寫回 ticket。

這裡的重點不是讓 coding agent 變笨,而是把它的能力集中在一個受控範圍內。每張票 scope 越清楚,它越不需要反覆載入無關的專案歷史,也比較不容易讓錯誤假設一路滾到後面的功能。

但有測試不代表一定正確。同一個 agent 可能先誤解 spec,再按照自己的誤解寫測試,最後寫出一份能通過這些測試的實作。整套流程看起來全綠,卻只是把同一個誤解從頭貫徹到底。

所以關鍵 acceptance case 最好在 coding 前就由 TPM 寫進票裡;高風險功能還需要 reviewer 補 adversarial cases。測試能防止實作偏離已知規則,不能保證規則本身沒有問題。

YouTrack 在這套流程裡,也不只是 issue tracker。每張票是一個相對 self-contained 的 context package:TPM 寫 root cause、fix plan 和驗收條件,coding agent 讀票後實作,再把 PR 和測試結果寫回去,reviewer 的 concern 則留在 PR 或同一張票裡。

Coding agent 做完一張票後,可以把 session context 丟掉。下一個 agent 不需要知道上一段對話說過什麼,只要讀正式紀錄。Context 不再依附在某個 agent 的短期記憶裡,而是變成可以跨 session、跨模型、跨工具使用的工程紀錄。

YouTrack 對小團隊有免費方案,雖然操作邏輯和 Jira 有些差異,但拿來做這種事滿合適的。

放心,工程師不會失業,只會繼續熬夜

因為 coding agent 寫了大部分 code,很容易讓人覺得工程師只剩下按按鈕和看 PR。但翻一下 ticket 就會發現,很多關鍵決定都是 LLM 提出方案,我否決,最後換成更簡單的路。

例如登入機制。LLM 一開始提議用 NextAuth。這其實是合理方案,功能完整,支援 OAuth、session management 和 CSRF protection。

但我否決了。有必要現在搞這塊嗎?

一個剛起步的 side project,當時不需要 GitHub 或 Google OAuth,也不需要完整的 session abstraction。我真正需要的只是 email + password,登入後拿 JWT,放進 httpOnly cookie。當然,我也得先忍住「我們弄個Sign in with Apple吧~」這種不切實際的衝動…

最後我們砍掉 NextAuth,改成一個 login page 直接呼叫 BFF 的 /auth/login。少了數百行程式碼、少一個 dependency,也少了一整套當下不需要的 abstraction。NextAuth 不是不好,只是它不值得出現在那個時間點的 scope 裡。

另一個例子是首頁搜尋建議。LLM 看完前端後提議,在搜尋框下面放幾個範例 chip,例如「機器學習」「親子景點」「RAG」。這也是很常見的產品設計。

但 LLM Wiki 不是通用搜尋引擎,每個專案的內容完全不同。在生活筆記裡放「機器學習」這個搜尋建議,這跟你到餐廳門口,門口服務生問你要休息還是住宿一樣令人尷尬。

這個功能顯然要從長計議,YouTrack上的票丟到之後的版本討論怎麼實作。未來比較合理的方向,是讓 worker 從專案實際內容裡抽出三到五個 suggested queries。不是「我們猜你想搜什麼」,而是「你的資料裡有什麼值得問」。

這類決定不是單純的技術能力問題。LLM 很擅長在給定需求後列出可行方案,但工程師真正難以取代的地方,是判斷這件事值不值得做、現在就需要嗎、這個 abstraction 是否超出產品規模、少做一點是不是反而更安全。

當我說 coding agent 不需要包辦所有決策,不是因為 AI 不重要,而是聰明不應該全部堆在執行端。怎麼做是一種能力,值不值得做則是另一種能力。

AI 是能力放大器,但不會替你長出經驗

用 prompt 做出一個能動的 demo,現在並不難。難的是 demo 之後。

LLM Wiki Cloud 的每個 concept 都需要 URL。最直覺的做法,是直接用檔名當 slug:

/concepts/台北適合工作的咖啡廳

看起來很乾淨,但檔案一改名,外部連結、書籤和引用就可能失效。

另一個極端是只用 ID:

/concepts/3f7a2b1c

它比較穩定,但完全不可讀。

最後採用的格式是:

/concepts/{id}-{slug}

穩定 ID 負責識別 concept,slug 只負責可讀性。Routing 時以 ID 為主,舊 slug 仍然可以被解析,再重新導向目前的 canonical URL。

真正讓 URL 穩定的,不是 ID 長得像 12-hex,而是持久化的 identity mapping 和 backward-compatible routing policy。只要 ID mapping 不變,檔案改名後,舊 URL 還是可以導向新 URL。

為了做出這個看起來很簡單的決定,我們開了一張 spike ticket,讓 agent 去讀 OLW 約 2476 行的 Python 原始碼,確認 slug 在哪個階段生成、是否唯一、是否穩定;接著討論 URL schema、ID 規則和 slug 更新策略,最後再實作 rebuild-index,維護 id_map.json,並處理 concurrent rebuild 和 GCS 更新。

AI 可以幫你分析原始碼,也可以幫你把 rebuild-index 寫出來,但它不一定會主動提醒你:如果產品活得夠久,使用者會收藏連結,檔案也會改名,所以 slug 不能同時拿來當 identity。這類判斷通常來自你以前真的被 broken URL 搞過,也可以讓你在扮演這個AI Team Leader甚至Manager角色時,自我檢視一下有沒有閃過「喔這個slug改id應該不難吧,叫工程師自己看看怎麼弄」這念頭!

AI 可以放大你的能力,但不會自動補上你沒有建立過的工程直覺。

模型個性不同,角色提示不同,脾氣也不同

在 PR review 階段,我通常會再找一個不同模型家族的 build agent 做獨立吃瓜群眾 review。後來我發現,最有資訊量的不是哪個 agent 宣稱自己很有信心,而是不同角色之間是否出現歧異。

如果 TPM 說 OK、coding agent 說 OK,但 reviewer 說有問題,通常表示 spec 或實作有模糊地帶,我就會介入確認。

Reviewer 有時也會提出最後證明不是問題的 concern。這沒有關係。只要意見被寫下來,能和 spec、code、測試結果互相比對,誤會通常可以釐清。這個機制不要求 reviewer 永遠正確,只要求它提供足夠獨立的觀點。

但反過來,TPM、coding agent 和 reviewer 全部說 OK,也不代表程式一定正確。三方可能共同依賴同一份錯誤 spec,或共享某個沒被發現的假設。

所以更準確的說法是:歧異是很強的風險 signal;一致只是基本門檻,不是正確性的證明。最後還是要搭配測試、模組 contract、實際系統行為,以及高風險區域的人工 review。

所以我在某次Code Review被我家的Hermes(背後是最近很夯的GPT5.6 sol)再一次漫長的PR來回跟對照Spec後兇了 — 被指著鼻子說:這個Spec開始就缺了條件,這樣PR來回Review只會浪費時間而已…噢,好喔

這套流程還是出過包

Side effect 還是發生過。

有一次 pipeline log 的修改,意外讓 pipeline 的數值壞掉。事後回頭看,不是 coding agent 沒照票做,而是 TPM 在分析階段漏掉了一條隱含資料流。

更麻煩的是,當時 Python pipeline 被迫承擔很多和 Go backend 重疊的邏輯,等於同一件事要在兩種語言裡各維護一套實作。同一種語言裡出現兩份差不多的邏輯已經夠糟,兩種語言各寫一份,世界末日大概也不過如此。

最後我決定把整條 pipeline 從 Python 重寫成 Go,讓共用邏輯回到同一個 codebase。

這次事故也提醒我,ticket 能隔離 task context,卻不會自動發現所有 global invariant。如果某條資料流、架構限制或 ownership 邊界沒有寫進 repo 裡的長期文件,TPM 和 coding agent 都可能在局部看起來合理的情況下做錯事。

所以這套流程不是保證不會出錯,而是讓錯誤發生後比較容易回答:當初知道什麼、漏掉了什麼、是 spec、global context、實作還是 review 出問題,以及下一次應該把規則補在哪一層。

目前也還有其他限制。TPM 和 Orchestrator 現在還是同一個 agent,票量少時問題不大,但如果未來要自己處理依賴、平行排程和升級判斷,可能就需要拆開。Ticket scope 也不可能永遠切得漂亮,有些任務本來就跨模組,硬切得太小,反而可能每張票都局部正確,合起來卻互相衝突。

換模型家族做 reviewer 可以降低錯誤相關性,但也不可能消除共因錯誤。高風險功能仍然需要外部行為測試、正式 contract,甚至人工 threat modeling。

回到核心問題:為什麼不直接把需求丟給 Coding Agent?

因為當一個 agent 同時負責 architect、PM、developer 和 reviewer 時,你很難判斷它做不出來,是 spec 有問題,還是執行能力不足;它選的方案,是符合產品需要,還是只是技術上做得到;測試通過,是需求真的被滿足,還是 agent 驗證了自己的誤解。

我現在的流程把責任拆開:產品和架構方向由我負責,問題分析和 task spec 由 TPM 負責,實作和基礎測試由 coding agent 負責,獨立觀點由 reviewer 提供;長期規則放在 repo 和 ADR,任務決策放在 YouTrack,執行證據則留在 PR 和 ticket comment。

Coding agent 不必每次重建完整產品脈絡,但仍然要理解這次修改涉及的 contract。TPM 不必親自完成 production code,但必須能定位問題並定義驗收條件。Reviewer 不必永遠正確,但要提供足夠獨立的觀點。

每個角色都可能犯錯。這套流程的目的不是假設某個 agent 完美,而是讓錯誤在跨越責任邊界時,有機會被看見。

一個人加上一群 AI,確實可以像一支小型工程團隊。但讓它成為團隊的,不是 agent 數量,也不是模型有多聰明,而是責任邊界、正式紀錄,以及最後仍然有人對產品和系統負責。

下一篇,我想再談談:每個角色到底需要多「聰明」,以及哪些角色其實不值得使用最強的模型。

Rayer,2026 年 7 月。LLM Wiki Cloud 開發筆記。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *