大家好!歡迎來到「Build on Google AI」工程挑戰的第 23 天。
(我知道各位在想什麼:「說好的 Action Confirmations 呢?你又跳票了!」請聽我解釋,這是架構師的深思熟慮。在把「人類 (Human)」放進工作流進行最終確認之前,我們必須先確保「機器與機器」之間的溝通是完美的。我們總不能讓人類按了「Approve」之後,才發現行銷 Agent 根本沒拿到 RD Agent 的最新分鏡表吧?)
在前幾天,我們成功打造了 PM、RD 與行銷這三位各司其職的超強 Agent。但真實企業中,跨部門溝通往往是最大的災難——「資訊落差 (Information Silos)」同樣會發生在 AI 系統裡。
如果只是用傳統的 output = agent_A(); agent_B(output) 來串接,這叫「腳本 (Script)」,不叫「系統 (System)」。今天,我們要利用 Google ADK 的 Multi-Agent Workflow (多智能體工作流) 與 State Management (狀態管理),為這三位虛擬員工建立一套堅不可摧的跨部門溝通協議!
第一步:定義「跨部門共用白板」 (Shared State)
在 ADK 的多智能體架構中,Agents 不應該直接互相傳遞字串,而是應該共同維護一個「全局狀態 (Global State)」。這就像是會議室裡的白板,PM 在上面寫需求,RD 在上面畫架構,行銷在上面補文案。
我們透過 Pydantic 定義這個 CampaignState,確保每個 Agent 讀寫資料時都具備強型別約束。
from pydantic import BaseModel
from typing import Optional, List
from models import VideoStoryboard, MarketingCampaign # 匯入我們前幾天寫好的 Schema
# 定義多智能體協作的「全局白板」
class CampaignState(BaseModel):
user_request: str = "" # 初始需求
refined_spec: Optional[str] = None # PM 萃取後的具體規格
storyboard: Optional[VideoStoryboard] = None # RD 產出的強型別分鏡表
marketing_assets: Optional[MarketingCampaign] = None # 行銷產出的貼文包
current_status: str = "INIT" # 追蹤目前進度
第二步:定義 Agents 的「職責與邊界」 (Node Operations)
接下來,我們初始化這三位 Agent。在 ADK 的 Workflow 中,我們不只給 Agent 指令,還要告訴它們「該從白板 (State) 上讀取什麼,並把產出寫回白板的哪個欄位」。
from google.adk import Agent
# 1. PM Agent:負責釐清模糊需求
pm_agent = Agent(
name="pm_agent",
model="gemini-2.5-flash",
instruction="你是專案經理。請將使用者的模糊需求,轉換為條理分明的影片規格書(包含目標受眾、核心痛點、影片長度)。",
# ADK 狀態路由設定:讀取 user_request,寫入 refined_spec
state_mapping={
"inputs": ["user_request"],
"outputs": ["refined_spec"]
}
)
# 2. RD (導演) Agent:負責將規格視覺化 (結合 Day 18 的自我修正機制)
rd_agent = Agent(
name="rd_agent",
model="gemini-2.5-pro",
instruction="你是專業導演。請根據 PM 的規格書,產出精準的分鏡腳本。",
response_schema=VideoStoryboard,
state_mapping={
"inputs": ["refined_spec"], # 只讀取 PM 的產出,實現上下文隔離
"outputs": ["storyboard"]
}
)
# 3. 行銷 Agent:負責包裝推廣
marketing_agent = Agent(
name="marketing_agent",
model="gemini-2.5-pro",
instruction="你是行銷總監。請根據分鏡表,為 FB、IG、Threads 產出帶有爆款鉤子的宣傳文案。",
response_schema=MarketingCampaign,
state_mapping={
"inputs": ["storyboard"], # 直接讀取 Pydantic 物件,無需重新解析 JSON
"outputs": ["marketing_assets"]
}
)
第三步:編織有向無環圖 (Workflow Graph)
這是 Multi-Agent 最迷人的地方。我們將這些 Agent 視為節點 (Nodes),並定義資料流動的方向 (Edges)。如果未來需要加入「法務 Agent」來審核行銷文案,我們只需要在圖中插入一個節點,完全不需要大幅改寫底層程式碼!
from google.adk import Workflow
# 建立自動化行銷產線工作流
campaign_workflow = Workflow(
name="Video_Marketing_Assembly_Line",
state_schema=CampaignState # 綁定我們的全局白板
)
# 定義 Agent 之間的交接順序 (Handoff Protocol)
campaign_workflow.add_sequence([
"START",
pm_agent,
rd_agent,
marketing_agent,
"END"
])
# 編譯工作流
app = campaign_workflow.compile()
系統運作:見證跨部門協作的奇蹟
現在,當我們啟動這個 Workflow,我們只需要在起點丟入一句話,剩下的就交給這三位頂尖員工。
if __name__ == "__main__":
# 啟動工作流,注入初始狀態
initial_state = CampaignState(
user_request="我們下個月要推廣 Google ADK,幫我做一支短片和社群貼文,主打解決 JSON 報錯。"
)
print("🚀 啟動跨部門 AI 工作流...\n")
# 執行 Workflow 並取得最終狀態
final_state = app.run(initial_state)
print("✅ 跨部門協作完成!最終產出成果:\n")
print(f"📋 【PM 規格書】\n{final_state.refined_spec}\n")
print(f"🎬 【RD 分鏡表】(總時長: {final_state.storyboard.total_duration_seconds}s)\n(省略詳細分鏡...)\n")
print(f"🔥 【行銷文案】\n包含 {len(final_state.marketing_assets.posts)} 篇跨平台貼文!")



小結
「架構的優雅,決定了系統的壽命。」
今天,我們拋棄了義大利麵條般的程式碼,利用 Google ADK 的 Workflow 與 State,建立了一個極度清晰、可擴展的多智能體跨部門協作產線。PM、RD、行銷 Agent 現在能透過強型別的白板完美傳遞資訊。