多智能体(Multi-Agent)编排实战:用LangGraph构建生产级AI系统

当单一Agent的能力边界日益明显,多智能体协作成为构建复杂AI系统的必经之路。本文将深入剖析多智能体架构模式,并通过LangGraph框架构建一个完整的代码审查流水线,展示如何在生产环境中落地多智能体系统。


一、引言

过去两年,大语言模型(LLM)驱动的AI Agent已经从概念验证走向了生产应用。然而,随着业务场景复杂度的提升,单一Agent的局限性逐渐暴露:上下文窗口有限、职责过于宽泛导致推理质量下降、难以处理需要多步协作的复杂任务流。

多智能体(Multi-Agent)系统应运而生。其核心思想并不新颖------"分而治之"在软件工程中早已被反复验证。将一个复杂任务拆解为多个专注于特定子任务的Agent,通过编排层进行协调,不仅能提升单项任务的执行质量,还能带来更好的可观测性和可维护性。

在众多多智能体框架中,LangGraph凭借其基于有向图的状态机模型、对人机交互(Human-in-the-Loop)的原生支持以及与LangChain生态的深度集成,成为构建生产级多智能体系统的优选方案。本文将从架构模式出发,逐步深入到LangGraph的核心机制,最终通过一个完整的代码审查流水线实战,帮助读者掌握多智能体系统的设计与实现。


二、多智能体架构模式

在设计多智能体系统之前,理解主流的架构模式至关重要。不同的模式适用于不同的场景,选错模式往往意味着后期大量的返工。

2.1 Supervisor模式(主管模式)

Supervisor模式是最直观也最常用的多智能体架构。一个中心化的"主管"Agent负责接收用户请求,将任务分发给下属的Worker Agent,收集结果并进行汇总。

其工作流程如下:

  1. 用户请求进入Supervisor Agent
  2. Supervisor分析任务,决定调用哪个Worker
  3. Worker执行具体任务并返回结果
  4. Supervisor根据结果决定是否需要继续分发,或汇总输出

这种模式的优势在于控制流清晰,Supervisor掌握全局上下文,便于做全局决策。劣势则是Supervisor本身可能成为瓶颈------当Worker数量增多时,Supervisor需要理解所有Worker的能力边界,提示词会变得臃肿,推理质量也会随之下降。

适用场景:Worker数量在5个以内、任务分发逻辑相对明确的场景,例如客服系统中的意图识别与分发。

2.2 Hierarchical模式(层级模式)

层级模式可以看作Supervisor模式的递归扩展。当系统中Agent数量较多时,引入多层级的管理结构:顶层Supervisor管理若干中层Supervisor,中层Supervisor再管理各自的Worker Agent。

这种树状结构天然地解决了单一Supervisor的能力瓶颈问题。每一层只需要关注其直接下属的能力,极大降低了单个Agent的认知负荷。

适用场景:大型复杂系统,例如端到端的软件开发流水线------顶层编排器协调"需求分析组"、"开发组"、"测试组",每个组内部又有各自的Agent分工。

2.3 Swarm模式(群体智能模式)

Swarm模式打破了中心化的控制结构。在这种模式下,没有固定的"主管",Agent之间可以直接进行对等通信,通过"移交"(Handoff)机制将控制权从一个Agent转移到另一个Agent。

OpenAI在2024年开源的Swarm框架让这种模式广为人知。其核心机制非常简洁:每个Agent定义自己的指令和工具,其中某些工具的返回值是另一个Agent对象,触发控制权的转移。

Swarm模式的优势在于灵活性极高,Agent之间的协作关系可以动态变化。但也正因如此,系统的行为变得难以预测和调试,不适合对确定性要求较高的生产场景。

适用场景:探索性任务、开放域对话等对灵活性要求高于确定性的场景。

2.4 模式选型建议

维度 Supervisor Hierarchical Swarm
控制流确定性
扩展性
实现复杂度
可观测性
推荐Agent数量 2-5 5-20 3-10

在实际项目中,混合使用多种模式是常见的做法。例如,顶层采用Supervisor模式保证控制流的确定性,某个子模块内部采用Swarm模式保留灵活性。


三、LangGraph核心概念

LangGraph是LangChain团队推出的Agent编排框架,其核心抽象是状态图(StateGraph)。理解以下几个核心概念,是使用LangGraph构建多智能体系统的前提。

3.1 State(状态)

State是贯穿整个图执行过程的共享数据结构。所有Node读取和修改的都是同一份State。在LangGraph中,State通常使用TypedDict或Pydantic模型定义:

python 复制代码
from typing import TypedDict, Annotated
from langgraph.graph.message import add_messages

class AgentState(TypedDict):
    messages: Annotated[list, add_messages]
    current_file: str
    review_results: list[dict]
    final_report: str

注意Annotated[list, add_messages]这个写法------add_messages是一个reducer函数,它告诉LangGraph当多个节点都向messages字段写入时,应该采用追加而非覆盖的策略。Reducer机制是LangGraph处理并发写入冲突的核心手段。

3.2 Node(节点)

Node是图中的计算单元,通常是一个Python函数或一个可调用对象。每个Node接收当前State作为输入,返回需要更新的State字段:

python 复制代码
def code_review_node(state: AgentState) -> dict:
    """代码审查节点:调用LLM对当前文件进行审查"""
    messages = state["messages"]
    current_file = state["current_file"]
    # ... 调用LLM进行审查
    return {
        "messages": [AIMessage(content=review)],
        "review_results": [{"file": current_file, "review": review}]
    }

3.3 Edge(边)

Edge定义了Node之间的转移关系。LangGraph支持两种边:

  • 普通边:无条件转移,A执行完毕后必定执行B
  • 条件边:根据当前State动态决定下一个要执行的Node
python 复制代码
def route_after_review(state: AgentState) -> str:
    """根据审查结果决定下一步"""
    results = state["review_results"]
    if any(r["severity"] == "critical" for r in results):
        return "human_review"  # 转入人工审核
    return "generate_report"   # 直接生成报告

graph.add_conditional_edges(
    "code_review",
    route_after_review,
    {"human_review": "human_review", "generate_report": "report_generator"}
)

3.4 子图(Subgraph)

LangGraph支持将一个完整的StateGraph作为另一个图的Node嵌入,这是实现Hierarchical模式的基础。子图拥有自己的独立状态空间,通过输入/输出映射与父图通信:

python 复制代码
# 定义子图
review_subgraph = StateGraph(ReviewState)
# ... 添加节点和边

# 将子图作为节点嵌入主图
main_graph.add_node("review_pipeline", review_subgraph.compile())

四、实战:构建代码审查流水线

接下来我们用LangGraph构建一个多智能体代码审查流水线。该系统包含三个专业Agent:代码风格检查Agent、安全漏洞扫描Agent和逻辑审查Agent,由一个Supervisor Agent负责编排。

4.1 定义状态与Agent

python 复制代码
import operator
from typing import TypedDict, Annotated, Literal
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
from langgraph.graph import StateGraph, END, START

# 定义全局状态
class ReviewState(TypedDict):
    messages: Annotated[list, operator.add]
    code_snippet: str
    style_review: str
    security_review: str
    logic_review: str
    final_report: str
    next_agent: str

# 初始化LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# 代码风格检查Agent
def style_checker(state: ReviewState) -> dict:
    prompt = f"""你是一位资深的代码风格审查专家。请审查以下代码的风格问题,
包括但不限于:命名规范、代码格式、注释质量、函数长度等。
仅输出风格相关的问题,不要涉及安全或逻辑问题。

代码:
{state['code_snippet']}"""

    response = llm.invoke([SystemMessage(content="你是代码风格审查专家。"),
                           HumanMessage(content=prompt)])
    return {
        "style_review": response.content,
        "messages": [AIMessage(content=f"[风格检查完成] {response.content}")]
    }

# 安全漏洞扫描Agent
def security_scanner(state: ReviewState) -> dict:
    prompt = f"""你是一位安全审计专家。请扫描以下代码中的安全漏洞,
包括但不限于:SQL注入、XSS、敏感信息泄露、不安全的依赖等。
给出风险等级(高/中/低)和修复建议。

代码:
{state['code_snippet']}"""

    response = llm.invoke([SystemMessage(content="你是安全审计专家。"),
                           HumanMessage(content=prompt)])
    return {
        "security_review": response.content,
        "messages": [AIMessage(content=f"[安全扫描完成] {response.content}")]
    }

# 逻辑审查Agent
def logic_reviewer(state: ReviewState) -> dict:
    prompt = f"""你是一位资深软件工程师。请审查以下代码的逻辑正确性,
包括但不限于:边界条件处理、异常处理、算法正确性、性能隐患等。

代码:
{state['code_snippet']}"""

    response = llm.invoke([SystemMessage(content="你是代码逻辑审查专家。"),
                           HumanMessage(content=prompt)])
    return {
        "logic_review": response.content,
        "messages": [AIMessage(content=f"[逻辑审查完成] {response.content}")]
    }

4.2 构建Supervisor与编排图

python 复制代码
# Supervisor:汇总所有审查结果,生成最终报告
def supervisor(state: ReviewState) -> dict:
    prompt = f"""你是代码审查团队的负责人。以下是三位专家的审查结果,
请汇总生成一份结构化的代码审查报告,包含:
1. 总体评价(通过/需修改/拒绝)
2. 关键问题列表(按严重程度排序)
3. 改进建议

风格审查结果:
{state.get('style_review', '未完成')}

安全审查结果:
{state.get('security_review', '未完成')}

逻辑审查结果:
{state.get('logic_review', '未完成')}"""

    response = llm.invoke([SystemMessage(content="你是代码审查团队负责人。"),
                           HumanMessage(content=prompt)])
    return {
        "final_report": response.content,
        "messages": [AIMessage(content=f"[最终报告] {response.content}")]
    }

# 构建状态图
workflow = StateGraph(ReviewState)

# 添加节点
workflow.add_node("style_checker", style_checker)
workflow.add_node("security_scanner", security_scanner)
workflow.add_node("logic_reviewer", logic_reviewer)
workflow.add_node("supervisor", supervisor)

# 定义边:三个审查Agent并行执行,全部完成后进入Supervisor
workflow.add_edge(START, "style_checker")
workflow.add_edge(START, "security_scanner")
workflow.add_edge(START, "logic_reviewer")
workflow.add_edge("style_checker", "supervisor")
workflow.add_edge("security_scanner", "supervisor")
workflow.add_edge("logic_reviewer", "supervisor")
workflow.add_edge("supervisor", END)

# 编译图
app = workflow.compile()

4.3 运行流水线

python 复制代码
# 待审查的代码
code = """
def get_user(request):
    user_id = request.GET.get('id')
    query = f"SELECT * FROM users WHERE id = {user_id}"
    result = db.execute(query)
    return JsonResponse({'user': result[0]})
"""

# 执行审查
result = app.invoke({
    "code_snippet": code,
    "messages": [HumanMessage(content="请审查以下代码")],
    "style_review": "",
    "security_review": "",
    "logic_review": "",
    "final_report": "",
    "next_agent": ""
})

print(result["final_report"])

上面这段待审查代码包含了一个典型的SQL注入漏洞(字符串拼接构造SQL查询)、缺少异常处理(直接访问result[0]可能越界)以及代码风格问题(缺少类型注解和文档字符串)。三个专业Agent会分别从各自的角度识别这些问题,最终由Supervisor汇总为一份完整的审查报告。

这种架构的核心价值在于关注点分离。每个Agent只需要精通自己的领域,提示词可以写得更加精确和专业,审查质量远高于让一个通用Agent处理所有维度。


五、生产部署注意事项

从Demo到生产,多智能体系统需要跨越几个关键的工程门槛。

5.1 状态持久化与容错

LangGraph内置了Checkpointer机制,支持将每一步的State快照持久化到外部存储(如PostgreSQL、Redis)。当某个Agent执行失败时,系统可以从最近的Checkpoint恢复,而不需要从头开始执行。

python 复制代码
from langgraph.checkpoint.postgres import PostgresSaver

checkpointer = PostgresSaver.from_conn_string("postgresql://...")
app = workflow.compile(checkpointer=checkpointer)

# 执行时指定thread_id,用于状态隔离
config = {"configurable": {"thread_id": "review-001"}}
result = app.invoke(initial_state, config=config)

在生产环境中,务必为每次执行分配唯一的thread_id,确保不同请求之间的状态完全隔离。

5.2 Human-in-the-Loop

对于高风险决策,引入人工审核环节是必要的。LangGraph通过interrupt_before机制原生支持这一模式:

python 复制代码
app = workflow.compile(
    checkpointer=checkpointer,
    interrupt_before=["supervisor"]  # 在Supervisor执行前暂停
)

# 第一次执行:到达supervisor前暂停
result = app.invoke(initial_state, config)

# 人工审核中间结果后,继续执行
result = app.invoke(None, config)  # 传入None表示继续

5.3 可观测性

多智能体系统的调试难度远高于单Agent系统。建议从以下几个维度建设可观测性:

  • 追踪(Tracing):使用LangSmith或OpenTelemetry记录每个Agent的输入输出、Token消耗和延迟。LangGraph与LangSmith的集成开箱即用,只需设置环境变量即可。
  • 日志分级:为不同层级的Agent设置不同的日志级别。Supervisor层使用INFO级别记录决策过程,Worker层使用DEBUG级别记录详细的推理步骤。
  • 指标监控:关注端到端延迟、单Agent延迟、Token消耗、失败率等核心指标。当某个Agent的延迟突然升高时,往往意味着提示词需要优化或上游数据质量出了问题。

5.4 成本控制

多智能体系统的LLM调用次数是单Agent的数倍,成本控制不可忽视:

  • 模型分级:不是所有Agent都需要使用最强的模型。风格检查等相对简单的任务可以使用gpt-4o-mini,将gpt-4o留给逻辑审查等需要深度推理的任务。
  • 缓存策略 :对于相同或相似的输入,利用语义缓存避免重复调用。LangChain生态中的GPTCache等工具可以在这方面提供帮助。
  • 并行执行:如上文示例所示,相互独立的Agent应当并行执行,以减少端到端延迟。LangGraph的图调度器会自动识别可并行的节点。

5.5 测试策略

多智能体系统的测试需要分层进行:

  • 单元测试:为每个Agent编写独立的测试用例,mock掉LLM调用,验证提示词模板和输出解析逻辑。
  • 集成测试:验证Agent之间的通信和状态传递是否正确,重点测试边界条件和异常路径。
  • 评估测试(Eval):准备一批标注好的测试用例,定期运行端到端评估,跟踪系统整体质量的变化趋势。LangSmith提供了完善的Eval工具链。

六、总结

多智能体系统并非银弹,它带来能力提升的同时也引入了额外的复杂度。在决定是否采用多智能体架构之前,建议先问自己两个问题:单一Agent是否真的无法满足需求?拆分后的收益是否大于引入的复杂度?

如果答案是肯定的,那么本文介绍的方法论可以作为参考:

  1. 根据任务特征选择合适的架构模式(Supervisor / Hierarchical / Swarm)
  2. 用LangGraph的StateGraph建模Agent之间的协作关系
  3. 充分利用并行执行、状态持久化、Human-in-the-Loop等机制
  4. 在可观测性、成本控制和测试策略上投入足够的工程资源

多智能体编排仍然是一个快速演进的领域。LangGraph在2025年的多次重大更新中引入了对长时运行任务、远程Agent(A2A协议)的支持,进一步拓展了多智能体系统的应用边界。保持对新模式和新工具的关注,在实践中不断迭代,才是构建生产级AI系统的正确姿态。


本文代码基于LangGraph 0.3.x版本,完整示例代码已托管至GitHub。如有疑问,欢迎在评论区交流。

相关推荐
chaors2 小时前
从零学RAG0x0c:AdvancedRAG检索优化-混合检索
langchain·llm·ai编程
Baihai IDP2 小时前
OpenClaw 架构详解 · 第一部分:控制平面、会话管理与事件循环
人工智能·ai·llm·agi
怕浪猫3 小时前
第4章 提示工程基础:Prompt Templates
langchain·llm·ai编程
arvin_xiaoting4 小时前
AI Agent 实战:用飞书任务卡片让后台任务「可见」
人工智能·自动化·llm·飞书·ai agent·openclaw·任务卡片
吴佳浩4 小时前
OpenClaw Windows 完整卸载
人工智能·llm·agent
Shawn_Shawn11 小时前
mcp学习笔记(三)-Mcp传输协议代码示例
llm·agent·mcp
sg_knight14 小时前
如何用 Claude Code 做大型项目重构与架构优化
java·重构·架构·llm·claude·code·claude-code
Baihai_IDP15 小时前
OpenClaw 架构详解 · 第一部分:控制平面、会话管理与事件循环
人工智能·面试·llm
San30.15 小时前
深入浅出 RAG 与向量数据库:从 Milvus 基础到电子书级语义搜索实战
数据库·人工智能·langchain·llm·milvus·rag