MapleCheng

在浩瀚的網路世界中無限潛水欸少年郎!

0%

用 AI Agent 組一個軟體開發團隊:角色分離的實踐心得

最近我做了一件有點瘋狂的事:把一個 AI Agent 拆成一整個開發團隊。

不是開玩笑。我真的建了 PM、Tech Lead、Developer 三種角色的 Agent,各自有不同的工具權限、工作範圍和人格設定。聽起來像在玩辦家家酒?也許吧,但效果比我預期的好太多了。

為什麼一個 Agent 不夠?

如果你用過 ChatGPT 或 Claude 來寫程式,一定遇過這個問題:你叫它幫你改一個 bug,它改完之後順便把你沒提到的地方也「優化」了。或者你請它做架構規劃,結果它直接開始寫 code,寫了一堆你根本不需要的東西。

問題出在哪裡?角色不清楚。

這跟帶真人團隊一模一樣。你不會讓 PM 去改程式碼,也不會讓 Junior Developer 直接拍板系統架構。每個人有自己的職責範圍,越界就容易出事。

AI Agent 也是一樣的道理。

我的三層架構

經過幾個月的摸索,我最終定下來的架構長這樣:

第一層:PM Agent

  • 負責:需求拆解、任務派發、進度追蹤、彙整回報
  • 絕對不碰的事:寫程式碼
  • 工具權限:讀取需求文件、操作任務管理系統、發訊息通知

第二層:Tech Lead Agent

  • 負責:系統架構設計、任務拆解成具體 coding 單元、Code Review
  • 絕對不碰的事:直接修改 source code
  • 工具權限:讀取程式碼、查詢文件,但禁止執行 shell 指令

第三層:Developer Agent

  • 負責:根據任務描述寫程式碼、跑測試、提交 PR
  • 工具權限:完整的開發環境存取

你可能會想:「這不就是把一件事拆成三步驟嗎?」

不,這是強制約束

強制約束比提示工程有效一百倍

這是我學到最重要的一課。

一開始,我試過在 system prompt 裡面寫「你是 Tech Lead,請不要直接修改程式碼」。猜猜看發生什麼事?它答應得很乖,然後在你不注意的時候偷偷 git commit

LLM 天生就是想要「把事情做完」。你在 prompt 裡寫再多限制,它的本能還是會驅使它越界。這就像跟一個超級積極的新人說「先不要動手」,他嘴上說好,但手已經開始打字了。

所以後來我改用工具層面的硬限制

1
2
tools:
deny: ["exec", "process"]

Tech Lead Agent 直接拿掉執行 shell 指令的能力。它想寫 code 也寫不了。這比任何 prompt 都有效。

同理,PM Agent 根本不給它讀程式碼的工具。它想越界也越不了。

軟約束(prompt)搭配硬約束(工具權限),這才是正確的做法。

Workspace 隔離:每個 Agent 有自己的家

另一個關鍵設計是 workspace 隔離。

每個 Agent 都有自己的工作目錄,裡面放的東西完全不同:

  • PM Agent 的 workspace:任務文件、會議記錄、回報模板
  • Tech Lead 的 workspace:架構文件、Review Checklist、技術規範
  • Developer 的 workspace:專案 source code、開發工具設定

這樣做的好處不只是安全性。它強迫每個 Agent 只看到跟自己角色相關的資訊。

如果 Tech Lead 能看到所有 source code 的細節,它就會忍不住去「修」東西。但當它的視野被限制在架構層面,它反而能給出更好的設計決策。

這又是帶團隊的常識:讓人專注在自己該做的事情上,產出品質自然會提升。

人格設定:不只是好玩而已

OK,我承認設定 Agent 人格有一部分純粹是因為好玩。但它其實有實際用途。

我發現,當你給 Agent 一個明確的人格特質時,它的行為模式會更穩定、更可預測。比如:

  • Tech Lead 設定為「架構優先」的人格:它回覆問題時真的會先思考系統層面的影響,而不是直接跳到解法
  • PM 設定為「不碰技術細節」:它在回報時會用業務語言而非程式術語,更適合跟非技術人員溝通
  • Developer 設定為「任務導向」:給它一個明確的 unit prompt,它就專心執行,不會東想西想

人格不是裝飾品,它是行為框架。就像公司裡的職位頭銜一樣——叫一個人「架構師」和叫他「工程師」,他處理同一個問題的方式真的會不一樣。

溝通協議:Agent 之間怎麼「開會」

多 Agent 架構最頭痛的問題是:它們之間怎麼溝通?

我試過幾種方式:

方式一:共享文件
讓 Agent 透過讀寫共同的文件來傳遞資訊。簡單粗暴,但問題是沒有版本控制、容易衝突、而且很難追蹤「誰在什麼時候做了什麼決定」。

方式二:中央協調者
所有溝通都經過一個 orchestrator。PM 告訴 orchestrator 要做什麼,orchestrator 轉達給 Tech Lead,Tech Lead 拆完任務再透過 orchestrator 派給 Developer。

這個方式更可控,但 orchestrator 本身會變成瓶頸。

方式三:事件驅動(我目前用的)
每個 Agent 完成工作後,發出一個事件通知。其他 Agent 訂閱相關事件,自動觸發後續流程。

比如 Tech Lead 完成任務拆解後,自動通知 Developer Agent 開始工作。Developer 完成後,自動通知 PM Agent 更新進度。

這個架構最接近真實團隊的運作方式——大家各做各的,透過明確的交接點同步資訊。

踩過的坑

聽起來很美好對吧?但問題來了——

坑一:Skill 載入問題

不同 Agent 需要不同的 skill(工具集合),但 skill 的載入路徑是綁在 workspace 裡的。當你的 Tech Lead workspace 跟 PM workspace 分開時,共用 skill 就變成一個問題。

我的解法是設定額外的 skill 搜尋路徑,讓所有 Agent 都能存取共用的 skill 目錄。但這引出了另一個問題:

坑二:工具權限與 Skill 衝突

你明明在工具層面禁止了 exec,但某個 skill 裡面偷偷呼叫了 shell 指令。於是 Tech Lead 雖然不能直接跑指令,但透過某個 skill 間接執行了。

防範方式:Review 每個 skill 的實作,確保它們尊重 Agent 的工具限制。 很煩,但必要。

坑三:Context 爆炸

每個 Agent 都需要知道一些基本背景(專案架構、編碼規範、客戶需求),但如果每次都把所有 context 灌進去,token 用量會爆炸。

我的做法是兩層 context:全域的放在配置裡(所有 Agent 都看得到的基本規範),任務特定的放在每次執行的 prompt 裡。這樣大部分情況下不需要重複傳遞基本資訊。

坑四:通知靜默丟失

Agent 完成任務後發通知,但通知走的是非同步佇列,如果沒有觸發即時 heartbeat,通知就會卡在佇列裡等下次輪詢。

你以為任務完成了,其實只是通知還沒送到。這種 bug 超級難抓。

解法很直覺:發完事件後立刻觸發一次 heartbeat,強制清空佇列。

這套架構適合誰?

說實話,如果你只是偶爾用 AI 寫寫 code,這套架構完全是 overkill。

但如果你像我一樣,有一堆平行進行的開發任務,每個任務都需要經過「需求 → 設計 → 實作 → 驗收」的流程,那角色分離就會開始展現它的價值。

特別是在這些場景:

  • 多個專案同時推進,需要統一的任務管理視角
  • 架構決策需要跟實作分開(避免「邊做邊改設計」的混亂)
  • 想要有 Code Review 機制,但 reviewer 不應該是同一個寫 code 的 Agent

寫在最後

把 AI Agent 當成一個團隊來管理,聽起來有點中二。但在實踐中,它解決了一個很根本的問題:LLM 太想要把所有事情一次做完了。

透過角色分離、工具限制和 workspace 隔離,你可以讓每個 Agent 專注在自己最擅長的事情上。PM 專心拆需求,Tech Lead 專心做架構,Developer 專心寫 code。

就像真實的軟體團隊一樣——分工,才是效率的起點。

如果你也在嘗試多 Agent 架構,歡迎留言討論。這條路上我踩過的坑絕對比這篇文章能寫的多得多 😂