多角度分析的 Agent 群體:利用 LLM 構建專家團隊

@h100envy
英語2 天前 · 2026年7月15日
625K
273
38
13
754

TL;DR

本指南說明如何構建一個多 Agent 的 LLM 系統,透過模擬具有衝突偏見的專家團隊,針對複雜決策提供深入且多角度的分析。

不是關於速度。而是關於讓多個具有不同觀點的 Agent 針對一個決策進行辯論,並得出比任何單一 Agent 都更好的結論。附帶完整的編排器、專家和合併程式碼。

當你讓一個模型評估一個決策時,它只會給出一個觀點,通常是平均且謹慎的。它傾向於同意、修飾、尋找平衡。這就是問題所在:一個重要的決策不能由單一平均觀點來評估,必須從不同角度進行攻擊。

一個 Agent 群體從結構上解決了這個問題。你建立幾個專家,每個都有固定的角色和偏見:一個只考慮金錢,另一個只考慮技術風險,第三個只考慮使用者。他們獨立分析同一個決策,得出不同的結論,然後你強制對這些結論進行協調。這裡的價值不是速度,而是異議被內建在結構中。單一 Agent 傾向於與自己進行群體思考,而一個角色群體則不會。

本文展示如何用程式碼建立這樣的群體。我們涵蓋三個部分:分配角色的編排器、獨立分析的專家,以及將它們協調成一個結論的合併者。

架構:編排器、專家、合併者

一個用於分析的群體由三個元件組成。

編排器接收任務,並決定需要哪些專家角色。對於評估產品上市,這些角色可能包括投資者、工程師、產品專家、安全人員。編排器本身不進行分析,它分配角色。

專家並行且獨立地工作。每個專家都看到同一個決策,但透過自己的視角。關鍵是,他們看不到彼此的結論,否則就會產生順從。獨立性才能產生不同的觀點。

合併者收集專家的結論並進行協調:他們在哪裡達成一致,在哪裡矛盾,最終在所有角度下的判決是什麼。這不是平均,而是將異議作為訊號的綜合分析。

h100envy - inline image

第一步:基本客戶端

從一個簡單的模型客戶端開始。我使用 OpenAI 相容的訊息格式,它適用於大多數供應商和本地 Ollama。

python
1import requests
2import json
3from concurrent.futures import ThreadPoolExecutor
4
5API = "http://localhost:11434/api/chat" # Ollama, or a provider endpoint
6MODEL = "qwen2.5:32b"
7
8def 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 來解析。

python
1ORCHESTRATOR_SYSTEM = """你是分析群體的協調者。
2針對該任務,定義 3-5 個專家角色,這些角色將對該決策提供最大程度的不同
3且相互衝突的觀點。這些角色必須在利益上衝突,而非互補。
4
5對每個角色給出:名稱、關注點(它專注於什麼)、偏見(它傾向於什麼,
6以及它往往會高估什麼)。
7
8僅回覆一個 JSON 陣列,不要有任何解釋:
9[{"name": "...", "focus": "...", "bias": "..."}, ...]
10"""
11
12def plan_roles(task):
13 raw = ask(ORCHESTRATOR_SYSTEM, f"要分析的任務:\n{task}",
14 temperature=0.9) # 較高的溫度以增加角色多樣性
15 # 切出 JSON,以防模型在周圍添加了文字
16 start, end = raw.find("["), raw.rfind("]") + 1
17 return json.loads(raw[start:end])

我們故意在此處保持較高的溫度:我們想要多樣化的、非顯而易見的角色。提示中「角色必須衝突」的要求是關鍵,沒有它,模型會給出三個幾乎相同的角色,而整個群體的意義就喪失了。

第三步:專家並行獨立分析

每個專家都會獲得自己的角色和相同的決策。關鍵是:他們並行運行,且看不到彼此的結論。這裡的並行性不僅是為了速度,更是為了保證獨立性,一個專家在物理上無法調整自己的意見去迎合他人。

python
1EXPERT_SYSTEM = """你是一名專家,角色為:{name}。
2你的關注點:{focus}。
3你的偏見:{bias}。不要對抗它,它對分析是有價值的。
4
5嚴格從你的立場分析決策。不要力求平衡,不要試圖考慮其他觀點,其他專家會做那些事。
6你的工作是將你的角度推到極限。
7
8給出:
9- 從你的立場得出的判決(贊成 / 反對 / 有條件)
10- 2-3 個從你的角度出發的主要論點
11- 1 個從你的立場最容易看到、而其他人會忽略的風險
12簡短精煉,不要廢話。"""
13
14def 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}
18
19def 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]

注意專家提示:我們明確禁止它保持平衡。這違反直覺,但這正是全部重點。如果每個專家都試圖考慮所有方面,你會得到五個相同的謹慎意見。透過強迫每個專家將自己的角度推到極限,你得到一個真正的光譜,然後由合併者進行協調。

第四步:合併者協調結論

現在我們有幾個尖銳、片面的意見。合併者將它們收集成一個判決,但不是透過平均。它尋找專家們達成一致的地方(一個強訊號),他們矛盾的地方(一個需要決策的風險區域),以及什麼比什麼更重要。

python
1MERGE_SYSTEM = """你是分析群體的綜合者。你獲得了幾個具有不同偏見的專家
2對同一個決策的意見。
3
4你的工作不是平均它們。你的工作是:
51. 一致點:專家們儘管立場不同卻達成一致的地方。
6 這是最可靠的訊號,請強調它。
72. 衝突點:專家們直接矛盾的地方。不要修飾它,明確指出衝突,
8 並說明每一方代價是什麼。
93. 盲點:只有一個專家提到的風險,但很重要。
104. 最終判決:綜合所有資訊後的結論:贊成 / 反對 / 有條件,以及在什麼條件下會改變。
11
12寫得緊湊。將分歧視為資訊,不要隱藏它。"""
13
14def merge_opinions(task, opinions):
15 block = "\n\n".join(
16 f"### 專家:{o['role']}\n{o['opinion']}" for o in opinions
17 )
18 user = f"決策:\n{task}\n\n專家意見:\n{block}"
19 return ask(MERGE_SYSTEM, user, temperature=0.4) # 較低溫度以獲得冷靜的綜合

我們在合併時降低溫度:如果專家應該多樣化(高溫),那麼綜合者應該冷靜且一致(低溫)。這裡的關鍵指示是「不要平均,將分歧視為資訊」。一個普通的合併者會將一切變成模糊的「一方面……另一方面」。一個好的合併者會清楚說明:這裡每個人都同意,而這裡有個衝突,代價是這麼多。

第 4.5 步:針對虛假共識的魔鬼代言人

有一個潛在的危險:有時專家們達成一致,不是因為決策是好的,而是因為每個人都因慣性而看向同一個方向。這是虛假共識,它比公開衝突更危險,因為它看起來像信心。

為此,我們添加一個特殊的 Agent,即魔鬼代言人。它的唯一工作就是攻擊共識。它看到所有專家的意見,並有義務找出他們可能同時出錯的原因。如果群體一致投票「贊成」,代言人會尋找一個可能是災難的場景。

python
1DEVIL_SYSTEM = """你是分析群體中的魔鬼代言人。你獲得了專家們的意見。
2你的唯一工作:攻擊他們的共識。
3
4如果專家們在某件事上趨於一致,找出為什麼他們可能同時全部出錯。
5尋找一個共享的盲點:一個每個人都未經檢查就接受的假設,
6一個因為不方便而沒有人考慮的場景。
7
8不要客氣。你的價值在於你說了群體不想聽的話。給出:
9- 專家們共享的哪個假設最危險
10- 一個場景,在該場景中,群體的一致意見最終被證明是致命錯誤的
11- 一個群體小心迴避的問題
12如果沒有共識,專家們確實意見分歧,則直接說出來,並指出最尖銳的未解決衝突。"""
13
14def run_devil(task, opinions):
15 block = "\n\n".join(
16 f"### {o['role']}\n{o['opinion']}" for o in opinions
17 )
18 user = f"決策:\n{task}\n\n群體意見:\n{block}"
19 return ask(DEVIL_SYSTEM, user, temperature=0.8)

代言人在專家之後、合併之前運行,它的攻擊與意見一起進入綜合分析。重點是,即使是一個全體一致的群體,也至少有一個 Agent 有義務尋找裂縫。這很便宜(一次呼叫),並從結構上打破了群體思維:共識現在必須經受攻擊,而不僅僅是發生。

第 4.6 步:辯論回合以強化衝突

第一輪專家分析是獨立的,這對多樣性來說是正確的。但在收集意見後,你可以進行一輪辯論:向每個專家展示其他專家意見的摘要,並讓它提出異議。這會強化衝突,弱論點會消失,強論點會鞏固。

python
1DEBATE_SYSTEM = """你是第二輪分析中的專家 {name}。
2你原本的立場:
3{own_opinion}
4
5現在你看到了其他專家的意見。不要屈服於壓力,但也不要忽略強有力的論點。給出:
6- 如果他人的論點確實擊中了你的立場,誠實地承認
7- 你堅持立場的地方,以及為什麼你認為他們的異議是薄弱的
8- 辯論後你是否改變了你的判決,如果是,如何改變的
9簡短。這不是重複第一輪意見,而是對對手的反應。"""
10
11def 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 o
16 )
17 others_map[o["role"]] = others
18
19 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)}
24
25 with ThreadPoolExecutor(max_workers=len(opinions)) as pool:
26 return list(pool.map(rebut, opinions))

辯論回合也是並行的:每個專家同時對所有其他專家做出反應,再次沒有即時順從。辯論後,意見通常會更尖銳:你可以看到哪些立場在壓力下堅持下來,哪些崩潰了。正是這些經過錘煉的意見進入最終的合併。

第五步:整合所有部分

python
1def analyze(task, debate=True):
2 print("編排器正在選擇角色...")
3 roles = plan_roles(task)
4 for r in roles:
5 print(f" - {r['name']}: {r['focus']}")
6
7 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']}")
11
12 # 可選的辯論回合:專家們互相反駁
13 if debate:
14 print("\n辯論回合,專家們互相反駁...")
15 opinions = debate_round(roles, task, opinions)
16
17 # 魔鬼代言人攻擊群體的共識
18 print("\n魔鬼代言人正在尋找共識中的裂縫...")
19 devil = run_devil(task, opinions)
20 print(f"\n[魔鬼代言人]\n{devil}")
21
22 # 合併者協調結論,外加代言人的攻擊
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 verdict
28
29if __name__ == "__main__":
30 analyze(
31 "我們想要取消免費方案,讓產品完全付費,並提供 14 天試用。我們應該這樣做嗎?"
32 )

運行此程式碼,你將看到完整的流程:編排器選擇角色,專家從各自角度切割真相,在辯論回合中互相爭論,代言人攻擊他們的共識,合併者給出綜合所有資訊(包括攻擊)的判決。單一 Agent 對同一個問題會給出模糊的「取決於你的受眾」,而群體則給出結構化的分析,其中衝突是明確的,共識是經過壓力測試的。

是什麼讓這個群體有效

三個因素將有用的群體與由 Agent 組成的表演區分開來。

角色必須衝突,而非互補。如果你的專家是「市場人員、社群媒體專員、內容經理」,他們會給出幾乎相同的答案,因為他們的利益一致。真正的價值在於利益衝突時:成長 vs 永續性、速度 vs 品質、當前的金錢 vs 未來的信任。利益衝突才能打開決策。

專家不能看到彼此。一旦一個專家看到另一個專家的意見,順從就開始了,它會調整。獨立性不是實作細節,而是運作條件。並行啟動免費提供了這一點。

合併者不平均,而是保留衝突。一個糟糕的綜合會將五個尖銳的意見變成一個無力的摘要。一個好的綜合會讓衝突可見,因為衝突是最有價值的資訊:它顯示了決策真正存在風險的地方,而不是每個人點頭附和的地方。

可以擴展的方向

這個骨架可以在幾個明顯的方向上擴展。你可以添加一個辯論回合:在第一次合併後,向專家展示摘要,讓他們異議,這會強化衝突。你可以用一個更強大的模型作為裁判來權衡論點。你可以為重複出現的決策類型固定角色,這樣就不需要每次都生成它們。

但基本原則保持不變:不同的透鏡、獨立分析、尊重分歧的綜合。一個群體對分析有用,不是因為有許多 Agent,而是因為他們以不同的方式看待,並且不讓彼此滑向一個共同的標準。拿起你現在獨自在腦中翻來覆去的一個決策,用這樣的群體運行它。你會看到你之前沒有把握的角度。

二次創作

使用 YouMind 創作爆款文章

收集素材、拆解爆點、生成視覺資產、撰寫內容,並在一個 AI 工作空間裡完成分發。

了解 YouMind
寫給創作者

把你的 Markdown 變成乾淨的 𝕏 文章

圖片上傳、表格、程式碼區塊,往 𝕏 上手動重排太痛苦。YouMind 把整篇 Markdown 一鍵轉成乾淨、可直接發佈的 𝕏 文章草稿。

試試 Markdown 轉 𝕏

更多可拆解樣本

近期爆款文章

探索更多爆款文章