Consilium:多個人工智慧語言模型協作
想象一下:四位人工智慧專家圍坐在牌桌旁,即時討論你最棘手的決策。這正是 Consilium,我在 Gradio Agents & MCP 駭客馬拉松期間搭建的多語言模型平臺所做的。它能讓AI模型討論複雜問題,並透過結構化辯論達成共識。
該平臺既可作為視覺化 Gradio 介面執行,也可作為 MCP(模型上下文協議)伺服器直接與 Cline 等應用程式整合(Claude Desktop 存在超時無法調整的問題)。核心思想始終是讓 LLM 透過討論達成共識;這也是 Consilium 這個名字的由來。後來,又添加了多數投票和排序選擇等其他決策模式,以使協作更加複雜。
從概念到架構
這並非我最初的駭客松想法。我最初想構建一個簡單的 MCP 伺服器,與 RevenueCat 中的專案進行互動。但後來我重新考慮了,因為我意識到一個多語言模型平臺,讓這些模型討論問題並返回有充分理由的答案,將更具吸引力。
時機恰到好處。駭客馬拉松結束後不久,微軟釋出了他們的 AI 診斷編排器 (MAI-DxO),它本質上是一個由不同角色(如“挑戰者醫生代理”)組成的人工智慧醫生小組,用於迭代診斷患者。在他們使用 OpenAI o3 的設定中,他們正確解決了 85.5% 的醫學診斷基準案例,而執業醫師的準確率僅為 20%。這恰恰驗證了 Consilium 所展示的:多個人工智慧視角協作可以顯著優於個體分析。
在確定了概念之後,我需要一個既能作為 MCP 伺服器又能作為引人入勝的 Hugging Face 空間演示的東西。最初我考慮使用標準的 Gradio Chat 元件,但我希望我的提交能夠脫穎而出。我的想法是讓語言模型圍坐在會議室的桌子旁,並顯示語音氣泡,這樣既能捕捉協作討論,又能使其在視覺上引人入勝。由於我未能很好地設計一個標準表格,使其真正被識別為表格,我選擇了撲克式圓桌會議。這種方法也讓我能夠透過構建自定義 Gradio 元件和 MCP 伺服器來提交到兩個駭客松賽道。
構建視覺基礎
自定義 Gradio 元件成為提交的核心;撲克風格的圓桌會議,參與者圍坐其中,顯示出他們的回答、思考狀態和研究活動的語音氣泡,立即吸引了訪問該空間的人的目光。由於 Gradio 出色的開發者體驗,元件開發非常順利,儘管我在 PyPI 釋出方面遇到了一個文件空白,導致我首次為 Gradio 專案做出了貢獻。
# The visual component integration
roundtable = consilium_roundtable(
label="AI Expert Roundtable",
label_icon="https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
value=json.dumps({
"participants": [],
"messages": [],
"currentSpeaker": None,
"thinking": [],
"showBubbles": [],
"avatarImages": avatar_images
})
)
在整個駭客馬拉松期間,視覺設計被證明是穩健的;在初始實現之後,只添加了使用者定義的頭像和中心表格文字等功能,而核心互動模型保持不變。
如果您有興趣建立自己的自定義 Gradio 元件,您應該看看 5 分鐘建立自定義元件,是的,標題沒有撒謊;基本設定確實只需要 5 分鐘。
會話狀態管理
視覺化圓桌會議透過基於會話的字典系統維護狀態,每個使用者透過 user_sessions[session_id]
獲得獨立的儲存。核心狀態物件跟蹤 participants
、messages
、currentSpeaker
、thinking
和 showBubbles
陣列,這些陣列透過 update_visual_state()
回撥進行更新。當模型思考、發言或執行研究時,引擎透過向訊息陣列追加並切換髮言者/思考狀態,向前端推送增量狀態更新,從而建立即時視覺化流程,而無需複雜的有限狀態機——只需後端處理和前端渲染之間同步的直接 JSON 狀態突變。
讓語言模型真正進行討論
在實現過程中,我意識到LLM之間並沒有真正的討論,因為它們缺乏明確的角色。它們接收到持續討論的完整上下文,但不知道如何有意義地參與。我引入了不同的角色來建立富有成效的辯論動態,經過幾次調整,最終形成了以下形式:
self.roles = {
'standard': "Provide expert analysis with clear reasoning and evidence.",
'expert_advocate': "You are a PASSIONATE EXPERT advocating for your specialized position. Present compelling evidence with conviction.",
'critical_analyst': "You are a RIGOROUS CRITIC. Identify flaws, risks, and weaknesses in arguments with analytical precision.",
'strategic_advisor': "You are a STRATEGIC ADVISOR. Focus on practical implementation, real-world constraints, and actionable insights.",
'research_specialist': "You are a RESEARCH EXPERT with deep domain knowledge. Provide authoritative analysis and evidence-based insights.",
'innovation_catalyst': "You are an INNOVATION EXPERT. Challenge conventional thinking and propose breakthrough approaches."
}
這解決了討論問題,但又提出了一個新問題:如何確定共識或識別最強的論點?我實施了一個首席分析師系統,使用者選擇一個LLM來綜合最終結果並評估是否達成共識。
我還希望使用者能夠控制通訊結構。除了預設的完整上下文共享之外,我還添加了兩種備用模式:
- 環形:每個語言模型只接收上一個參與者的回覆。
- 星形:所有訊息都透過主分析師作為中央協調器。
最後,討論需要終點。我實現了可配置的回合數(1-5),測試表明更多回合會增加達成共識的可能性(儘管計算成本更高)。
語言模型選擇與研究整合
當前的模型選擇包括 Mistral Large、DeepSeek-R1、Meta-Llama-3.3-70B 和 QwQ-32B。雖然 Claude Sonnet 和 OpenAI 的 o3 等知名模型缺席,但這反映了駭客馬拉松學分可用性和贊助商獎項考慮,而非技術限制。
self.models = {
'mistral': {
'name': 'Mistral Large',
'api_key': mistral_key,
'available': bool(mistral_key)
},
'sambanova_deepseek': {
'name': 'DeepSeek-R1',
'api_key': sambanova_key,
'available': bool(sambanova_key)
}
...
}
對於支援函式呼叫的模型,我整合了一個專門的研究代理,它以另一個圓桌會議參與者的身份出現。這種代理方法沒有直接賦予模型網路訪問許可權,而是提供了關於外部資源可用性的視覺清晰度,並確保了所有函式呼叫模型的一致訪問。
def handle_function_calls(self, completion, original_prompt: str, calling_model: str) -> str:
"""UNIFIED function call handler with enhanced research capabilities"""
message = completion.choices[0].message
# If no function calls, return regular response
if not hasattr(message, 'tool_calls') or not message.tool_calls:
return message.content
# Process each function call
for tool_call in message.tool_calls:
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
# Execute research and show progress
result = self._execute_research_function(function_name, arguments, calling_model_name)
研究代理訪問五個來源:網路搜尋、維基百科、arXiv、GitHub 和 SEC EDGAR。我將這些工具建立在一個可擴充套件的基類架構上,以備將來擴充套件,同時重點關注可免費嵌入的資源。
class BaseTool(ABC):
"""Base class for all research tools"""
def __init__(self, name: str, description: str):
self.name = name
self.description = description
self.last_request_time = 0
self.rate_limit_delay = 1.0
@abstractmethod
def search(self, query: str, **kwargs) -> str:
"""Main search method - implemented by subclasses"""
pass
def score_research_quality(self, research_result: str, source: str = "web") -> Dict[str, float]:
"""Score research based on recency, authority, specificity, relevance"""
quality_score = {
"recency": self._check_recency(research_result),
"authority": self._check_authority(research_result, source),
"specificity": self._check_specificity(research_result),
"relevance": self._check_relevance(research_result)
}
return quality_score
由於研究操作可能耗時,語音氣泡會顯示進度指示器和時間估算,以在較長的研究任務中保持使用者參與度。
發現開放式協議
駭客馬拉松之後,Deborah Dahl 向我介紹了 開放式協議,它與圓桌會議方式完美契合。該協議為跨平臺代理通訊提供了標準化的 JSON 訊息格式。與其他代理間協議的關鍵區別在於,所有代理都保持持續的對話意識,就像坐在同一張桌子旁一樣。我沒有在其他協議中見過的一個特點是,主持人可以動態地邀請和移除代理。
該協議的互動模式直接對映到 Consilium 的架構:
- 委派:在代理之間轉移控制權
- 通道:不修改地傳遞訊息
- 調解:幕後協調
- 編排:多個代理協作
我目前正在整合對開放式協議的支援,以便使用者可以將任何符合 OFP 的代理新增到他們的圓桌討論中。您可以在以下連結關注此開發:https://huggingface.co/spaces/azettl/consilium_ofp
經驗教訓與未來影響
本次駭客馬拉松讓我接觸到了之前從未遇到過的多智慧體辯論研究,其中包括 透過多智慧體辯論鼓勵大型語言模型中的發散思維等基礎研究。社群體驗非常出色;所有參與者都透過 Discord 反饋和協作積極相互支援。看到我的圓桌會議元件被整合到 另一個駭客馬拉松專案中,是我在 Consilium 工作期間的一大亮點。
我將繼續致力於 Consilium,透過擴充套件模型選擇、Open Floor Protocol 整合和可配置的代理角色,該平臺將能夠支援幾乎所有可以想象的多代理辯論場景。
構建 Consilium 再次堅定了我對人工智慧未來的信念,即未來不僅在於更強大的個體模型,更在於能實現有效人工智慧協作的系統。隨著專業化小型語言模型效率更高、資源更友好,我相信,針對特定任務的 SLM 圓桌會議與專用研究代理相結合,將為許多用例提供引人注目的替代方案,以取代通用大型語言模型。