
单个 Agent 能力有上限:上下文有限、工具冲突、角色混淆。当任务需要"研究→写作→审查→修订"多个专业视角时,多 Agent 协作成为必然。本文从架构模式讲到通信机制,给出一个可运行的多智能体系统实现。
单 Agent 的三大瓶颈:
多 Agent 通过职责隔离解决:每个 Agent 有独立系统提示、独立工具集、独立上下文,通过消息传递协作。
模式 | 结构 | 适用场景 |
|---|---|---|
顺序流水线 | A→B→C | 步骤明确的流程 |
并行扇出 | A→(B,C,D)→E | 独立子任务 |
层级委派 | Manager→Workers | 复杂任务分解 |
辩论协商 | 多 Agent 互评 | 需要多视角决策 |
生产系统常用层级 + 并行混合:Manager 拆解任务,Workers 并行执行,Reviewer 汇总。
Agent 间不直接调用,而是通过总线解耦。消息包含发送者、接收者、类型、载荷。
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 封装:系统提示、工具集、处理逻辑。
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三个具体角色:
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 负责启动流程、驱动循环、判定终止。
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 产出结论或达到轮次上限。轮次上限是防死循环的硬约束。
reply_to 链回溯完整决策路径。多 Agent 系统的专业性,不在"Agent 数量多",而在职责清晰、通信解耦、编排可控、可追溯可审计。消息总线让协作可观测,编排器让流程可终止,护栏让系统可控。掌握这套架构,才能把多智能体从演示推进到生产。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。