LangGraph 进阶:Supervisor 模式——让 LLM 当项目经理,动态调度多 Agent 协作
本文介绍 LangGraph 中最灵活的编排模式——Supervisor。一个"经理 Agent"根据任务进展动态决策下一步派谁干活,彻底解放静态路由。附带 DeepSeek 思考模型踩坑实录。
GitHub 项目地址:https://github.com/binbin3828/langgraph_demo/demo8_demo8_supervisor.py
一、从静态路由到动态编排
回顾前面 6 个 Demo,图的结构都是写死的:
Demo1: START → classify → [tech | billing | general] → END (静态分叉) Demo2: START → A → B → C → D → END (固定串行) Demo5: START → A → B → C ──(失败)──→ D → A (固定循环) Demo6: START → [并行 N 个] → 汇总 → END (固定 Map-Reduce)这些图的共同特征:边的走向在你写代码时就定死了。
但实际项目中,复杂任务往往需要灵活决策——做完调研发现要补一段代码,写完代码发现文档也要更新,这些决策取决于中间结果,没法提前写死。
这就是 Supervisor 模式的用武之地。
一句话理解
Supervisor 模式 = 一个 LLM 驱动的"路由管理器"。每次子 Agent 干完活回来,Supervisor 重新审视全局状态,动态决定"下一步派谁、干什么",直到任务完成。
二、Supervisor 模式的图结构
┌──────────────┐ │ Supervisor │ ← 每次子Agent干完活都回到这里 │ (经理Agent) │ └──────┬───────┘ │ 动态决策: 下一个派谁? ┌──────────────────────┼──────────────────────┐ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Researcher │ │ Coder │ │ Writer │ │ (研究员) │ │ (程序员) │ │ (文档员) │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ └──────────────────────┼──────────────────────┘ │ 干完活,回去报告 ▼ ┌──────────────┐ │ Supervisor │ ← 循环! └──────┬───────┘ │ 如果决定 FINISH ▼ ┌──────────────┐ │ Summarize │ ← 汇总所有成果 └──────┬───────┘ ▼ END关键特征:
- Supervisor 和子 Agent 之间形成循环——子 Agent 干完活必然回到 Supervisor
- 每次回到 Supervisor,LLM 重新审视全局状态,做出新一轮决策
- 直到 Supervisor 判断"任务完成"返回 FINISH,或者达到最大调度次数
三、完整代码拆解
3.1 State 设计
classSupervisorState(TypedDict):user_request:str# 用户原始需求messages:Annotated[list[str],reducer_list]# 所有Agent的工作记录(追加!)dispatch_count:int# 已调度次数(防死循环)next_agent:str# Supervisor的决策结果task_description:str# 给子Agent的任务描述final_response:str# 最终汇总回复messages用reducer_list追加而非覆盖——每个子 Agent 干完活往里面追加一条记录,Supervisor 下次决策时能看到所有历史。
3.2 Supervisor 节点:LLM 动态决策
defsupervisor(state:SupervisorState)->dict:# 拼接所有历史消息,让Supervisor看到全局进展history="\n".join(f"-{m}"forminstate["messages"])ifstate["messages"]else"暂无"prompt=f"""你是一个项目经理(Supervisor),负责协调团队完成用户需求。 你的团队有3个成员: - researcher: 研究员,擅长调研分析 - coder: 程序员,擅长写代码 - writer: 文档员,擅长写文档 用户需求: