LangGraph 多智能体编排实战:从单 Agent 到团队协作

为什么需要多 Agent 协作?

单 Agent 在处理简单任务时表现不错,但面对需要多个专业领域知识的复杂问题时,往往会力不从心。就像你不能指望一个全栈工程师独立完成数据库设计、前端开发和运维监控一样,单个 LLM Agent 也应该把不同职责交给专门的子 Agent。

LangGraph 是 LangChain 推出的一个基于图结构的工作流编排框架,专门为多 Agent 系统设计。与传统的线性链式调用不同,它允许 Agent 之间有循环、分支和条件判断,更接近真实世界的业务流程。

架��设计:三位一体的 Agent 团队

在本文中,我们将构建一个技术知识库问答系统,包含三个角色:

  • Researcher Agent:负责搜索知识库中的相关文档
  • Writer Agent:根据搜索结果撰写结构化的回答
  • Reviewer Agent:审查回答质量,决定是否通过或返回修改

这个设计与 Java 后端技术栈中的微服务分工理念 有异曲同工之妙——每个组件只做好一件事。

代码实现

from langchain_core.messages import HumanMessage, AIMessage
from langgraph.graph import StateGraph, MessagesState
from typing import TypedDict

# 定义工作流状态
class AgentState(TypedDict):
    messages: list
    confidence: float
    review_rounds: int

# Researcher Node
def researcher_node(state: AgentState):
    research_prompt = """You are a technical knowledge base researcher.
Search for relevant documentation about the user's query.
Return all findings as structured notes."""
    messages = state["messages"] + [
        {"role": "system", "content": research_prompt}
    ]
    # 实际项目中接入向量检索
    response = {"role": "assistant", "content": "Found 3 relevant documents..."}
    return {"messages": messages + [response]}

# Writer Node
def writer_node(state: AgentState):
    write_prompt = """Based on the research findings, compose
a clear and well-structured answer to the user's question."""
    messages = state["messages"] + [
        {"role": "system", "content": write_prompt}
    ]
    response = {"role": "assistant", "content": "Here is your answer..."}
    return {"messages": messages + [response]}

# Reviewer Node
def reviewer_node(state: AgentState):
    review_prompt = """Review the generated answer for accuracy,
completeness, and readability. Return approve or revise."""
    messages = state["messages"] + [
        {"role": "system", "content": review_prompt}
    ]
    # 模拟评分
    confidence = 0.85
    return {"confidence": confidence, "review_rounds": state.get("review_rounds", 0) + 1}

# 构建图
workflow = StateGraph(AgentState)
workflow.add_node("researcher", researcher_node)
workflow.add_node("writer", writer_node)
workflow.add_node("reviewer", reviewer_node)

# 设置入口
workflow.set_entry_point("researcher")
workflow.add_edge("researcher", "writer")
workflow.add_edge("writer", "reviewer")

# 条件边:根据审查结果决定下一步
def route_review(state: AgentState):
    if state["confidence"] >= 0.8 and state.get("review_rounds", 0) < 3:
        return "final"
    return "revise"

workflow.add_conditional_edges(
    "reviewer", route_review,
    {"final": None, "revise": "writer"}  # None = 结束
)

app = workflow.compile()

运行工作流

result = app.invoke({
    "messages": [{
        "role": "user",
        "content": "如何理解 Spring Boot 中的 Bean 生命周期?"
    }]
})
print(result["messages"][-1]["content"])

关键要点总结

  1. 循环机制:Reviewer 不通过时可以返回 Writer 重新写,这在线性链中无法实现
  2. 状态共享:messages 列表在所有节点间传递,后一个节点能看到之前的全部上下文
  3. 退出条件:通过 confidence 和 review_rounds 控制迭代上限,避免无限循环

如果你的项目涉及 CI/CD 流程自动化,可以参考我们的 DevOps CI/CD 工具对比文章来选择合适的流水线方案。多 Agent 系统中的每个 Agent 都可以看作一个自动化的微服务单元。

LangGraph 的核心价值在于「把复杂决策逻辑显式化」——不是黑盒式的 Prompt 堆叠,而是可观测、可调试、可重现的代码化工作流。这在 Docker 容器化部署中同样适用:每个容器只负责一件事,容器之间的依赖关系由编排文件清晰定义。

上一篇 Docker 容器化部署实战:从安装到上线全流程
下一篇 Vercel SDK for Python:非 JS 技术栈的 LLM 集成指南