多智能体联动搭建教程:让AI团队协作完成任务

一个Agent干活慢?让十个Agent一起干

上个月我遇到了一个让我头疼的任务:帮客户分析100家竞品公司的产品信息,生成一份详细的竞品分析报告。

如果让一个Agent来做,它需要逐个搜索每家公司的信息、提取关键数据、对比分析。我试了一下,跑了将近3个小时,中间还崩了两次。

后来我换了个思路:让10个Agent并行工作,每个Agent负责10家公司,最后由一个”总编Agent”汇总。结果:25分钟搞定,质量还比一个Agent做的好。

这就是多智能体协作的威力。

这篇文章我会从零开始教你搭建一个多Agent协作系统。不需要任何分布式系统的知识,LangChain + Python就够了。

一、什么是多智能体协作

多智能体协作(Multi-Agent Collaboration)说白了就是:多个Agent分工合作,共同完成一个任务。

这跟人类团队是一样的道理。一个软件项目,你不可能让一个人同时做产品、设计、前端、后端、测试。你需要一个团队,每个人负责一个角色,协同工作。

多Agent系统也是一样。常见的角色分工:

  • 管理者(Manager):负责拆解任务、分配给其他Agent、汇总结果
  • 研究员(Researcher):负责搜索和收集信息
  • 写手(Writer):负责撰写内容
  • 审核员(Reviewer):负责检查质量、提出修改意见
  • 程序员(Coder):负责写代码、执行代码
  • 测试员(Tester):负责测试代码、报告bug

二、方案选择:三种多Agent架构

在LangChain生态里,搭建多Agent系统主要有三种方式:

方案一:LangGraph(推荐)

LangGraph是LangChain团队推出的专门用于构建多Agent系统的框架。它用”图”(Graph)的方式来定义Agent之间的协作流程。

优点:官方支持、功能完善、可视化好
缺点:学习曲线稍陡、版本迭代快

方案二:AgentExecutor + 手动编排

用LangChain的AgentExecutor,手动在代码中定义Agent之间的调用关系。

优点:简单直接、容易理解
缺点:复杂流程难以维护

方案三:CrewAI

CrewAI是专门做多Agent协作的第三方框架,设计理念是”把Agent当成团队成员来管理”。

优点:角色定义清晰、API简洁
缺点:社区不如LangChain大、高级功能有限

这篇文章我用LangGraph来演示,因为它是最成熟、最灵活的方案。

三、环境准备

pip install langchain==0.3.7 \\\\            langchain-openai==0.2.8 \\\\            langgraph==0.2.45 \\\\            langchain-community==0.3.7 \\\\            duckduckgo-search==6.3.0 \\\\            python-dotenv==1.0.1

四、实战:搭建一个”写作团队”

我们来搭建一个由三个Agent组成的写作团队:

  • 研究员:搜索资料、收集数据
  • 写手:根据资料写文章
  • 编辑:审核文章、提出修改意见

这三个Agent协作流程:研究员搜索 -> 写手写作 -> 编辑审核 -> 如果不合格,退回写手修改 -> 最终输出。

第一步:定义状态

from typing import TypedDict, Annotated, Sequenceimport operatorfrom langchain_core.messages import BaseMessageclass AgentState(TypedDict):    messages: Annotated[Sequence[BaseMessage], operator.add]    research_data: str    draft: str    review_feedback: str    final_output: str    iteration_count: int

状态(State)是Agent之间共享的数据。每个Agent可以读取和修改状态。

第二步:创建Agent

import osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_core.messages import HumanMessage, SystemMessagefrom langchain_community.tools import DuckDuckGoSearchRunfrom langchain.agents import create_tool_calling_agent, AgentExecutorload_dotenv()llm = ChatOpenAI(    model="gpt-4o-mini",    temperature=0.7,    api_key=os.getenv("OPENAI_API_KEY"))# ===== 研究员Agent =====search_tool = DuckDuckGoSearchRun()researcher_prompt = ChatPromptTemplate.from_messages([    ("system", """你是一个专业的研究员。你的任务是搜索和收集与主题相关的信息。【工作方式】1. 使用搜索工具进行多角度搜索2. 收集至少5个不同来源的信息3. 整理成结构化的研究报告4. 标注信息来源【输出格式】## 核心发现(3-5个最重要的发现)## 详细数据(具体的数据、事实、引用)## 趋势分析(当前趋势和未来展望)## 信息来源(列出所有引用的来源)"""),    MessagesPlaceholder(variable_name="chat_history", optional=True),    ("human", "{input}"),    MessagesPlaceholder(variable_name="agent_scratchpad"),])researcher_agent = create_tool_calling_agent(    llm=llm,    tools=[search_tool],    prompt=researcher_prompt)researcher_executor = AgentExecutor(    agent=researcher_agent,    tools=[search_tool],    verbose=False,    max_iterations=5)def researcher_node(state: AgentState):    """研究员节点"""    topic = state["messages"][-1].content    result = researcher_executor.invoke({"input": f"请深入研究以下主题:{topic}"})    return {        "research_data": result["output"],        "messages": [HumanMessage(content=f"研究完成:{result['output'][:200]}...")]    }# ===== 写手Agent =====writer_prompt = ChatPromptTemplate.from_messages([    ("system", """你是一个专业的技术写手。你的任务是根据研究资料撰写高质量的文章。【写作要求】1. 文章结构清晰:引言、正文(分3-5个小节)、结尾2. 语言生动接地气,避免AI腔3. 适当使用类比和故事4. 数据引用要准确5. 字数1500-2000字【写作风格】- 像朋友聊天一样自然- 可以有个人观点和感受- 适当用第一人称- 避免"首先、其次、最后"这种结构"""),    ("human", "研究资料:\\{research_data}\\\\请根据以上资料写一篇文章。")])def writer_node(state: AgentState):    """写手节点"""    research_data = state["research_data"]    chain = writer_prompt | llm    result = chain.invoke({"research_data": research_data})    return {        "draft": result.content,        "messages": [HumanMessage(content=f"初稿完成,约{len(result.content)}字")]    }# ===== 编辑Agent =====reviewer_prompt = ChatPromptTemplate.from_messages([    ("system", """你是一个严格的编辑。你的任务是审核文章质量。【审核标准】1. 内容准确性(是否有错误信息)2. 结构清晰度(逻辑是否通顺)3. 语言质量(是否有AI腔、套话)4. 可读性(是否有趣、吸引人)【输出格式】## 评分(每项10分)- 内容准确性:X/10- 结构清晰度:X/10- 语言质量:X/10- 可读性:X/10## 主要问题(列出2-3个最需要改进的问题)## 修改建议(具体、可操作的修改建议)## 总分XX/40## 结论APPROVED(总分>=30且每项>=6) 或 NEEDS_REVISION(需要修改)"""),    ("human", "请审核以下文章:\\{draft}")])def reviewer_node(state: AgentState):    """编辑节点"""    draft = state["draft"]    chain = reviewer_prompt | llm    result = chain.invoke({"draft": draft})    return {        "review_feedback": result.content,        "messages": [HumanMessage(content=f"审核完成:{result.content[:200]}...")]    }

第三步:定义流程和条件

from langgraph.graph import StateGraph, ENDdef should_revise(state: AgentState):    """判断是否需要修改"""    iteration = state.get("iteration_count", 0)    # 最多修改3次    if iteration >= 3:        return "finalize"    feedback = state.get("review_feedback", "")    if "APPROVED" in feedback.upper():        return "finalize"    else:        return "revise"def revise_node(state: AgentState):    """修改节点:根据编辑反馈修改文章"""    draft = state["draft"]    feedback = state["review_feedback"]    revise_prompt = ChatPromptTemplate.from_messages([        ("system", "你是一个专业写手。请根据编辑反馈修改文章。保持原有风格,只修改被指出的问题。"),        ("human", "原文:\\{draft}\\\\编辑反馈:\\{feedback}\\\\请修改文章。")    ])    chain = revise_prompt | llm    result = chain.invoke({"draft": draft, "feedback": feedback})    return {        "draft": result.content,        "iteration_count": state.get("iteration_count", 0) + 1,        "messages": [HumanMessage(content=f"第{state.get('iteration_count', 0) + 1}次修改完成")]    }def finalize_node(state: AgentState):    """最终输出节点"""    return {        "final_output": state["draft"],        "messages": [HumanMessage(content="文章最终完成!")]    }

第四步:组装成图

# 创建图workflow = StateGraph(AgentState)# 添加节点workflow.add_node("researcher", researcher_node)workflow.add_node("writer", writer_node)workflow.add_node("reviewer", reviewer_node)workflow.add_node("revise", revise_node)workflow.add_node("finalize", finalize_node)# 设置入口workflow.set_entry_point("researcher")# 添加边workflow.add_edge("researcher", "writer")workflow.add_edge("writer", "reviewer")# 条件边:根据审核结果决定下一步workflow.add_conditional_edges(    "reviewer",    should_revise,    {        "revise": "revise",    # 需要修改        "finalize": "finalize"  # 审核通过    })workflow.add_edge("revise", "reviewer")  # 修改后再审核workflow.add_edge("finalize", END)       # 完成# 编译app = workflow.compile()

第五步:运行!

# 运行多Agent写作系统result = app.invoke({    "messages": [HumanMessage(content="2026年AI Agent的发展趋势")],    "research_data": "",    "draft": "",    "review_feedback": "",    "final_output": "",    "iteration_count": 0})# 输出最终文章print("=" * 50)print("最终文章:")print("=" * 50)print(result["final_output"])# 查看迭代次数print(f"\\迭代次数: {result['iteration_count']}")

运行后,你会看到三个Agent自动协作:研究员搜索资料 -> 写手根据资料写初稿 -> 编辑审核 -> 如果有问题退回修改 -> 最终输出。整个过程完全自动。

五、进阶:并行Agent

上面的例子是串行的(一个接一个)。但很多时候,Agent可以并行工作,大幅提升速度。

比如,研究员可以同时搜索多个主题:

from langgraph.graph import StateGraph, ENDimport asyncio# 并行研究多个子主题async def parallel_research(state):    topics = state["sub_topics"]  # ["市场规模", "技术趋势", "应用场景"]    async def research_one_topic(topic):        result = researcher_executor.invoke({"input": topic})        return result["output"]    # 并行执行    results = await asyncio.gather(        *[research_one_topic(t) for t in topics]    )    return {"research_data": "\\\\".join(results)}# 在LangGraph中,只要从同一个节点出发有多条边指向不同节点,# 这些节点就会并行执行workflow.add_node("parallel_research", parallel_research)workflow.add_edge("parallel_research", "writer")

我用并行方式处理那个100家竞品分析的任务,10个Agent同时搜索,速度提升了将近10倍。

六、调试技巧

多Agent系统比单Agent复杂得多,调试是个挑战。几个实用技巧:

1. 给每个Agent的输出加日志

def researcher_node(state):    print(f"[研究员] 开始研究...")    result = researcher_executor.invoke(...)    print(f"[研究员] 完成,输出{len(result['output'])}字")    return {"research_data": result["output"]}

2. 限制迭代次数

多Agent系统最容易出的问题就是无限循环。一定要设置最大迭代次数。

3. 可视化流程

LangGraph支持可视化:

# 生成流程图from langchain_core.runnables.graph import MermaidDrawMethodgraph_image = app.get_graph().draw_mermaid_png(    draw_method=MermaidDrawMethod.API)with open("workflow.png", "wb") as f:    f.write(graph_image)

七、什么时候该用多Agent

多Agent不是万能的。以下情况适合用:

  • 任务可以拆解:大任务能分成多个独立的小任务
  • 需要不同专长:不同Agent可以有不同的工具和知识
  • 追求速度:并行执行能大幅缩短时间
  • 需要质量把控:有专门的审核Agent

以下情况没必要用:

  • 任务简单,一个Agent就能搞定
  • Agent之间有复杂的依赖关系,难以并行
  • 预算有限(多Agent消耗更多token)

八、真实效果对比

我用同一个任务(写一篇2000字的AI趋势分析文章)对比了单Agent和多Agent:

指标 单Agent 多Agent(串行) 多Agent(并行)
完成时间 约5分钟 约12分钟 约8分钟
内容质量 ★★★☆☆ ★★★★☆ ★★★★☆
数据引用 3-5个 8-12个 8-12个
Token消耗 约8000 约15000 约15000
迭代次数 1-2次 1-2次

多Agent的优势在于质量,不在于速度(除非用并行)。Token消耗大约是单Agent的2倍,但质量提升明显。

如果你已经熟悉了单Agent的搭建,多Agent是自然的下一步。从两个Agent开始(比如研究员 + 写手),跑通了再加第三个。别一上来就搞5个Agent,调试起来会让你怀疑人生。

更多关于Agent搭建的基础知识,可以参考 LangChain搭建AI Agent详细步骤。如果你想看Agent在实际业务中的应用,可以看看 AI Agent多场景落地案例详解

霓虹码农
霓虹码农

白天写代码,晚上调Agent,相信AI不会取代程序员——但会取代不会用AI的程序员