主题
从单 Agent 到多 Agent
1. 先从一个最常见的场景开始
你有没有试过让同一个助手同时帮你做几件事:查一下上周聊过的项目、改一下明天会议提醒、再顺手回一封语气正式的邮件?
一开始它都能办。你只需要把任务说清楚,它自己会判断要先查记忆、再写提醒、最后组织语言。但渐渐地,你开始加更多规则:涉及敏感内容要先做安全校验;客户邮件要用特定语气;如果提到旧项目,必须优先查长期记忆而不是瞎编。
终于有一天,你发现它开始“顾此失彼”:该查的资料没查,该温柔的回复变得生硬,该走校验流程的环节被跳过了。问题不是它变笨了,而是你把太多不同性质的判断,塞进了同一个大脑。
这就是从单 Agent 走向多 Agent 的典型过程。
2. 单 Agent 是怎么工作的
先把「单 Agent」想成一个总负责人。
用户的话先交给这一个 Agent,它负责做全部判断:
- 理解用户在问什么
- 判断需不需要调用工具
- 如果需要,自己去调工具
- 拿到结果后,决定下一步
- 最后生成回复
代码层面,它通常长这样:
typescript
import { createAgent, tool } from "langchain";
import * as z from "zod";
const searchMemory = tool(
async ({ query }) => `用户上周提到的项目是「数据同步优化」`,
{
name: "search_memory",
description: "从历史记忆中搜索信息",
schema: z.object({ query: z.string() }),
},
);
const createReminder = tool(
async ({ title, time }) => `已创建提醒:${time} ${title}`,
{
name: "create_reminder",
description: "创建提醒事项",
schema: z.object({ title: z.string(), time: z.string() }),
},
);
const agent = createAgent({
model: "openai:gpt-4.1-mini",
tools: [searchMemory, createReminder],
systemPrompt: "你是一个任务助手,回答要自然、简洁。",
});
const result = await agent.invoke({
messages: [
{
role: "user",
content: "提醒我明天上午十点开会,再告诉我上周那个项目叫什么。",
},
],
});
console.log(result.messages.at(-1)?.content);这套结构很好理解。所有事情都交给一个 Agent,它像一个“总控台”:既负责理解意图,也负责决定工具,还负责把最终结果说出来。刚开始做项目时,这种方式最省事。
3. 为什么很多项目一开始都应该先用单 Agent
新手最容易犯的错误,是还没把需求做清楚,就先把系统拆得很复杂。
如果你的系统目前只做这些:
- 陪用户聊天
- 查历史记忆
- 写提醒事项
- 偶尔查天气
那单 Agent 完全够用。原因很直接:
第一,链路短。 用户发消息后,通常只需要一两次工具调用就能结束。
第二,状态少。 大部分信息都能放在当前对话上下文里,不需要跨步骤保存中间状态。
第三,开发成本低。 只要维护一个 Agent 的角色、Prompt 和工具列表。
第四,排查容易。 输出不对时,只需检查一个 Agent 的 Prompt、输入、工具结果和模型回复。
这个阶段的结构大致是:
txt
用户请求
-> 单 Agent
-> 判断意图
-> 调用记忆工具
-> 调用日程工具
-> 生成回复4. 单 Agent 从什么时候开始吃力
单 Agent 不是不能做复杂事,而是事情一多,它会越来越像一个什么都要管的全能员工。
如果继续往下加需求:
- 消息先要做安全检查
- 然后判断是聊天、记忆写入还是日程请求
- 提到旧话题要先查长期记忆
- 涉及提醒要走日程写入
- 敏感话题要切换特殊回复策略
问题就出现了:
问题 1:职责太多。 一个 Agent 同时承担分类、路由、安全判断、工具调度、最终回复生成。Prompt 越来越长,工具越来越多。
问题 2:知识太杂。 它既要知道怎么安抚情绪,又要知道怎么查记忆,还要知道什么时候写日程。每一类任务的规则堆在一起,模型更容易判断失误。
问题 3:排查变难。 结果不对时,很难立刻判断是分类错了、工具选错了、记忆没取对,还是最后生成回复时把信息说乱了。
问题 4:流程变长。 有些请求不再是一问一答,而是多步骤流程:先做安全检查,再做意图判断,再决定是否查记忆,再决定是否写入外部系统,最后才生成回复。
到了这个阶段,继续让一个 Agent 全包,代码还能写,但系统会越来越别扭。
这里要分清两件事:
- 流程本身变复杂了:最先出现的是编排和状态管理问题。比如步骤怎么排序,中间结果怎么保存,某一步失败后从哪里继续。
- 职责是否真的需要拆开:如果只是流程长了一点,但仍然可以由一个 Agent 清楚处理,那未必需要立刻上多 Agent。先把工作流和状态管理理顺,问题往往已经解决一大半。
5. 多 Agent 不是更高级,而是开始分工
很多人第一次听到“多 Agent”,会误以为重点是“让系统更聪明”。其实更准确的说法是:多 Agent 的重点是分工。
还是刚才那套需求,如果改成多 Agent,可以拆成这样:
- 一个
router agent:判断消息属于哪一类任务 - 一个
memory agent:专门处理记忆检索和写入 - 一个
schedule agent:专门处理日程和提醒 - 一个
reply agent:负责最后的回复输出
这时每个 Agent 只管自己最擅长的一部分。拆开后,最大的变化不是“每个 Agent 都更强”,而是系统结构变清楚了:谁负责分类、谁负责查历史、谁负责写外部系统、谁负责面向用户说话。
用户请求先进入路由节点,再被分发给不同专职 Agent。处理完后,结果汇总回来。多 Agent 更像是把一个大而全的总负责人,拆成几个职责明确的小角色。
不过不要理解得太绝对。当单 Agent 变重时,常见的演进方向之一确实是多 Agent。但不是所有复杂问题都必须拆成多个独立 Agent。有些项目只是工具变多了,或者流程变长了,这时先做更清晰的工作流编排、工具分组、上下文裁剪,也可能够用。
所以这一节想说明的是:
- 当职责明显混在一起时,可以考虑多 Agent
- 当问题主要是流程长、状态多时,先把编排问题解决清楚
6. 怎么判断该停在单 Agent,还是进入多 Agent
这里不讲抽象判断,直接看工程里的几个信号。
先用单 Agent 更合适的情况:
- 工具数量不多,通常在 3 到 5 个以内
- 大多数请求能在一轮内处理完
- 没有特别复杂的状态流转
- 当前最重要的目标是先把产品跑起来
开始考虑多 Agent 的情况:
- 一个 Agent 的 Prompt 已经越来越长
- 工具越来越多,模型经常选错工具
- 一条请求经常要经过多个阶段
- 不同类型任务混在一起,代码越来越难维护
- 你需要单独观察某一个角色或某一类任务的表现
这不是二选一的价值判断,而是系统规模变化后的自然结果。
单 Agent 更像一个“全能助手”。多 Agent 更像一个“分工明确的小团队”。项目早期,先把全能助手做好,通常更稳。项目长到一定阶段,再把它拆成团队,才有意义。
7. 一句话总结
单 Agent 是绝大多数项目的最佳起点;只有当职责混杂、流程变长、排查困难时,才需要把它拆成职责明确的多 Agent 团队。
下一步我们会继续把边界讲清楚:
LangChain主要负责把「单个 Agent + 多工具」这条主线搭起来LangGraph更适合承接「多 Agent + 状态流转 + 多步骤流程」这类系统问题
8. 参考资料
- LangChain 官方文档. LangChain Agents and Tools. https://python.langchain.com/
- LangGraph 官方文档. LangGraph Multi-Agent Workflows. https://langchain-ai.github.io/langgraph/
- Anthropic. Building effective agents. https://www.anthropic.com/engineering/building-effective-agents