用六種職責角色檢查 AI Agent 的架構

延續角色構造型概念,本文將六種職責角色對照 AI agent 常見元件,檢查程式是否職責混雜。責任驅動設計強調物件應扮演服務提供者、資訊持有者等角色,此原則同樣適用於大語言模型代理架構。我們將記憶、工具、規劃、對話狀態與對外介面逐一映射到角色構造型,整理成一份審查清單,協助你在設計代理時分散控制權、避免元件承擔過多職責,並提供可直接執行的架構改善建議。

🔖標籤 #ddd #ddd思考 #ai

[!AI] 本文摘要
延續角色構造型概念,本文將六種職責角色對照 AI agent 常見元件,檢查程式是否職責混雜。責任驅動設計強調物件應扮演服務提供者、資訊持有者等角色,此原則同樣適用於大語言模型代理架構。我們將記憶、工具、規劃、對話狀態與對外介面逐一映射到角色構造型,整理成一份審查清單,協助你在設計代理時分散控制權、避免元件承擔過多職責,並提供可直接執行的架構改善建議。


AI agent 的架構通常由記憶、工具、規劃、對話狀態與對外介面等元件組成。Chris Moen 在 AI Agent Architecture Patterns 一文中指出,可靠的代理系統共享幾個關鍵建構區塊,包括控制迴圈、工具、記憶、協調器與安全機制。當代理的任務變得複雜,這些元件很容易在一個類別或一個模組裡全部糾纏在一起,導致職責混雜、難以測試與擴充。

Rebecca Wirfs-Brock 在 Wirfs-Brock Associates 網站上說明,責任驅動設計的核心是將物件視為角色與職責的集合,而非資料與演算法的組合。Wirfs-Brock Associates 將物件角色歸納為服務提供者、資訊持有者、結構建構者、協調者、控制者與對外介面者六種構造型。這套分類同樣適用於檢查 AI agent 的架構,協助我們釐清每個元件應承擔的職責邊界。

資訊持有者與記憶元件

資訊持有者的職責是保存資料並回答查詢,不主動發起業務流程。在 AI agent 中,記憶元件正好對應此角色。Chris Moen 在文中列出短期暫存區、工作集與長期記憶等項目,並建議盡量只取當前步驟所需的上下文,將暫時性推理與持久知識分開。

如果記憶元件除了保存狀態,還直接呼叫外部工具或決定下一步行動,就違反了資訊持有者的單一職責。正確的做法是讓記憶元件只負責讀寫與檢索,把何時檢索、檢索什麼的決策留給控制者或協調者。責任驅動設計透過隱藏實作細節提升封裝性;記憶元件的內部儲存結構不應暴露給其他模組,只透過明確的介面提供查詢與更新。

服務提供者與工具元件

服務提供者執行特定工作並回傳結果,不關心呼叫者的整體目標。工具元件正是此角色的具體實現。Chris Moen 在文中指出工具應保持最小化、具備明確型別與可稽核性,並要求結構化參數與嚴格的結構描述。

  • 工具職責邊界檢查:每個工具應只做一件事,名稱與描述必須清楚,且不應持有跨呼叫的業務狀態。

當工具開始自行判斷是否要繼續執行整體流程,或直接修改其他元件的內部狀態,它就越界成了控制者。這會讓代理行為難以預測,也增加測試難度。工具應如服務提供者般被動接受請求、執行並回傳,由協調者或控制者決定後續動作。

控制者與規劃元件

控制者負責決定流程的進行方向與步驟順序。在 AI agent 中,規劃與控制迴圈元件承擔此職責。Chris Moen 指出,控制迴圈應包含規劃、行動、觀察、反思與停止條件,並建議為規劃設定上限,包含最大步數、時間預算與單一工具配額。

規劃元件若同時負責執行工具呼叫、管理記憶與格式化對外回應,就是典型的職責混雜。控制者應專注於流程編排,把實際執行委派給服務提供者,把狀態存取委派給資訊持有者。責任驅動設計有助於分散控制權並分配系統行為,這對管理高功能性或分散式系統的複雜度特別有幫助。

協調者與對話狀態管理

協調者負責在不同物件之間轉發訊息與調度合作關係。對話狀態管理元件在代理中扮演此角色,它追蹤當前對話進度、管理輪次,並在多代理架構中處理代理之間的交接。Chris Moen 在多代理模式中提到,監督者負責將任務路由至具備受限工具的領域特定代理。

對話狀態管理不應直接執行領域邏輯或工具呼叫。它的職責是維護上下文一致性與流程順序。Wirfs-Brock Associates 指出,物件以明確定義的方式協作,彼此簽訂合約以實現應用程式的更大目標。對話狀態管理正是確保這些協作能按正確順序與條件發生的協調者。

對外介面者與外部介面

對外介面者負責系統與外部世界的邊界轉換。代理的對外介面包含使用者輸入解析、輸出格式化與外部 API 整合。Chris Moen 在安全清單中列出過濾輸入與輸出以降低提示注入與資料外洩風險,並對外部存取使用明確允許清單。這些職責應集中在對外介面者角色中,而非散落在控制迴圈或工具內部。

以下是示意,展示一個將對外介面職責獨立出來的最小代理邊界結構:

class AgentBoundary:
    def handle_input(self, raw_input):
        validated = self.filter_and_parse(raw_input)
        return validated

    def handle_output(self, agent_response):
        safe_output = self.sanitize_and_format(agent_response)
        return safe_output

重點

將六種角色構造型對照 AI agent 元件後,可以整理出一份審查清單,協助你在設計與實作時檢查職責分配是否合理。這份清單奠基於責任驅動設計與代理架構的實務建議。

  1. 記憶元件應僅扮演資訊持有者,負責讀寫與檢索,不應決定流程或執行工具。
  2. 工具元件應僅扮演服務提供者,被動執行單一任務並回傳結果,不持有跨呼叫業務狀態。
  3. 規劃與控制迴圈應扮演控制者,專注於步驟編排與停止條件,將執行與狀態管理委派出去。
  4. 對話狀態管理應扮演協調者,維護上下文與交接順序,不直接執行領域邏輯。
  5. 對外介面應扮演對外介面者,集中處理輸入過濾、輸出格式化與安全邊界。

你可以拿這份清單逐一檢視現有的代理程式碼。若發現某個類別同時承擔兩種以上角色,就將職責拆分到獨立模組。這麼做能提升封裝性,也讓代理行為更容易測試、替換與維護。