Skip to content

多智能体系统(Multi-Agent System)

本章节介绍多智能体系统(Multi-Agent System)。

多智能体系统通过多个 Agent 的协作来完成复杂任务。

这是构建大规模 AI 系统的关键技术,能够实现单一 Agent 无法完成的复杂功能。


多 Agent 架构基础

多 Agent 系统的核心挑战包括三个方面。

分工问题:如何将任务合理分配给不同的 Agent。

通信问题:Agent 之间如何传递信息。

协调问题:如何确保多个 Agent 的行动一致且高效。

基本架构模式

层次架构(Hierarchical)

层次架构采用树状结构,有一个主 Agent 负责调度。

主 Agent(Orchestrator)负责任务分解和结果整合。

从 Agent(Subagent)负责执行具体任务。

python
Orchestrator (调度者)
    |
    +-- Agent A (专家A)
    +-- Agent B (专家B)
    +-- Agent C (专家C)

平级架构(Peer-to-Peer)

平级架构中所有 Agent 地位平等,直接通信协作。

适合 Agent 之间需要频繁对等交互的场景。

python
Agent A <--> Agent B
    |           |
    v           v
Agent C <--> Agent D

角色分工与协作

有效的多 Agent 系统需要明确的角色定义。

每个 Agent 应该有自己的专长和职责范围。

协作机制确保多个 Agent 能够协调工作。

常见角色定义

规划者(Planner):分解复杂任务,制定执行计划。

执行者(Executor):调用工具,执行具体操作。

审核者(Reviewer):评估结果,提出改进建议。

协调者(Coordinator):管理 Agent 间的通信和任务分配。

代码实现

多 Agent 系统基础实现

python

class Agent:

    """

    基础 Agent 类

    每个 Agent 有自己的角色、工具和执行逻辑

    """

    

    def __init__(self, role, llm, tools):

        # Agent 的角色名称

        self.role = role

        # 关联的语言模型

        self.llm = llm

        # 可用工具列表

        self.tools = tools

    

    def execute(self, task, context=None):

        """

        执行任务

        :param task: 任务描述

        :param context: 上下文信息

        :return: 执行结果

        """

        # 构建提示词

        prompt = self.build_prompt(task, context)

        

        # 生成响应

        response = self.llm.generate(prompt)

        

        # 如果需要调用工具

        if response.needs_tool_call:

            return self.execute_tool(response)

        

        return response.content

    

    def build_prompt(self, task, context):

        """构建 Agent 的提示词"""

        return f"角色:{self.role}\n任务:{task}\n上下文:{context}"

    

    def execute_tool(self, response):

        """执行工具调用"""

        tool_name = response.tool_name

        tool_input = response.tool_input

        

        # 从工具列表中找到对应工具

        tool = self.get_tool(tool_name)

        

        # 执行工具

        return tool.execute(tool_input)

class MultiAgentSystem:

    """

    多 Agent 协作系统

    负责管理多个 Agent 之间的协作

    """

    

    def __init__(self, agents, coordinator):

        # Agent 字典,key 是角色名

        self.agents = {a.role: a for a in agents}

        # 协调者 Agent

        self.coordinator = coordinator

    

    def solve(self, task):

        """

        解决复杂任务

        通过协调多个 Agent 协作完成

        """

        # 第一步:协调者分析任务,决定需要哪些 Agent 参与

        plan = self.coordinator.decompose(task)

        

        # 第二步:分发任务给相应 Agent

        results = {}

        for role, subtask in plan.subtasks.items():

            # 获取对应角色的 Agent

            agent = self.agents.get(role)

            if agent:

                # 执行子任务

                results[role] = agent.execute(subtask)

        

        # 第三步:协调者整合结果

        final_result = self.coordinator.integrate(results)

        

        return final_result

class CoordinatorAgent:

    """协调者 Agent"""

    

    def __init__(self, llm):

        self.llm = llm

    

    def decompose(self, task):

        """

        分解任务

        分析任务,决定需要哪些 Agent 以及如何分工

        """

        prompt = f"""

分析以下任务,分解为子任务并分配给合适的 Agent。

任务:{task}

请输出:

1. 需要哪些 Agent(角色)

2. 每个 Agent 负责什么子任务

3. 子任务之间的依赖关系

输出格式:JSON

"""

        response = self.llm.generate(prompt)

        return Plan.parse(response)

    

    def integrate(self, results):

        """

        整合多个 Agent 的结果

        """

        prompt = f"""

整合以下 Agent 的执行结果,生成最终回答。

结果列表:

{results}

请整合并输出最终结果。

"""

        return self.llm.generate(prompt)

AutoGen 框架

AutoGen 是微软开发的多 Agent 编程框架。

它提供了一套简洁的 API 来构建多 Agent 对话系统。

AutoGen 大大简化了多 Agent 系统的开发复杂度。

核心概念

AssistantAgent:能够调用工具的智能助手 Agent。

UserProxyAgent:代表用户行为,可以执行代码和工具调用。

GroupChat:支持多个 Agent 之间的群聊协作。

GroupChatManager:管理群聊中的 Agent 交互。

代码示例

AutoGen 基本使用

python

# 导入 autogen 框架

import autogen

from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager

# ==================== 配置 LLM ====================

# 创建一个配置字典

llm_config = {

    "model": "gpt-4",

    "api_key": "your-api-key",  # 实际使用时从环境变量读取

    "temperature": 0.7

}

# ==================== 创建单个 Agent ====================

# 创建助手 Agent

assistant = AssistantAgent(

    name="assistant",

    system_message="""

    你是一个有用的 Python 编程助手。

    你可以帮助用户编写、调试和优化代码。

    """,

    llm_config=llm_config

)

# 创建用户代理 Agent

# human_input_mode="NEVER" 表示不需要人工输入

# max_consecutive_auto_reply=10 表示最多连续自动回复 10 次

user_proxy = UserProxyAgent(

    name="user_proxy",

    human_input_mode="NEVER",

    max_consecutive_auto_reply=10

)

# ==================== 单 Agent 对话 ====================

# 启动对话

user_proxy.initiate_chat(

    assistant,

    message="帮我写一个快速排序算法"

)

# ==================== 多 Agent 群聊 ====================

# 创建多个 Agent

coder = AssistantAgent(

    name="coder",

    system_message="你是一个 Python 编程专家,负责编写代码。",

    llm_config=llm_config

)

reviewer = AssistantAgent(

    name="reviewer",

    system_message="你是一个代码审查专家,负责审查代码质量。",

    llm_config=llm_config

)

# 创建群聊

group_chat = GroupChat(

    agents=[coder, reviewer],

    messages=[],

    max_round=10  # 最多对话 10 轮

)

# 创建群聊管理器

manager = GroupChatManager(

    groupchat=group_chat,

    llm_config=llm_config

)

# 启动群聊

user_proxy.initiate_chat(

    manager,

    message="写一个快速排序算法并审查代码"

)

更复杂的 AutoGen 示例

AutoGen 工具调用

python

import autogen

from autogen import AssistantAgent, UserProxyAgent

# 定义工具列表

# 这些工具会被注册到 Agent 的工具列表中

tools = [

    {

        "name": "calculate",

        "description": "执行数学计算",

        "parameters": {

            "type": "object",

            "properties": {

                "expression": {

                    "type": "string",

                    "description": "要计算的数学表达式,如 '2+3*5'"

                }

            },

            "required": ["expression"]

        }

    },

    {

        "name": "search_web",

        "description": "搜索网页信息",

        "parameters": {

            "type": "object",

            "properties": {

                "query": {

                    "type": "string",

                    "description": "搜索关键词"

                }

            },

            "required": ["query"]

        }

    }

]

# 创建具有工具调用能力的 Agent

assistant = AssistantAgent(

    name="assistant",

    system_message="""

    你是一个有用的助手。

    当需要计算或查找信息时,你可以调用相关工具。

    """,

    llm_config={

        "model": "gpt-4",

        "api_key": "your-api-key"

    },

    tools=tools  # 注册工具

)

# 创建用户代理

user_proxy = UserProxyAgent(

    name="user_proxy",

    human_input_mode="NEVER"

)

# 启动对话,Agent 会自动调用工具

user_proxy.initiate_chat(

    assistant,

    message="计算 (15 + 25) * 2 等于多少?"

)

# 回复示例:

# Agent 可能会回复:

# "我来计算一下:(15 + 25) * 2 = 40 * 2 = 80"

# 或者直接调用 calculate 工具获取结果

A2A 与 MCP 协议

多 Agent 系统需要标准化的通信协议。

A2A 和 MCP 是两个重要的协议标准。

A2A(Agent-to-Agent)协议

A2A 协议定义了 Agent 之间通信的标准格式。

它支持代理发现、任务协作和状态同步。

核心功能

代理发现(Agent Discovery):Agent 能够发现其他 Agent 的能力和服务。

任务协作(Task Collaboration):多个 Agent 能够协同完成复杂任务。

状态同步(State Synchronization):Agent 之间能够同步状态信息。

MCP(Model Context Protocol)协议

MCP 是一种开放标准协议。

使得 AI 模型能够安全地与外部工具和数据源连接。

MCP 是工具接入的标准协议,类似于 USB 接口的作用。

核心组件

Host:运行 AI 应用的宿主环境。

Client:与 MCP 服务器建立连接的客户端。

Server:提供工具和资源的服务端。

MCP 工具定义示例

MCP 工具定义

python

{

    "name": "filesystem",

    "description": "文件系统操作工具",

    "version": "1.0.0",

    "tools": [

        {

            "name": "read_file",

            "description": "读取文件内容",

            "inputSchema": {

                "type": "object",

                "properties": {

                    "path": {

                        "type": "string",

                        "description": "文件路径,必填"

                    },

                    "encoding": {

                        "type": "string",

                        "description": "文件编码,可选,默认为 utf-8"

                    }

                },

                "required": ["path"]

            }

        },

        {

            "name": "write_file",

            "description": "写入文件内容",

            "inputSchema": {

                "type": "object",

                "properties": {

                    "path": {

                        "type": "string",

                        "description": "文件路径,必填"

                    },

                    "content": {

                        "type": "string",

                        "description": "文件内容,必填"

                    }

                },

                "required": ["path", "content"]

            }

        },

        {

            "name": "list_directory",

            "description": "列出目录内容",

            "inputSchema": {

                "type": "object",

                "properties": {

                    "path": {

                        "type": "string",

                        "description": "目录路径"

                    }

                }

            }

        }

    ],

    "resources": [

        {

            "uri": "file://config",

            "description": "配置文件"

        }

    ]

}

注意:A2A 和 MCP 解决的问题不同。A2A 解决的是 Agent 之间的通信问题,MCP 解决的是 Agent 与外部工具的连接问题。两者可以结合使用,构建完整的多 Agent 系统。


主从 Agent 模式

主从模式是一种经典的多 Agent 架构模式。

主 Agent(Orchestrator)负责任务分解和结果整合。

从 Agent(Subagent)负责执行具体任务。

适用场景

任务可以清晰地分解为独立子任务的场景。

需要不同专业技能的 Agent 协作完成的场景。

需要中央协调和控制的复杂工作流。

代码实现

主从 Agent 模式实现

python

class OrchestratorAgent:

    """

    主编排 Agent(主 Agent)

    负责任务分解、分配和结果整合

    """

    

    def __init__(self, llm, subagents):

        # 语言模型

        self.llm = llm

        # 从 Agent 字典

        self.subagents = {a.role: a for a in subagents}

    

    def handle_request(self, request):

        """

        处理用户请求

        完整的编排流程

        """

        # ==================== 分析阶段 ====================

        # 分析请求,决定是否需要多个 Agent 协作

        plan = self.llm.plan(request)

        

        if len(plan.subtasks) == 1:

            # 单一任务,直接分发给对应 Agent

            target_role = plan.target_role

            return self.subagents[target_role].execute(plan.subtasks[0])

        

        # ==================== 多 Agent 协作阶段 ====================

        # 创建任务队列

        task_queue = self.create_task_queue(plan.subtasks)

        

        # 存储已完成的结果

        results = []

        

        # 处理循环,直到所有任务完成

        while task_queue:

            # 获取可以并行执行的任务

            parallel_tasks = self.get_parallel_tasks(task_queue)

            

            # 并行执行

            parallel_results = self.execute_in_parallel(parallel_tasks)

            results.extend(parallel_results)

            

            # 更新任务队列

            # 处理依赖关系,移除已完成任务,添加新任务

            task_queue = self.update_queue(task_queue, parallel_results)

        

        # ==================== 整合阶段 ====================

        # 整合所有结果

        return self.integrate_results(results)

    

    def create_task_queue(self, subtasks):

        """创建任务队列"""

        return TaskQueue(subtasks)

    

    def get_parallel_tasks(self, task_queue):

        """

        获取可以并行执行的任务

        排除有依赖关系的任务

        """

        ready_tasks = []

        for task in task_queue.tasks:

            # 检查任务依赖是否都满足

            if all(dep in task_queue.completed for dep in task.dependencies):

                ready_tasks.append(task)

        return ready_tasks

    

    def execute_in_parallel(self, tasks):

        """并行执行多个任务"""

        import concurrent.futures

        

        results = []

        with concurrent.futures.ThreadPoolExecutor() as executor:

            # 提交所有任务

            future_to_task = {

                executor.submit(self.execute_task, task): task

                for task in tasks

            }

            

            # 收集结果

            for future in concurrent.futures.as_completed(future_to_task):

                task = future_to_task[future]

                try:

                    result = future.result()

                    results.append(result)

                except Exception as e:

                    results.append(TaskResult(task=task, error=str(e)))

        

        return results

    

    def execute_task(self, task):

        """执行单个任务"""

        agent = self.subagents.get(task.role)

        if not agent:

            return TaskResult(task=task, error=f"Unknown role: {task.role}")

        

        return agent.execute(task.description)

    

    def update_queue(self, task_queue, completed_results):

        """更新任务队列"""

        # 将已完成任务标记为完成

        for result in completed_results:

            task_queue.completed.add(result.task.id)

        

        # 移除已完成的任务

        task_queue.tasks = [

            t for t in task_queue.tasks

            if t.id not in task_queue.completed

        ]

        

        return task_queue

    

    def integrate_results(self, results):

        """

        整合多个 Agent 的结果

        生成最终回答

        """

        prompt = f"""

整合以下 Agent 的执行结果,生成最终回答。

结果列表:

{results}

请整合成一个完整、连贯的回答。

"""

        return self.llm.generate(prompt)

class Subagent:

    """从 Agent 基类"""

    

    def __init__(self, role, llm, tools=None):

        self.role = role

        self.llm = llm

        self.tools = tools or []

    

    def execute(self, task):

        """执行任务的具体逻辑"""

        raise NotImplementedError

主从模式的优缺点

优点缺点
结构清晰,易于理解和实现主 Agent 成为单点故障
中央协调,易于控制主 Agent 可能成为性能瓶颈
适合层次分明的任务灵活性较低,难以动态调整
调试方便,可追踪每个子任务不适合对等交互频繁的场景

章节小结

本章节介绍了多智能体系统的核心概念和实现方法。

多 Agent 架构基础 介绍了层次架构和平级架构两种基本模式。

角色分工与协作 通过明确的角色定义提高系统效率。

AutoGen 框架 提供了简化多 Agent 开发的编程框架。

A2A 和 MCP 协议 是 Agent 通信和工具接入的标准协议。

主从 Agent 模式 适合有明确层次结构的复杂任务。

选择合适的多 Agent 架构需要根据具体场景。

对于简单场景,单个 Agent 即可满足需求。

对于复杂场景,需要根据任务特点选择合适的架构模式。

AI 思考中...

Python 实现 RAG 与知识检索

AI Agent 工具与外部集成

基于 VitePress 构建,部署于 GitHub Pages