多智能体(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。如有疑问,欢迎在评论区交流。

相关推荐
漂流瓶jz2 小时前
【AI】大模型本地部署与量化:Ollama、transformers、llama.cpp实践
人工智能·llm·ai编程
张彦峰ZYF6 小时前
MCP 从“能连工具”到“像 Web 一样部署”——无状态核心、扩展框架与企业级 Agent 基础设施的真正分水岭
人工智能·llm·agent·mcp
Darling噜啦啦9 小时前
LLM 记忆管理三剑客:截断、总结、检索,彻底搞懂 Agent 的 Memory 系统
langchain·llm·agent
今日无bug9 小时前
大模型的回答是怎么一个字一个字蹦出来的?前端流式输出解析
前端·llm·agent
桃西西呀14 小时前
《牛来》票房涨 1000 倍是真的吗?——2026暑期档 124 亿里的数学
人工智能·数据分析·llm
tachibana215 小时前
如何设计多 Agent 的协作与动态切换机制?
网络·人工智能·ai·大模型·llm·agent
程序员三明治16 小时前
【体验毛坯房】Deep Harness 入门教程
java·人工智能·后端·大模型·llm·deepseek·dsh
桃西西呀17 小时前
AI 为什么一本正经地胡说八道?3 个底层原因 + 2 个防坑法
人工智能·llm·ai编程
阿黎梨梨17 小时前
AI也有记忆?LangChain Memory 管理指南
langchain·node.js·llm
武子康17 小时前
删掉邮箱后,Agent Trace 仍可能泄露什么:一条可重放脱敏流水线
人工智能·llm·agent