在 昨天 (Day 11),我們看到了 Supervisor(統籌型) 的 Multi-Agent 模式:
Planner、Foodie、Transport 各自分工,最後由 Coordinator 統籌整合。
這種模式清楚高效,但也偏向「一言堂」:所有決定由統籌拍板。
然而在真實世界裡,許多情境需要 討論與辯證:
這就是 Multi-Agent Conversation 的另一種典型做法 —— Group Chat(討論型)模式。
昨天的 Supervisor 模式,Coordinator 是「主管」,大家分工完成後再交給他統籌拍板,結果乾淨俐落,但過程偏單向。
今天的 Group Chat 模式,則是所有角色在同一個對話空間裡平等發言,透過互相質疑、補充與修正,在對話中逐步形成共識。
共享對話歷史
輪流發言
逐步收斂
圖:Group Chat 模式。所有角色(Planner、Foodie、Transport、Reviewer)都在同一個對話空間中平等發言,經過多回合互動,逐步收斂成共識行程。
模式 | 角色定位 | 溝通方式 | 決策產生 |
---|---|---|---|
Supervisor(統籌型) | 有一個主管(Coordinator)統籌拍板 | 各角色先完成分工,再交給主管整合 | 自上而下,由主管拍板 |
Group Chat(討論型) | 所有角色平等參與 | 在同一對話空間中輪流發言、互相辯證 | 自下而上,透過討論逐步收斂共識 |
假設我們還在規劃 維也納二日遊:
這樣一來,大家在 對話中直接互動、逐步調整,最後得到一個更合理的行程。
沒有誰是最終「主管」,而是靠來回交流自然收斂。
接著我們用程式碼來模擬一個簡單的 Naive Group Chat,讓大家看清楚:多代理如何在「多人對話」中互動,逐步收斂。
(這裡 LLM 模型使用 gemini-2.5-flash-lite
是因為 Group Chat 有多輪對話會需要比較多用量,lite 版本免費額度較多,比較不會對話到一半超額而造成失敗)
在這個 Demo 中有四個角色:
import google.generativeai as genai
import os
# ===== 0) 初始化 =====
os.environ["GEMINI_API_KEY"] = "YOUR_API_KEY"
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
LLM = genai.GenerativeModel("gemini-2.5-flash-lite") # Group Chat 有多輪對話需要比較多用量,故使用 lite 版本
# ===== 1) Memory(使用者偏好) =====
MEMORY = {
"diet": "不吃牛肉",
"pref": "維也納豬排"
}
# ===== 2) Agent 基底類別 =====
class BaseAgent:
def __init__(self, name, role_description):
self.name = name
self.role_description = role_description
def act(self, history):
prompt = f"{self.role_description}\n目前討論紀錄:{history}\n請以 {self.name} 身份回應,簡短發言。"
resp = LLM.generate_content(prompt)
return resp.text.strip()
# ===== 3) 四個角色 =====
class PlannerAgent(BaseAgent):
def __init__(self):
role_description = """你是旅行規劃師,提出景點方案。
輸出 JSON 格式,
範例:
{
"Day1": {"am": "美泉宮", "pm": "聖史蒂芬大教堂"},
"Day2": {"am": "奧地利國家圖書館", "pm": "維也納歌劇院"}
}
"""
super().__init__("Planner", role_description)
class FoodieAgent(BaseAgent):
def __init__(self):
role_description = f"""你是美食顧問,根據偏好({MEMORY['diet']}、偏好 {MEMORY['pref']})建議餐廳。
輸出 JSON 格式,
範例:{{"Day1": "Figlmüller(維也納豬排)", "Day2": "Gasthaus Pöschl"}}
"""
super().__init__("Foodie", role_description)
class TransportAgent(BaseAgent):
def __init__(self):
role_description = """你是交通顧問,自行評估交通方式與所需時間並檢查行程是否交通合理,有無超時風險。
輸出 JSON 格式,
範例:
{
"Day1": {"am_to_lunch": 25, "lunch_to_pm": 30},
"Day2": {"am_to_lunch": 22, "lunch_to_pm": 35}
}
"""
super().__init__("Transport", role_description)
class ReviewerAgent(BaseAgent):
def __init__(self):
role_description = """你是檢視者 (Reviewer),負責觀察 Planner、Foodie、Transport 的建議。
你的任務:
1) 如果有衝突(例如交通超時或餐廳不合適),請條列出來,讓下一回合修正。
2) 如果沒有衝突,嘗試整合成完整行程 JSON 與文字版方案。
注意:你不是主管,只是多人對話的一份子,主要任務是檢查和整理。
3) JSON 格式如下:
{
"Day1": {
"am": "美泉宮及其花園 (Schloss Schönbrunn)",
"lunch": "Figlmüller(維也納豬排)",
"pm": "霍夫堡宮 (Hofburg Palace)",
"transport": {"am_to_lunch": 39, "lunch_to_pm": 37}
},
"Day2": {
"am": "聖史蒂芬大教堂 (Stephansdom)",
"lunch": "Gasthaus Pöschl",
"pm": "維也納藝術史博物館 (Kunsthistorisches Museum Wien)",
"transport": {"am_to_lunch": 36, "lunch_to_pm": 38}
}
}
"""
super().__init__("Reviewer", role_description)
# ===== 4) Group Chat 模擬 =====
class GroupChat:
def __init__(self, agents, rounds=2):
self.agents = agents
self.rounds = rounds
def run(self):
history = "我們要規劃維也納二日行程,09:00 出發,18:00 前結束。\n"
for r in range(self.rounds):
for agent in self.agents:
reply = agent.act(history)
history += f"{agent.name}: {reply}\n---\n"
return history
# ===== 5) 主程式 =====
if __name__ == "__main__":
agents = [PlannerAgent(), FoodieAgent(), TransportAgent(), ReviewerAgent()]
chat = GroupChat(agents, rounds=2)
history = chat.run()
print("=== Group Chat Demo ===")
print(history)
圖:在多人對話初期,各角色分別提出建議:Planner 給行程、Foodie 推薦餐廳、Transport 檢查交通。這階段像「初稿」,之後會逐步收斂。
圖:Reviewer 審視所有角色的輸出後,提出潛在衝突(例如交通時間可能不足、餐廳距離過遠),並提供修正建議。這角色雖然平等,但在多人對話裡扮演「檢查與整理」的重要作用。
圖:Planner 根據 Reviewer 的建議,對 Day 2 的景點安排做出微調,並更新行程 JSON。這裡可以看到 Planner 不是單向輸出,而是會被多人對話中的回饋影響。
圖:Transport 參考 Planner 與 Foodie 的更新方案,重新計算各段交通時間,並回報 JSON 結果。顯示出多人對話中角色會隨討論進展不斷修正自己的專業建議。
圖:Reviewer 檢視 Planner、Foodie、Transport 的最新建議後,確認已無衝突,並整理出最終行程方案。這顯示出 Group Chat 模式能透過多輪互動,自然收斂成完整結果。
這個 Demo 呈現了 Group Chat 模式的典型過程:
和昨天的 Supervisor 模式 不同,這裡沒有單一主管拍板,而是讓角色在多人對話中 平等交流 → 逐步修正 → 收斂共識。
這正是 Group Chat 模式的價值:透過討論與互動,結果會更貼近真實世界的「會議決策」過程。
和昨天的 Supervisor 型 相比,Group Chat(討論型)模式 更接近真實人類會議:
這是 Multi-Agent 常見的互動模式,特別適合:
Group Chat 讓 Multi-Agent 不只是「分工合作」,更能「思想碰撞」,在對話中長出新的答案。
正如維也納的沙龍文化與音樂廳氛圍,許多靈感與旋律,都是在 交流與辯證 中誕生的。
圖:維也納工業大學(Technische Hochschule Wien)。 古典立面與雕像象徵科學與工藝的積累,而屋頂上的群像雕塑則呈現多個角色共同協作的場景。正如 Group Chat 模式,每一個角色都平等參與討論,透過交流與辯證逐步收斂成共識。沒有唯一的權威,而是集體智慧的展現,這也是學術與創新的真正精神。(攝影:作者自攝)