iT邦幫忙

2026 iThome 鐵人賽

DAY 24
0
Build on Google AI

30 天用 Google ADK 打造你的「全自動 AI 虛擬團隊」系列 第 24 篇

Day 24 | 衝突解決:設計 Agent 談判機制與防止無窮迴圈

  • 分享至 

  • xImage
  •  

大家好!歡迎來到「Build on Google AI」工程挑戰的第 24 天。

(我知道、我知道,我昨天對天發誓今天要講 Action Confirmations。但是各位工程師,突發狀況來了!我們不得不再次插隊!)

為什麼?因為當我們昨天建立好跨部門產線後,法務部主管立刻要求加入一位 「法務 (Legal) Agent」,專門審核行銷 Agent 寫出來的爆款文案。

結果昨晚的系統測試發生了慘劇:

行銷 Agent 寫了:「保證 100% 解決你所有的 JSON 報錯!」

法務 Agent 審查後退件:「違反廣告法規,不能使用『保證 100%』等絕對字眼。」

行銷 Agent 重寫:「絕對讓你永遠不再看到 JSON 報錯!」

法務 Agent 再退件:「『絕對永遠』依然是誇大不實。」

兩個 Agent 就這樣在雲端吵了一個晚上,陷入了無窮迴圈 (Infinite Loop),直到把 Google Cloud 的 API 配額全部燒光為止。

在 Multi-Agent 系統中,Agent 之間的「談判與修改迴圈」是非常強大的功能,但如果沒有設定邊界,它就是一顆定時炸彈。今天,我們要用 Google ADK 的 條件路由 (Conditional Edges) 來設計一套防護機制!

第一步:升級 State,加入「談判計數器」
為了解決這個問題,我們必須在昨天定義的「全局白板 (Shared State)」中加入兩個關鍵欄位:is_approved (是否核准) 以及最重要的 revision_count (修改次數計數器)。

from pydantic import BaseModel
from typing import Optional

class CampaignState(BaseModel):
    user_request: str = ""
    marketing_copy: str = ""
    review_feedback: str = ""
    
    # 防止無窮迴圈的關鍵欄位
    is_approved: bool = False
    revision_count: int = 0  # 記錄被法務退件的次數

第二步:定義會「吵架」的兩個 Agent
我們在 ADK 中設定行銷與法務兩個 Agent。特別注意,法務 Agent 的職責不僅是檢查,還要負責更新 is_approved 的狀態。

from google.adk import Agent

# 1. 行銷 Agent (負責寫作與修改)
marketing_agent = Agent(
    name="marketing_agent",
    model="gemini-2.5-pro",
    instruction=(
        "你是行銷總監。請根據需求撰寫文案。"
        "如果收到 review_feedback (審查意見),請務必根據意見修正文案,切勿重蹈覆轍!"
    )
)

# 2. 法務審核 Agent (負責把關)
legal_agent = Agent(
    name="legal_agent",
    model="gemini-2.5-pro",
    instruction=(
        "你是嚴格的法務審核員。請檢查文案是否誇大不實。"
        "如果合格,請將 is_approved 設為 true;如果不合格,請設為 false,並在 review_feedback 中寫明具體違反原因。"
    )
)

第三步:實作「條件路由」與「防迴圈機制」
在 Google ADK 的圖結構 (Graph) 中,我們可以撰寫一個 Python 函式來決定下一步該往哪裡走。這就是所謂的 條件路由 (Conditional Routing)。

如果法務說 OK,就結束;如果法務退件,我們不是無腦退回給行銷,而是先檢查計數器!

# 3. 條件路由函式 (Router)
def review_router(state: CampaignState) -> str:
    """決定工作流下一步去哪裡的「交通警察」"""
    
    if state.is_approved:
        print("✅ 法務審核通過!流程準備結束。")
        return "END"
        
    if state.revision_count >= 3:
        # 【防迴圈機制】談判破局,強制升級給人類處理!
        print(f"🚨 警告:行銷與法務已來回修改 {state.revision_count} 次,啟動升級機制 (Escalation)!")
        return "human_intervention" 
        
    # 如果還沒超過上限,就退回給行銷 Agent,並增加修改次數
    print(f"⚠️ 法務退件!退回重寫。目前修改次數: {state.revision_count + 1}")
    state.revision_count += 1
    return "marketing_agent"

第四步:組裝會談判的工作流 (Cyclic Graph)
現在,我們把這些節點用 ADK 的 Workflow 連接起來。這不再是一條直線的流水線,而是一個具備「迴圈與例外逃脫能力」的高級圖結構。

from google.adk import Workflow

campaign_workflow = Workflow(
    name="Conflict_Resolution_Workflow",
    state_schema=CampaignState
)

# 定義基本節點
campaign_workflow.add_node(marketing_agent)
campaign_workflow.add_node(legal_agent)

# 定義起點
campaign_workflow.set_entry_point("marketing_agent")

# 定義行銷寫完後,交給法務
campaign_workflow.add_edge("marketing_agent", "legal_agent")

# 【核心魔法】定義法務審核後的動態條件路由
# 它會根據 review_router 函式的回傳值,決定走向 END、重回行銷、或是進入 human_intervention
campaign_workflow.add_conditional_edges(
    source="legal_agent",
    routing_function=review_router,
    path_map={
        "END": "END",
        "marketing_agent": "marketing_agent",
        "human_intervention": "human_intervention_node" # 升級給人類
    }
)

https://ithelp.ithome.com.tw/upload/images/20260925/20121643fx8evMHReK.png

小結
「沒有邊界的自動化,就是一場災難。」

今天,我們透過 ADK 的 State 管理與 Conditional Edges,成功解決了 Multi-Agent 系統中最可怕的無窮迴圈問題。Agent 之間現在可以為了品質進行談判,但當他們「吵不出結果」時,系統懂得踩下煞車,將問題升級 (Escalate) 給人類。


上一篇
Day 23 | ADK Multi-Agent:設定 PM、RD、行銷的跨部門溝通協議
下一篇
Day 25 | 深度除錯:透過 ADK Web UI 追蹤思考軌跡 (Trace)
系列文
30 天用 Google ADK 打造你的「全自動 AI 虛擬團隊」 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言