1. 多 Agent 演变
天气 Agent 只适合回答天气相关建议,但「我明天出门要带什么?」还涉及个人习惯和同行人的需求。如果继续给天气 Agent 增加状态读取、记忆检索和最终清单职责,它会重新变成一个知道所有事情的巨大 Agent,上一篇建立的上下文隔离也会消失。
更合适的做法是让三个领域 Agent 分工:
| Agent | 独立上下文 | 可使用的能力 | 明确不负责 |
|---|---|---|---|
| 天气 Agent | 用户问题、天气工具结果 | 生产级天气子图 | 习惯与陪同人 |
| 习惯 Agent | 用户问题、当前 Agent 状态 | 读取本次运行状态 | 天气与长期记忆 |
| 陪同人 Agent | 用户问题、记忆检索结果 | 读取长期记忆 | 天气与个人习惯 |
它们都只返回领域结论,再由一个 Supervisor 对最终结果负责。
2. Supervisor
Supervisor 的职责是理解总目标、选择合适的子 Agent、准备委派任务、等待结果并解决重复或冲突。它不应该绕过天气 Agent 自己查天气,也不应该凭空补写记忆。
图中的每个子 Agent 都有自己的模型消息和工具范围。Supervisor 只接收它们最后返回的领域答案,因此天气子图里的坐标、重试和供应商错误不会占用主 Agent 的上下文。
3. 工具
在 Supervisor 模式中,子 Agent 常被包装成工具。工具描述告诉 Supervisor 什么时候应该委派,工具函数内部才真正调用对应 Agent。
1const weatherAgentTool = tool(2({ task }) => runWeatherSubagent(task),3{4name: 'ask_weather_agent',5description: '委派天气 Agent 查询可靠天气并给出携带建议',6schema: z.object({ task: z.string() }),7},8)
习惯 Agent 从当前 AgentState 读取习惯,陪同人 Agent 从长期记忆检索结果中工作。它们的工具输入都只有 task,具体数据由各自边界注入,而不是让 Supervisor 把整个全局状态复制给所有 Agent。
4. 并行委派
本案例要求 Supervisor 在同一轮调用三个工具。LangChain Agent 的 v1 工具节点会并发执行同一条模型消息中的多个工具调用,因此天气、习惯和陪同人三条支线可以同时工作。
1const supervisor = createAgent({2name: 'packing_supervisor',3model,4tools: [weatherAgentTool, habitAgentTool, companionAgentTool],5version: 'v1',6systemPrompt: '同一轮调用三个领域 Agent,结果返回后合并清单。',7})
并行只解决等待时间,不解决意见冲突。假设天气 Agent 建议带保温杯,习惯 Agent 也建议带水杯,Supervisor 需要合并重复项;如果一个 Agent 建议轻装,另一个要求携带药品,Supervisor 应把安全相关建议放在更高优先级,而不是随意删掉其中一个。