Consilium:多个人工智能语言模型协作

发布于 2025 年 7 月 17 日
在 GitHub 上更新

想象一下:四位人工智能专家围坐在牌桌旁,实时讨论你最棘手的决策。这正是 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] 获得独立的存储。核心状态对象跟踪 participantsmessagescurrentSpeakerthinkingshowBubbles 数组,这些数组通过 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 圆桌会议与专用研究代理相结合,将为许多用例提供引人注目的替代方案,以取代通用大型语言模型。

社区

真是太棒的工作和文章了!

·
文章作者

谢谢 @Tonic

我一直在寻找这个概念,这是一篇很棒的文章!🤩

注册登录 发表评论