Appearance
上一篇讲清了"为什么要拆"和"主管-专员"模式。这一篇动手,把一个真正能协作的多智能体团队搭出来。好消息是: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 协议。