不是關於速度。而是關於讓多個具有不同觀點的 Agent 針對一個決策進行辯論,並得出比任何單一 Agent 都更好的結論。附帶完整的編排器、專家和合併程式碼。
當你讓一個模型評估一個決策時,它只會給出一個觀點,通常是平均且謹慎的。它傾向於同意、修飾、尋找平衡。這就是問題所在:一個重要的決策不能由單一平均觀點來評估,必須從不同角度進行攻擊。
一個 Agent 群體從結構上解決了這個問題。你建立幾個專家,每個都有固定的角色和偏見:一個只考慮金錢,另一個只考慮技術風險,第三個只考慮使用者。他們獨立分析同一個決策,得出不同的結論,然後你強制對這些結論進行協調。這裡的價值不是速度,而是異議被內建在結構中。單一 Agent 傾向於與自己進行群體思考,而一個角色群體則不會。
本文展示如何用程式碼建立這樣的群體。我們涵蓋三個部分:分配角色的編排器、獨立分析的專家,以及將它們協調成一個結論的合併者。
架構:編排器、專家、合併者
一個用於分析的群體由三個元件組成。
編排器接收任務,並決定需要哪些專家角色。對於評估產品上市,這些角色可能包括投資者、工程師、產品專家、安全人員。編排器本身不進行分析,它分配角色。
專家並行且獨立地工作。每個專家都看到同一個決策,但透過自己的視角。關鍵是,他們看不到彼此的結論,否則就會產生順從。獨立性才能產生不同的觀點。
合併者收集專家的結論並進行協調:他們在哪裡達成一致,在哪裡矛盾,最終在所有角度下的判決是什麼。這不是平均,而是將異議作為訊號的綜合分析。

第一步:基本客戶端
從一個簡單的模型客戶端開始。我使用 OpenAI 相容的訊息格式,它適用於大多數供應商和本地 Ollama。
1import requests2import json3from concurrent.futures import ThreadPoolExecutor45API = "http://localhost:11434/api/chat" # Ollama, or a provider endpoint6MODEL = "qwen2.5:32b"78def ask(system, user, temperature=0.7):9 resp = requests.post(API, json={10 "model": MODEL,11 "messages": [12 {"role": "system", "content": system},13 {"role": "user", "content": user},14 ],15 "temperature": temperature,16 "stream": False,17 }, timeout=120)18 resp.raise_for_status()19 return resp.json()["message"]["content"]
第二步:編排器分配角色
編排器接收任務,並決定需要哪些專家。不要預先硬編碼角色,讓模型為特定任務選擇它們,這使群體具有通用性。要求用嚴格的 JSON 來解析。
1ORCHESTRATOR_SYSTEM = """你是分析群體的協調者。2針對該任務,定義 3-5 個專家角色,這些角色將對該決策提供最大程度的不同3且相互衝突的觀點。這些角色必須在利益上衝突,而非互補。45對每個角色給出:名稱、關注點(它專注於什麼)、偏見(它傾向於什麼,6以及它往往會高估什麼)。78僅回覆一個 JSON 陣列,不要有任何解釋:9[{"name": "...", "focus": "...", "bias": "..."}, ...]10"""1112def plan_roles(task):13 raw = ask(ORCHESTRATOR_SYSTEM, f"要分析的任務:\n{task}",14 temperature=0.9) # 較高的溫度以增加角色多樣性15 # 切出 JSON,以防模型在周圍添加了文字16 start, end = raw.find("["), raw.rfind("]") + 117 return json.loads(raw[start:end])
我們故意在此處保持較高的溫度:我們想要多樣化的、非顯而易見的角色。提示中「角色必須衝突」的要求是關鍵,沒有它,模型會給出三個幾乎相同的角色,而整個群體的意義就喪失了。
第三步:專家並行獨立分析
每個專家都會獲得自己的角色和相同的決策。關鍵是:他們並行運行,且看不到彼此的結論。這裡的並行性不僅是為了速度,更是為了保證獨立性,一個專家在物理上無法調整自己的意見去迎合他人。
1EXPERT_SYSTEM = """你是一名專家,角色為:{name}。2你的關注點:{focus}。3你的偏見:{bias}。不要對抗它,它對分析是有價值的。45嚴格從你的立場分析決策。不要力求平衡,不要試圖考慮其他觀點,其他專家會做那些事。6你的工作是將你的角度推到極限。78給出:9- 從你的立場得出的判決(贊成 / 反對 / 有條件)10- 2-3 個從你的角度出發的主要論點11- 1 個從你的立場最容易看到、而其他人會忽略的風險12簡短精煉,不要廢話。"""1314def run_expert(role, task):15 system = EXPERT_SYSTEM.format(**role)16 opinion = ask(system, f"要分析的決策:\n{task}", temperature=0.7)17 return {"role": role["name"], "opinion": opinion}1819def run_swarm(roles, task):20 # 並行啟動:獨立性加上速度21 with ThreadPoolExecutor(max_workers=len(roles)) as pool:22 futures = [pool.submit(run_expert, role, task) for role in roles]23 return [f.result() for f in futures]
注意專家提示:我們明確禁止它保持平衡。這違反直覺,但這正是全部重點。如果每個專家都試圖考慮所有方面,你會得到五個相同的謹慎意見。透過強迫每個專家將自己的角度推到極限,你得到一個真正的光譜,然後由合併者進行協調。
第四步:合併者協調結論
現在我們有幾個尖銳、片面的意見。合併者將它們收集成一個判決,但不是透過平均。它尋找專家們達成一致的地方(一個強訊號),他們矛盾的地方(一個需要決策的風險區域),以及什麼比什麼更重要。
1MERGE_SYSTEM = """你是分析群體的綜合者。你獲得了幾個具有不同偏見的專家2對同一個決策的意見。34你的工作不是平均它們。你的工作是:51. 一致點:專家們儘管立場不同卻達成一致的地方。6 這是最可靠的訊號,請強調它。72. 衝突點:專家們直接矛盾的地方。不要修飾它,明確指出衝突,8 並說明每一方代價是什麼。93. 盲點:只有一個專家提到的風險,但很重要。104. 最終判決:綜合所有資訊後的結論:贊成 / 反對 / 有條件,以及在什麼條件下會改變。1112寫得緊湊。將分歧視為資訊,不要隱藏它。"""1314def merge_opinions(task, opinions):15 block = "\n\n".join(16 f"### 專家:{o['role']}\n{o['opinion']}" for o in opinions17 )18 user = f"決策:\n{task}\n\n專家意見:\n{block}"19 return ask(MERGE_SYSTEM, user, temperature=0.4) # 較低溫度以獲得冷靜的綜合
我們在合併時降低溫度:如果專家應該多樣化(高溫),那麼綜合者應該冷靜且一致(低溫)。這裡的關鍵指示是「不要平均,將分歧視為資訊」。一個普通的合併者會將一切變成模糊的「一方面……另一方面」。一個好的合併者會清楚說明:這裡每個人都同意,而這裡有個衝突,代價是這麼多。
第 4.5 步:針對虛假共識的魔鬼代言人
有一個潛在的危險:有時專家們達成一致,不是因為決策是好的,而是因為每個人都因慣性而看向同一個方向。這是虛假共識,它比公開衝突更危險,因為它看起來像信心。
為此,我們添加一個特殊的 Agent,即魔鬼代言人。它的唯一工作就是攻擊共識。它看到所有專家的意見,並有義務找出他們可能同時出錯的原因。如果群體一致投票「贊成」,代言人會尋找一個可能是災難的場景。
1DEVIL_SYSTEM = """你是分析群體中的魔鬼代言人。你獲得了專家們的意見。2你的唯一工作:攻擊他們的共識。34如果專家們在某件事上趨於一致,找出為什麼他們可能同時全部出錯。5尋找一個共享的盲點:一個每個人都未經檢查就接受的假設,6一個因為不方便而沒有人考慮的場景。78不要客氣。你的價值在於你說了群體不想聽的話。給出:9- 專家們共享的哪個假設最危險10- 一個場景,在該場景中,群體的一致意見最終被證明是致命錯誤的11- 一個群體小心迴避的問題12如果沒有共識,專家們確實意見分歧,則直接說出來,並指出最尖銳的未解決衝突。"""1314def run_devil(task, opinions):15 block = "\n\n".join(16 f"### {o['role']}\n{o['opinion']}" for o in opinions17 )18 user = f"決策:\n{task}\n\n群體意見:\n{block}"19 return ask(DEVIL_SYSTEM, user, temperature=0.8)
代言人在專家之後、合併之前運行,它的攻擊與意見一起進入綜合分析。重點是,即使是一個全體一致的群體,也至少有一個 Agent 有義務尋找裂縫。這很便宜(一次呼叫),並從結構上打破了群體思維:共識現在必須經受攻擊,而不僅僅是發生。
第 4.6 步:辯論回合以強化衝突
第一輪專家分析是獨立的,這對多樣性來說是正確的。但在收集意見後,你可以進行一輪辯論:向每個專家展示其他專家意見的摘要,並讓它提出異議。這會強化衝突,弱論點會消失,強論點會鞏固。
1DEBATE_SYSTEM = """你是第二輪分析中的專家 {name}。2你原本的立場:3{own_opinion}45現在你看到了其他專家的意見。不要屈服於壓力,但也不要忽略強有力的論點。給出:6- 如果他人的論點確實擊中了你的立場,誠實地承認7- 你堅持立場的地方,以及為什麼你認為他們的異議是薄弱的8- 辯論後你是否改變了你的判決,如果是,如何改變的9簡短。這不是重複第一輪意見,而是對對手的反應。"""1011def debate_round(roles, task, opinions):12 others_map = {}13 for o in opinions:14 others = "\n\n".join(15 f"### {x['role']}\n{x['opinion']}" for x in opinions if x is not o16 )17 others_map[o["role"]] = others1819 def rebut(o):20 system = DEBATE_SYSTEM.format(name=o["role"], own_opinion=o["opinion"])21 user = (f"決策:\n{task}\n\n"22 f"對手的意見:\n{others_map[o['role']]}")23 return {"role": o["role"], "opinion": ask(system, user, temperature=0.6)}2425 with ThreadPoolExecutor(max_workers=len(opinions)) as pool:26 return list(pool.map(rebut, opinions))
辯論回合也是並行的:每個專家同時對所有其他專家做出反應,再次沒有即時順從。辯論後,意見通常會更尖銳:你可以看到哪些立場在壓力下堅持下來,哪些崩潰了。正是這些經過錘煉的意見進入最終的合併。
第五步:整合所有部分
1def analyze(task, debate=True):2 print("編排器正在選擇角色...")3 roles = plan_roles(task)4 for r in roles:5 print(f" - {r['name']}: {r['focus']}")67 print(f"\n啟動 {len(roles)} 個專家並行執行...")8 opinions = run_swarm(roles, task)9 for o in opinions:10 print(f"\n[{o['role']}]\n{o['opinion']}")1112 # 可選的辯論回合:專家們互相反駁13 if debate:14 print("\n辯論回合,專家們互相反駁...")15 opinions = debate_round(roles, task, opinions)1617 # 魔鬼代言人攻擊群體的共識18 print("\n魔鬼代言人正在尋找共識中的裂縫...")19 devil = run_devil(task, opinions)20 print(f"\n[魔鬼代言人]\n{devil}")2122 # 合併者協調結論,外加代言人的攻擊23 print("\n合併者正在協調結論...")24 opinions_plus = opinions + [{"role": "魔鬼代言人", "opinion": devil}]25 verdict = merge_opinions(task, opinions_plus)26 print(f"\n=== 最終判決 ===\n{verdict}")27 return verdict2829if __name__ == "__main__":30 analyze(31 "我們想要取消免費方案,讓產品完全付費,並提供 14 天試用。我們應該這樣做嗎?"32 )
運行此程式碼,你將看到完整的流程:編排器選擇角色,專家從各自角度切割真相,在辯論回合中互相爭論,代言人攻擊他們的共識,合併者給出綜合所有資訊(包括攻擊)的判決。單一 Agent 對同一個問題會給出模糊的「取決於你的受眾」,而群體則給出結構化的分析,其中衝突是明確的,共識是經過壓力測試的。
是什麼讓這個群體有效
三個因素將有用的群體與由 Agent 組成的表演區分開來。
角色必須衝突,而非互補。如果你的專家是「市場人員、社群媒體專員、內容經理」,他們會給出幾乎相同的答案,因為他們的利益一致。真正的價值在於利益衝突時:成長 vs 永續性、速度 vs 品質、當前的金錢 vs 未來的信任。利益衝突才能打開決策。
專家不能看到彼此。一旦一個專家看到另一個專家的意見,順從就開始了,它會調整。獨立性不是實作細節,而是運作條件。並行啟動免費提供了這一點。
合併者不平均,而是保留衝突。一個糟糕的綜合會將五個尖銳的意見變成一個無力的摘要。一個好的綜合會讓衝突可見,因為衝突是最有價值的資訊:它顯示了決策真正存在風險的地方,而不是每個人點頭附和的地方。
可以擴展的方向
這個骨架可以在幾個明顯的方向上擴展。你可以添加一個辯論回合:在第一次合併後,向專家展示摘要,讓他們異議,這會強化衝突。你可以用一個更強大的模型作為裁判來權衡論點。你可以為重複出現的決策類型固定角色,這樣就不需要每次都生成它們。
但基本原則保持不變:不同的透鏡、獨立分析、尊重分歧的綜合。一個群體對分析有用,不是因為有許多 Agent,而是因為他們以不同的方式看待,並且不讓彼此滑向一個共同的標準。拿起你現在獨自在腦中翻來覆去的一個決策,用這樣的群體運行它。你會看到你之前沒有把握的角度。





