首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >AI Agents:多智能体协作系统的架构设计与工程实现

AI Agents:多智能体协作系统的架构设计与工程实现

原创
作者头像
用户12339161
发布于 2026-09-28 17:24:55
发布于 2026-09-28 17:24:55
980
举报

单个 Agent 能力有上限:上下文有限、工具冲突、角色混淆。当任务需要"研究→写作→审查→修订"多个专业视角时,多 Agent 协作成为必然。本文从架构模式讲到通信机制,给出一个可运行的多智能体系统实现。

一、为什么需要多 Agent

单 Agent 的三大瓶颈:

  • 上下文污染:一个 Agent 既要检索、又要推理、又要生成,提示词相互干扰。
  • 工具冲突:不同任务需要不同工具集,混在一起导致误调用。
  • 无法并行:串行执行,长任务耗时线性增长。

多 Agent 通过职责隔离解决:每个 Agent 有独立系统提示、独立工具集、独立上下文,通过消息传递协作。

二、核心架构模式

模式

结构

适用场景

顺序流水线

A→B→C

步骤明确的流程

并行扇出

A→(B,C,D)→E

独立子任务

层级委派

Manager→Workers

复杂任务分解

辩论协商

多 Agent 互评

需要多视角决策

生产系统常用层级 + 并行混合:Manager 拆解任务,Workers 并行执行,Reviewer 汇总。

三、通信机制:消息总线

Agent 间不直接调用,而是通过总线解耦。消息包含发送者、接收者、类型、载荷。

代码语言:javascript
复制
import json, uuid, time
from dataclasses import dataclass, field, asdict
from collections import defaultdict, deque

@dataclass
class Message:
    sender: str
    receiver: str
    type: str                    # task / result / critique
    payload: dict
    msg_id: str = field(default_factory=lambda: uuid.uuid4().hex[:8])
    ts: float = field(default_factory=time.time)
    reply_to: str | None = None

class MessageBus:
    def __init__(self):
        self.queues = defaultdict(deque)
        self.history = []

    def send(self, msg: Message):
        self.queues[msg.receiver].append(msg)
        self.history.append(msg)

    def recv(self, agent: str) -> Message | None:
        q = self.queues[agent]
        return q.popleft() if q else None

    def trace(self, msg_id: str) -> list[Message]:
        """按消息链回溯,用于调试与审计"""
        chain, cur = [], msg_id
        while cur:
            m = next((x for x in self.history if x.msg_id == cur), None)
            if not m:
                break
            chain.append(m)
            cur = m.reply_to
        return list(reversed(chain))

总线带来的好处:可追溯(每条消息有 ID 与父消息)、可观测(history 全量记录)、可扩展(新增 Agent 只需注册)。

四、Agent 基类与具体实现

每个 Agent 封装:系统提示、工具集、处理逻辑。

代码语言:javascript
复制
import os
from openai import OpenAI

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

class BaseAgent:
    name = "base"
    system = "你是一个助手。"

    def __init__(self, bus: MessageBus):
        self.bus = bus

    def think(self, prompt: str, temperature=0.3) -> str:
        r = client.chat.completions.create(
            model="gpt-4o-mini", temperature=temperature,
            messages=[{"role": "system", "content": self.system},
                      {"role": "user", "content": prompt}],
        )
        return r.choices[0].message.content

    def handle(self, msg: Message):
        raise NotImplementedError

    def run_once(self) -> bool:
        msg = self.bus.recv(self.name)
        if not msg:
            return False
        self.handle(msg)
        return True

三个具体角色:

代码语言:javascript
复制
class Researcher(BaseAgent):
    name = "researcher"
    system = "你是研究员。基于给定主题,输出3-5个关键事实要点,简洁客观。"

    def handle(self, msg: Message):
        topic = msg.payload["topic"]
        facts = self.think(f"主题:{topic}\n请列出关键事实。")
        self.bus.send(Message(
            sender=self.name, receiver="writer",
            type="result", payload={"topic": topic, "facts": facts},
            reply_to=msg.msg_id))

class Writer(BaseAgent):
    name = "writer"
    system = "你是技术写作者。基于事实写一段300字说明,逻辑清晰。"

    def handle(self, msg: Message):
        facts = msg.payload["facts"]
        draft = self.think(f"事实:\n{facts}\n请撰写说明。", temperature=0.7)
        self.bus.send(Message(
            sender=self.name, receiver="reviewer",
            type="result", payload={"draft": draft},
            reply_to=msg.msg_id))

class Reviewer(BaseAgent):
    name = "reviewer"
    system = ("你是审查者。输出JSON:"
              '{"score":0-5,"issues":["..."],"revised":"修订后全文"}')

    def handle(self, msg: Message):
        import json
        out = self.think(f"请审查并修订:\n{msg.payload['draft']}")
        try:
            data = json.loads(out)
        except json.JSONDecodeError:
            data = {"score": 0, "issues": ["解析失败"], "revised": out}
        self.bus.send(Message(
            sender=self.name, receiver="manager",
            type="critique", payload=data,
            reply_to=msg.msg_id))

五、编排器:驱动协作

Manager 负责启动流程、驱动循环、判定终止。

代码语言:javascript
复制
class Orchestrator:
    def __init__(self, bus: MessageBus, agents: list[BaseAgent], max_rounds=10):
        self.bus = bus
        self.agents = {a.name: a for a in agents}
        self.max_rounds = max_rounds

    def run(self, topic: str) -> dict:
        self.bus.send(Message(
            sender="manager", receiver="researcher",
            type="task", payload={"topic": topic}))

        for _ in range(self.max_rounds):
            progressed = False
            for agent in self.agents.values():
                if agent.run_once():
                    progressed = True
            # 终止条件:reviewer 已产出结论
            done = [m for m in self.bus.history
                    if m.sender == "reviewer" and m.type == "critique"]
            if done:
                return done[-1].payload
            if not progressed:
                break
        return {"error": "未在限定轮次内完成"}

# 运行
bus = MessageBus()
orch = Orchestrator(bus, [Researcher(bus), Writer(bus), Reviewer(bus)])
result = orch.run("AI Agent 的记忆机制")
print(result.get("revised", result)[:300])

编排器每轮让所有 Agent 处理各自队列,直到 Reviewer 产出结论或达到轮次上限。轮次上限是防死循环的硬约束。

六、工程护栏

  1. 轮次与成本上限:超过即停,防止无限对话。
  2. 消息校验:payload 必须含必需字段,缺失则拒绝。
  3. 角色隔离:每个 Agent 独立上下文,不共享对话历史。
  4. 可追溯:通过 reply_to 链回溯完整决策路径。
  5. 降级策略:某 Agent 失败时,Manager 可跳过或重试。
  6. 人工介入点:高风险决策(发布、删除)插入审批节点。

结语

多 Agent 系统的专业性,不在"Agent 数量多",而在职责清晰、通信解耦、编排可控、可追溯可审计。消息总线让协作可观测,编排器让流程可终止,护栏让系统可控。掌握这套架构,才能把多智能体从演示推进到生产。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、为什么需要多 Agent
  • 二、核心架构模式
  • 三、通信机制:消息总线
  • 四、Agent 基类与具体实现
  • 五、编排器:驱动协作
  • 六、工程护栏
  • 结语
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档