Skip to content

Agent 进阶(五)多智能体(下):用 LangGraph 搭一个团队

🕒 Published at:

上一篇讲清了"为什么要拆"和"主管-专员"模式。这一篇动手,把一个真正能协作的多智能体团队搭出来。好消息是:LangChain 官方提供了现成的封装 langgraph-supervisor,几十行就能跑起来,不用从零手写调度逻辑。Python 为主,Node 思路在文末说明。

先回顾:我们要搭什么

一个"差旅助手"团队:一个主管负责派活和汇总,两个专员各管一摊——机票专员、酒店专员。用户说一句「帮我查下去上海的航班,顺便看看那边的酒店」,主管会自动把"查航班"派给机票专员、"查酒店"派给酒店专员,最后把两边结果汇总成一条回复。

关键点回顾:每个专员本身就是一个完整的 Agent(就是入门系列里的 create_agent),只不过它工具精简、提示词专注。主管则是站在这些 Agent 之上的"调度层"。

第一步:装依赖

bash
pip install -U langgraph-supervisor langchain langgraph langchain-openai

第二步:造两个"专员" Agent

每个专员就是一个普通的 create_agent,重点是两件事:工具只给它该管的name 给它起个名字(主管靠这个名字点将派活)。

python
import os
from langchain.agents import create_agent
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI

model = ChatOpenAI(
    model="qwen-plus",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    temperature=0,
)

@tool
def search_flight(city: str) -> str:
    """查询到某城市的航班信息。"""
    return f"到{city}今天有 3 个航班,最早 08:00。"

@tool
def search_hotel(city: str) -> str:
    """查询某城市的酒店信息。"""
    return f"{city}市中心有 5 家可订酒店,均价 400 元。"

# 机票专员:只给机票工具,提示词只谈机票
flight_expert = create_agent(
    model=model,
    tools=[search_flight],
    system_prompt="你是机票专员,只负责航班相关的查询,别的不用管。",
    name="flight_expert",          # ← 主管靠这个名字派活
)

# 酒店专员:只给酒店工具
hotel_expert = create_agent(
    model=model,
    tools=[search_hotel],
    system_prompt="你是酒店专员,只负责住宿相关的查询。",
    name="hotel_expert",
)

第三步:造"主管",把专员组成团队

主管用 create_supervisor 创建:把专员列表交给它,再写一段提示词告诉它"你负责调度谁"。最后 .compile() 编译成一个可运行的对象。

python
from langgraph_supervisor import create_supervisor

supervisor = create_supervisor(
    agents=[flight_expert, hotel_expert],
    model=model,
    prompt=(
        "你是差旅助手的主管。你自己不查询,只负责理解用户需求、"
        "把任务派给合适的专员(flight_expert 管机票、hotel_expert 管酒店),"
        "并在最后把各专员的结果汇总成一段完整回复。"
    ),
).compile()

# 用起来和普通 Agent 一样:传消息、拿结果
result = supervisor.invoke({
    "messages": [{"role": "user", "content": "帮我查下去上海的航班,顺便看看那边的酒店"}]
})
print(result["messages"][-1].content)

运行时到底发生了什么

跑起来后,这段对话在背后是这样流转的:

text
用户:帮我查下去上海的航班,顺便看看那边的酒店
  → 主管:这句话既要机票又要酒店,先派给 flight_expert
      → 机票专员:调用 search_flight("上海") → "有 3 个航班……"
  → 主管:再派给 hotel_expert
      → 酒店专员:调用 search_hotel("上海") → "有 5 家酒店……"
  → 主管:两边都回来了,汇总成一段完整回复给用户

你会发现,主管本身没调用任何业务工具,它的工作就是"读懂需求 → 决定派给谁 → 收集结果 → 汇总"。而每个专员只在自己的一亩三分地里干活,工具少、职责清,所以又快又准。这正是上一篇说的"专业团队"落了地。

它比"一个大 Agent"好在哪,用起来注意什么

好处很直观:每个专员的提示词和工具都聚焦,选错工具、演错角色的概率大大降低;想加一个"租车专员",只要再写一个 Agent 挂到主管名下,其它人完全不受影响,扩展性极好;调试时也能一眼看出是哪个专员出的问题。

注意点也要记住:多智能体每一步都可能多过一次模型(主管决策也要花模型调用),所以延迟和成本比单 Agent 高;另外主管的提示词很关键,要把"每个专员管什么"说清楚,否则它可能派错人。还是那句话——简单任务别硬拆,这套是给"确实复杂"的场景用的。

Node 侧:LangGraph 有 JavaScript 版(@langchain/langgraph),多智能体同样能实现——既可以用官方的 supervisor 封装,也可以用 StateGraph 手工把"主管节点 + 专员节点"连起来。封装的名字和参数以官方文档为准,但"主管派活、专员干活"的结构和上面完全一致。

小结

这一篇你用 langgraph-supervisor 把"主管 + 专员"真正跑了起来:专员是聚焦的 create_agent(用 name 标识),主管用 create_supervisor 负责派活汇总。核心心法是"分工"——让每个 Agent 只做它最擅长的一件事。

RAG 和多智能体让 Agent"更准、更强"。下一篇换个角度:怎么让 Agent 别再一个个手写工具,而是像插 USB 一样接入海量现成能力——这就是最近很火的 MCP 协议