从零搭建多Agent协作系统:2026年最实用的智能体工作流实战指南
title: 从零搭建多Agent协作系统:2026年最实用的智能体工作流实战指南
slot: csdn-main
date: 2026-05-19
direction: 教程
words: 3200
为什么你需要多Agent系统
先抛一个问题:你有没有遇到过这种情况——写一个复杂的自动化脚本,发现它需要同时做「数据采集 → 清洗 → 分析 → 生成报告」四件事,单线程跑效率极低,拆成多个脚本管又容易乱?
半年前我也卡在这个问题上。直到认真研究了多Agent协作架构,才发现单Agent的瓶颈不是能力不够,而是职责不分离。
2026年的AI应用开发,已经过了「一个Agent包打天下」的阶段。微软研究院在最新的前沿观察中明确把「多Agent协作」列为年度核心方向,GitHub上 claude-flow(48.4k stars)、TradingAgents(73.1k stars)等项目的爆发,说明社区也在向这个方向快速迁移。
今天我就从实战角度,带你从零搭建一个多Agent协作系统。
多Agent架构的核心概念
先看一张简化的架构图:
用户请求
│
▼
┌──────────────┐
│ Orchestrator│ ← 调度中枢,负责任务分解与结果聚合
│ (主控Agent) │
└──────┬───────┘
│
┌──┴──┐──┐──┐
│ A1 │A2 │A3│ ... ← 工作Agent,各自负责独立子任务
└──┬──┘──┘──┘
│
▼
┌────────┐
│ 工具集 │ ← 搜索引擎、数据库、API、文件系统
└────────┘
三个核心角色:
- Orchestrator(编排器):负责理解用户意图、拆解任务、分派给合适的Agent、收集结果、综合输出
- Worker Agent(工作Agent):每个Agent有明确的职责边界(如搜索Agent、分析Agent、写代码Agent)
- Tool Layer(工具层):Agent实际操作的外部资源
这种架构最大的优势是:任意一个Agent出问题,不影响其他Agent的工作,编排器可以做重试或降级。
环境准备
开始前先搭好基础环境:
python -m venv multi-agent-env
source multi-agent-env/bin/activate
# 核心依赖
pip install openai httpx pydantic pyyaml
这里我用 OpenAI API 协议做演示,但架构上完全兼容 DeepSeek、Claude 等任何兼容 API 的模型。
第一步:定义Agent基类
所有Agent共享一个基础结构:
from pydantic import BaseModel
from typing import Optional, Callable
from openai import OpenAI
class Agent(BaseModel):
name: str
system_prompt: str
model: str = "gpt-4o"
client: Optional[OpenAI] = None
tools: list = []
class Config:
arbitrary_types_allowed = True
def __call__(self, message: str, temperature: float = 0.3) -> str:
"""执行单次Agent调用"""
if not self.client:
raise RuntimeError("Client not initialized")
# 构建工具定义(用于 function calling)
tool_defs = [t["definition"] for t in self.tools] if self.tools else None
response = self.client.chat.completions.create(
model=self.model,
temperature=temperature,
messages=[
{"role": "system", "content": self.system_prompt},
{"role": "user", "content": message},
],
tools=tool_defs,
)
return response.choices[0].message.content
关键设计点:
- 使用 Pydantic BaseModel — 方便序列化和配置管理
- system_prompt 作为核心配置 — Agent的行为完全由prompt定义,不改代码调行为
- tools 扩展点 — 留出function calling接口,后续接入搜索/计算等能力
第二步:定义工具(Tools)
Worker Agent 需要工具来完成实际工作。这里实现两个最常用的工具:
import json
from typing import Any
import httpx
# 工具定义(JSON schema格式,兼容OpenAI function calling)
TOOLS_REGISTRY = {
"web_search": {
"definition": {
"type": "function",
"function": {
"name": "web_search",
"description": "搜索网络获取最新信息",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"}
},
"required": ["query"]
}
}
},
"handler": lambda params: _web_search_impl(params["query"])
},
"calculate": {
"definition": {
"type": "function",
"function": {
"name": "calculate",
"description": "执行数学计算",
"parameters": {
"type": "object",
"properties": {
"expression": {"type": "string", "description": "数学表达式,如 2 + 3 * 4"}
},
"required": ["expression"]
}
}
},
"handler": lambda params: str(eval(params["expression"], {"__builtins__": {}}, {}))
}
}
def _web_search_impl(query: str) -> str:
"""真实的搜索实现(示例用DuckDuckGo)"""
url = f"https://api.duckduckgo.com/?q={query}&format=json"
resp = httpx.get(url, timeout=10)
data = resp.json()
results = data.get("Results", [])[:3]
return json.dumps([{"title": r["Title"], "url": r["FirstURL"]} for r in results], ensure_ascii=False)
第三步:构建编排器
编排器是整个系统的核心。它负责任务的接收、分解和结果聚合:
from typing import List
class Orchestrator:
def __init__(
self,
agents: List[Agent],
client: OpenAI,
model: str = "gpt-4o"
):
self.agents = {a.name: a for a in agents}
self.client = client
self.model = model
def run(self, task: str) -> str:
"""完整的协作流程"""
# 1. 任务分析
plan = self._analyze_task(task)
# 2. 分派执行
results = {}
for step in plan:
agent_name = step["agent"]
subtask = step["task"]
if agent_name in self.agents:
agent = self.agents[agent_name]
agent.client = self.client
results[agent_name] = agent(subtask)
# 3. 结果综合
return self._synthesize(task, results)
def _analyze_task(self, task: str) -> List[dict]:
"""分析用户任务,拆解为子任务列表"""
agents_desc = "\n".join([
f"- {name}: {agent.system_prompt[:50]}"
for name, agent in self.agents.items()
])
prompt = f"""你有以下Agent可用:
{agents_desc}
分析用户任务:「{task}」
请拆解为子任务列表,每个子任务指定用哪个Agent。
返回JSON数组,格式:[{{"agent": "agent_name", "task": "子任务描述"}}]"""
resp = self.client.chat.completions.create(
model=self.model,
temperature=0.1,
messages=[
{"role": "system", "content": "你是任务分解专家。只返回JSON,不要多余文字。"},
{"role": "user", "content": prompt}
],
response_format={"type": "json_object"}
)
content = resp.choices[0].message.content
return json.loads(content).get("steps", [])
def _synthesize(self, original_task: str, results: dict) -> str:
"""综合所有Agent的输出成最终结果"""
summary = "\n".join([
f"## {name} 的产出\n{output}"
for name, output in results.items()
])
prompt = f"""原始任务:{original_task}
各Agent产出:
{summary}
请综合以上信息,给出最终的完整回答。"""
resp = self.client.chat.completions.create(
model=self.model,
temperature=0.3,
messages=[
{"role": "system", "content": "你是结果综合专家。综合多Agent输出,给出完整、准确的回答。"},
{"role": "user", "content": prompt}
]
)
return resp.choices[0].message.content
第四步:装配一个实战系统
组装一个能够做「技术调研 → 撰写报告」的Agent团队:
def create_research_team(client: OpenAI) -> Orchestrator:
"""创建一个技术调研Agent团队"""
# Agent 1: 搜索研究员
search_agent = Agent(
name="researcher",
system_prompt="""你是一个资深技术研究员。
你的职责是:
1. 使用 web_search 工具搜索技术领域的权威信息
2. 提取关键数据、版本号、发布日期、优缺点
3. 输出结构化的研究发现摘要
不要做分析和结论,只做信息采集。""",
tools=[TOOLS_REGISTRY["web_search"]]
)
# Agent 2: 技术分析师
analysis_agent = Agent(
name="analyst",
system_prompt="""你是一个技术分析师。
你的职责是:
1. 基于研究员提供的数据做技术对比
2. 识别技术趋势和模式
3. 给出客观的能力评估和适用场景建议
4. 用表格呈现对比结果""",
)
# Agent 3: 报告撰写者
writer_agent = Agent(
name="writer",
system_prompt="""你是一个技术博主。
你的职责是:
1. 基于分析师的结论撰写技术文章
2. 语言通俗易懂,适合开发者阅读
3. 包含代码示例和技术细节
4. 结构化输出,有标题、有段落""",
)
return Orchestrator(
agents=[search_agent, analysis_agent, writer_agent],
client=client
)
# 使用示例
if __name__ == "__main__":
client = OpenAI(api_key="your-api-key")
team = create_research_team(client)
result = team.run("调研2026年最火的三个AI Agent框架,对比优缺点")
print(result)
第五步:进阶 — 错误处理与重试
真实环境中Agent调用可能失败(API超时、返回格式异常、模型幻觉)。加一层错误处理:
import time
from functools import wraps
def retry(max_attempts=3, delay=2):
"""为Agent调用增加自动重试"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
last_error = None
for attempt in range(max_attempts):
try:
return func(*args, **kwargs)
except Exception as e:
last_error = e
print(f" ⚠️ 第{attempt+1}次尝试失败: {e}")
if attempt < max_attempts - 1:
time.sleep(delay * (attempt + 1))
raise last_error
return wrapper
return decorator
# 给编排器加重试
class ReliableOrchestrator(Orchestrator):
@retry(max_attempts=2, delay=3)
def run(self, task: str) -> str:
return super().run(task)
再加上失败降级策略:
def run_with_fallback(task: str, orchestrator: Orchestrator) -> str:
"""主路径失败时降级"""
try:
return orchestrator.run(task)
except Exception as e:
print(f"主链路失败: {e}")
# 降级为单Agent模式
print("降级为单Agent模式...")
fallback_agent = orchestrator.agents.get("writer")
if fallback_agent:
return fallback_agent(f"请直接回答:{task}")
return f"系统暂时不可用,错误: {e}"
踩坑记录
这一路搭过来,有几个坑值得说:
1. Token 预算管理
多Agent系统最大的隐性成本是Token消耗。一个任务经过3个Agent,每个Agent的上下文里都包含前面Agent的输出,Token量会指数级增长。
解法:每个Agent输出后做一次摘要压缩,只保留关键信息传给下一个Agent。
def compress(text: str, client: OpenAI, max_chars: int = 500) -> str:
"""压缩Agent输出,只保留关键信息"""
resp = client.chat.completions.create(
model="gpt-4o-mini", # 用小模型做压缩,省钱
messages=[
{"role": "system", "content": f"将以下内容压缩到{max_chars}字以内,保留关键数据和技术细节"},
{"role": "user", "content": text}
]
)
return resp.choices[0].message.content
2. Agent 之间的「回声效应」
A说"这个框架性能不错" → B引用时说"研究员说性能不错" → C写成"根据分析,性能表现优秀"。信息在传递中失真,越到后面越偏离原始数据。
解法:在每个Agent的system prompt里加上「严格引用原始数据,不要做模糊转述」的约束,同时让编排器在执行综合步骤时回看原始Agent输出而非中间版本。
3. OpenAI API 的 Function Calling 限制
部分模型的function calling不稳定,或者不支持复杂的嵌套参数。实测 gpt-4o 最稳,gpt-4o-mini 有时会跳过工具调用直接输出文本。
解法:给关键Agent指定强模型,非关键Agent用小模型。在代码里按Agent级别配置 model 字段即可。
总结
多Agent协作不是把多个LLM call拼在一起那么简单。真正的工程挑战在于:
- 职责拆解 — 每个Agent的边界要清晰
- 信息传递 — 避免回声效应和Token浪费
- 错误处理 — 单个Agent挂了不影响整体
- 成本控制 — 大模型做判断,小模型做执行
这套架构我已经在生产环境跑了两个月,最直观的感受是:写一个单Agent的任务,你是在写代码;搭一个多Agent系统,你是在搭团队。
今天给的都是可以直接跑的代码,感兴趣的可以 clone 下来改改 prompt 和工具集,很快就能搭出自己的Agent团队。
如果你想看具体的生产环境部署(Docker + 消息队列 + 监控),或者想知道怎么把 DeepSeek V4 / Claude 接到这个框架里,留言告诉我,下一篇安排。
更多推荐



所有评论(0)