1. 从“养五个Agent”到“直接问Claude Code”的认知转变
1.1 一个让我彻底改变工作流的真实场景
去年有段时间,我特别痴迷于搭建多Agent协作系统。手头同时跑着五个Agent:一个负责需求拆解,一个负责代码生成,一个负责代码审查,一个负责测试用例编写,还有一个专门做文档整理。听起来很美好对吧?每个Agent各司其职,通过一个编排层串起来,理论上应该比单个Agent强得多。
结果呢?实际跑起来完全是另一回事。需求拆解Agent输出的任务描述,代码生成Agent理解偏了;代码审查Agent提出的修改意见,代码生成Agent又改出了新bug;测试Agent写的用例跟实际实现根本对不上。我花了大量时间在调prompt、调通信协议、调状态传递上,真正用来解决业务问题的时间反而少得可怜。
直到有一次,我试着把整个需求直接丢给Claude Code,让它自己规划、自己写、自己测、自己改。一个回合下来,它给出的结果比我那五个Agent折腾半天的产出还要完整、还要可用。那一刻我才意识到:我可能一直在用错误的方式解决问题。
这篇文章就是想把这段经历背后的思考完整地分享出来。如果你正在做Agent开发,或者正在纠结要不要上多Agent架构,又或者你只是想让LLM帮你更高效地完成工作,那接下来的内容应该能帮你少走不少弯路。我会从架构选型的底层逻辑讲起,拆解Claude Code这类工具为什么能在很多场景下“一个顶五个”,然后给出具体的实操方法和避坑经验。
1.2 多Agent架构的诱惑与陷阱
先说清楚,我不是要全盘否定多Agent架构。在某些场景下,多Agent确实是必要的。但问题在于,很多人(包括曾经的我)在根本不需要多Agent的场景下,硬上了多Agent。
为什么大家会倾向于多Agent?我总结下来有几个原因。第一是拟人化直觉:我们习惯了一个团队里不同角色分工协作,所以很自然地觉得AI也应该这样。第二是模块化思维:软件工程教我们要解耦、要单一职责,所以每个Agent只做一件事听起来很合理。第三是控制幻觉:把流程拆得越细,越觉得自己能掌控每一步。
但这些直觉在LLM场景下往往不成立。原因在于:LLM的能力边界和传统软件模块完全不同。一个传统函数只做一件事,是因为它只能做一件事。但一个LLM本身就能做很多事,你把它拆成五个,每个只做一件事,反而限制了它的能力发挥。
更关键的是,多Agent架构引入了一个巨大的成本:通信损耗。Agent之间传递信息时,每次都要把上下文重新编码成自然语言或结构化数据,接收方再重新理解。这个过程中信息会失真、会丢失、会引入歧义。你拆得越细,通信次数越多,损耗就越大。
我踩过的一个典型坑是:让一个Agent输出JSON格式的任务列表,另一个Agent解析这个JSON去执行。结果第一个Agent偶尔会输出格式不完全合法的JSON,第二个Agent解析失败就卡住了。为了解决这个问题,我又加了一个校验Agent,然后校验Agent和生成Agent之间又出现了新的协调问题。每加一个Agent,系统的复杂度不是线性增长,而是指数增长。
1.3 Claude Code这类工具的核心差异
那Claude Code这类工具为什么能“一个顶五个”?核心差异在于它把规划、执行、验证、修正都放在同一个上下文里完成。
传统的多Agent架构,每个Agent有自己的上下文窗口,Agent之间通过外部消息传递来协作。而Claude Code的工作方式是:它在同一个对话上下文中,先理解你的需求,然后自己规划步骤,自己执行(读写文件、运行命令),自己观察结果,自己判断是否成功,失败了就自己调整重试。
这个过程不需要跨Agent通信,所有信息都在同一个上下文里流动。它能看到自己上一步做了什么,能看到执行结果,能基于完整信息做下一步决策。这就像一个人从头到尾负责一件事,而不是五个人接力,每个人只知道自己那一棒。
另一个关键差异是工具使用的深度。Claude Code不是简单地生成代码文本,它可以直接操作文件系统、运行终端命令、查看运行结果。这意味着它的“执行-验证”闭环是真实的,不是模拟的。它写完代码可以真的跑一下,看到报错可以真的去改。这种能力在单Agent架构下反而更容易实现,因为不需要考虑“谁来执行”“执行结果怎么传回”这些问题。
还有一个容易被忽视的点:Claude Code的上下文管理策略。它会在长对话中自动压缩和整理上下文,保留关键信息,丢弃冗余内容。这个机制让它在处理复杂任务时不会因为上下文爆炸而崩溃。而多Agent架构下,每个Agent的上下文是独立的,你需要自己设计状态传递和持久化方案,复杂度高得多。
2. 什么场景该用单Agent,什么场景才需要多Agent
2.1 单Agent能搞定的四类典型任务
根据我的实际经验,以下四类任务用Claude Code这类单Agent工具就足够了,上多Agent纯属自找麻烦。
第一类是端到端的开发任务。比如“帮我写一个Python脚本,读取CSV文件,做数据清洗,然后输出统计报告”。这种任务有明确的输入输出,中间步骤虽然多但逻辑连贯,单Agent完全能hold住。它自己会规划先读文件、再清洗、再统计、再输出,不需要你拆成四个Agent。
第二类是探索性任务。比如“帮我看看这个代码库的结构,找出可能的性能瓶颈”。这种任务需要边看边判断,下一步做什么取决于上一步发现了什么。多Agent架构下你很难预先定义好每个Agent的职责和通信协议,而单Agent可以灵活地根据发现调整方向。
第三类是需要全局视野的任务。比如“重构这个模块,保持接口不变但提升可测试性”。重构需要同时理解现有代码、目标接口、测试要求,这些信息必须放在同一个上下文里才能做出合理决策。拆成多个Agent反而会导致每个Agent只看到局部,做出互相矛盾的决策。
第四类是快速迭代任务。比如“我有个想法,帮我快速搭个原型验证一下”。这种任务需要快速试错、快速调整,单Agent的“执行-观察-修正”闭环比多Agent的“规划-分配-汇总”流程快得多。
2.2 多Agent真正适用的三个场景
那什么时候才真的需要多Agent?我总结下来只有三种情况。
第一种是任务可以高度并行且互不依赖。比如你要同时分析十个不同的数据集,每个数据集的分析逻辑相同但数据不同。这时候可以起多个Agent并行处理,最后汇总结果。但注意,这种场景下Agent之间不需要通信,只是并行执行,本质上更接近“批量调用”而不是“多Agent协作”。
第二种是需要不同专业能力的任务。比如一个任务既需要写代码又需要做设计评审,而这两件事需要不同的prompt策略和知识背景。但这种场景下,我更倾向于用同一个Agent切换不同角色,而不是起两个独立Agent。因为角色切换的成本远低于Agent间通信的成本。
第三种是超长流程需要状态持久化。比如一个需要运行几天的任务,中间可能中断、需要恢复。这种场景下把状态拆到多个Agent里分别持久化,可能比单Agent维护一个巨大的上下文更可行。但这也带来了状态一致性的新问题,需要仔细设计。
除了这三种情况,我实在想不出还有什么场景非得多Agent不可。而且即使是这三种情况,也要仔细评估多Agent带来的复杂度是否值得。大多数时候,一个设计良好的单Agent加上合适的工具,比五个互相通信的Agent更可靠、更高效、更好维护。
2.3 一个判断框架:通信成本 vs 能力增益
我后来总结了一个简单的判断框架,帮你决定该用单Agent还是多Agent。
核心问题是:拆成多个Agent带来的能力增益,是否大于它们之间的通信成本?
能力增益来自哪里?来自每个Agent可以有自己的专属prompt、专属工具集、专属知识库。如果这些专属化带来的提升很大,那多Agent可能值得。
通信成本包括哪些?包括Agent间消息传递的token开销、信息在传递中的失真、协调逻辑的复杂度、调试和排查问题的难度、状态一致性的维护成本。
我的经验法则是:如果两个Agent之间的通信频率超过每轮一次,那它们大概率应该合并成一个Agent。因为高频通信意味着它们需要频繁共享上下文,那还不如放在同一个上下文里。
另一个法则是:如果拆出来的Agent数量超过三个,先停下来想想是不是设计有问题。三个以上的Agent,它们之间的通信路径会变得非常复杂,调试起来极其痛苦。
3. Claude Code实操:从安装到高效使用的完整路径
3.1 环境准备与安装要点
Claude Code的安装本身不复杂,但有几个细节如果没注意,后面会踩坑。
首先是Node.js版本。Claude Code需要Node.js 18以上,我建议直接用最新的LTS版本。安装命令很简单:
npm install -g @anthropic-ai/claude-code但这里有个坑:如果你之前装过旧版本,最好先卸载再装,避免版本冲突。卸载命令是npm uninstall -g @anthropic-ai/claude-code。
安装完成后,在项目目录下运行claude命令就能启动。第一次启动会引导你做认证配置。这里要注意的是,认证信息会保存在用户目录下,不同项目共享。如果你需要在不同环境用不同的配置,可以通过环境变量来覆盖。
对于VS Code用户,可以装Claude Code的VS Code扩展。装完之后在VS Code里直接调用,体验更顺畅。扩展的配置项里有一个比较重要的是“自动批准模式”,建议初期先关掉,等熟悉了它的行为再考虑开启。
还有一个容易被忽视的配置是项目级的配置文件。在项目根目录下创建.claude/settings.json,可以配置这个项目专属的行为,比如允许哪些命令、禁止哪些操作、用哪个模型等。这个文件建议纳入版本管理,让团队共享同一套配置。
3.2 让Claude Code真正理解你的项目
Claude Code刚启动时对你的项目一无所知。你需要帮它快速建立项目认知,否则它给出的建议会很泛泛。
最有效的方法是在项目根目录放一个CLAUDE.md文件。这个文件会被自动读取,作为项目的背景说明。内容应该包括:项目是做什么的、技术栈是什么、目录结构是怎样的、有哪些约定俗成的规范、常用的命令有哪些。
我自己的CLAUDE.md大概长这样:
# 项目说明 这是一个数据处理服务,用Python 3.11 + FastAPI。 # 目录结构 - src/api/ 接口层 - src/core/ 核心业务逻辑 - src/models/ 数据模型 - tests/ 测试 # 常用命令 - 运行测试:pytest tests/ - 启动服务:uvicorn src.main:app --reload - 代码检查:ruff check src/ # 约定 - 所有接口必须有类型注解 - 业务逻辑不直接操作数据库,通过repository层 - 提交前必须跑通测试这个文件不用写得很长,但关键信息要有。有了它,Claude Code在回答问题时就会结合你的项目实际情况,而不是给通用建议。
另一个技巧是在对话开始时先让它读几个关键文件。比如你可以说“先读一下src/core/processor.py和tests/test_processor.py,了解现有实现和测试风格”。这样它在后续生成代码时会模仿你现有的风格,而不是自创一套。
3.3 高效对话的五个实操技巧
用Claude Code时间长了,我总结出几个让效率翻倍的对话技巧。
第一个技巧是给上下文而不是给指令。不要只说“帮我写个函数”,而是说“我在src/core/processor.py里有个process_data函数,现在需要加一个功能:当数据量超过阈值时自动分批处理。现有代码是这样的……”。给它足够的上下文,它才能给出贴合你项目的方案。
第二个技巧是让它先规划再执行。对于复杂任务,先问“你打算怎么做”,看它的规划是否合理,确认后再让它执行。这样可以避免它跑偏了才被发现。比如你可以说“我要重构这个模块,你先说说你打算分几步做,每步做什么”。
第三个技巧是利用它的自我验证能力。Claude Code可以运行命令并看到结果。你可以让它“写完代码后跑一下测试,如果失败就自己修”。这样它会进入“写-测-修”的循环,直到测试通过。这比你自己反复检查高效得多。
第四个技巧是分阶段确认。对于大任务,不要一次性让它做完,而是分成几个阶段,每个阶段完成后你确认一下再继续。比如“先做数据层,做完告诉我,我确认后再做接口层”。这样可以及时纠偏,避免它沿着错误方向走太远。
第五个技巧是善用“解释模式”。当你看到它生成的代码不太理解时,直接问“解释一下这段代码为什么这么写”。它会给出推理过程,这既能帮你理解,也能帮你判断它的思路是否正确。
3.4 常见配置问题与排查
在实际使用中,我遇到过几个典型的配置问题,这里整理一下排查思路。
问题一:命令找不到或版本不对。通常是PATH问题或装了多个版本。排查方法是which claude看用的是哪个,claude --version看版本号。如果不对,检查npm的全局安装路径是否在PATH里。
问题二:认证失败。先检查网络连接是否正常,然后检查认证信息是否过期。重新运行认证流程通常能解决。如果还不行,检查是否有代理配置干扰。
问题三:在VS Code里无法调用。检查扩展是否安装、是否启用,检查VS Code的终端是否能正常运行claude命令。有时候是VS Code的终端环境变量和系统终端不一致导致的。
问题四:处理大项目时响应慢。这通常是因为上下文太大。可以通过.claude/settings.json配置忽略某些目录,比如node_modules、.git、构建产物目录等。减少无关文件的干扰能显著提升响应速度。
问题五:生成的代码风格和项目不一致。检查CLAUDE.md是否写清楚了项目规范,检查是否让它读了现有的代表性文件。如果还是不一致,可以在对话中明确说“请遵循src/core/processor.py的代码风格”。
4. 从多Agent迁移到单Agent的实战经验
4.1 迁移前的评估:哪些Agent可以合并
如果你已经有一套多Agent系统,想迁移到单Agent,第一步是评估哪些Agent可以合并。
我的评估方法是:画出Agent之间的通信图,找出通信最频繁的节点。通信最频繁的几个Agent,大概率应该合并成一个。因为它们本来就需要频繁共享上下文,分开反而增加了通信成本。
然后看每个Agent的职责。如果两个Agent的职责有重叠,或者一个Agent的输出直接是另一个Agent的输入且不需要人工干预,那它们也可以合并。
还要看每个Agent的prompt复杂度。如果一个Agent的prompt里大量在描述“如何与其他Agent协作”“收到什么格式的消息该怎么处理”,那这些协调逻辑在单Agent架构下根本不需要,合并后prompt会简单很多。
我自己的迁移过程是:先把五个Agent合并成两个——一个负责“理解需求+规划+生成”,一个负责“验证+修正”。然后发现这两个之间的通信也很频繁,干脆合并成一个。合并后系统反而更稳定了,因为不再有跨Agent的信息丢失问题。
4.2 迁移中的关键调整
迁移过程中有几个关键调整需要注意。
第一是prompt的重写。原来每个Agent的prompt是围绕“你是一个XX专家,负责XX”来写的,迁移后要改成“你是一个全能助手,需要完成从理解需求到验证结果的完整流程”。重点从“角色定义”转向“流程定义”。
第二是工具集的整合。原来每个Agent可能只配了部分工具,迁移后要把所有需要的工具都配上。但要注意,工具太多也会让Agent困惑,所以要精简,只保留真正需要的。
第三是状态管理的简化。原来多Agent架构下,状态可能分散在各个Agent里,通过消息传递来同步。迁移后所有状态都在同一个上下文里,不需要显式同步了。但要设计好上下文的组织方式,确保关键信息不会在长对话中被淹没。
第四是错误处理的调整。原来每个Agent可能有自己的错误处理逻辑,迁移后要统一成一套。核心思路是:让Agent自己判断是否出错、自己决定怎么重试、自己验证重试结果。你只需要在它反复失败时介入。
4.3 迁移后的效果对比
迁移完成后,我做了个简单的对比。
| 维度 | 多Agent架构 | 单Agent架构 |
|---|---|---|
| 任务完成率 | 约60% | 约85% |
| 平均耗时 | 较长(含通信开销) | 较短 |
| 调试难度 | 高(需追踪跨Agent调用) | 低(单上下文) |
| 维护成本 | 高(需维护多个prompt和通信协议) | 低 |
| 灵活性 | 低(流程固定) | 高(可动态调整) |
| 上下文利用率 | 低(每个Agent只看局部) | 高(全局视野) |
任务完成率的提升最明显。多Agent架构下,很多失败是因为信息在传递中丢失或失真。单Agent架构下,所有信息都在同一个上下文里,Agent能看到完整信息,决策质量自然更高。
调试难度的降低也很显著。多Agent出问题时,你需要追踪是哪个Agent出了问题、消息在哪个环节丢失了、是prompt问题还是通信问题。单Agent出问题时,你只需要看对话记录,定位问题快得多。
5. 常见问题与排查技巧实录
5.1 Claude Code使用中的典型问题
问题:Claude Code生成的代码能跑但不符合项目规范。
这个问题的根源通常是它没有充分理解你的项目规范。解决方法是在CLAUDE.md里明确写出规范,并且在对话开始时让它读几个符合规范的代表性文件。如果还是不行,可以在它生成代码后直接指出“这里不符合XX规范,请参考YY文件的写法修改”。
问题:处理复杂任务时中途跑偏。
复杂任务容易跑偏是因为上下文太长,早期的关键信息被淹没了。解决方法是在任务开始时把关键约束写在最前面,并且在每个阶段结束时让它总结一下“当前完成了什么、下一步要做什么、有哪些约束需要遵守”。这样能帮它保持方向。
问题:运行命令时权限不足或环境不对。
Claude Code运行命令用的是你当前的环境。如果命令需要特定权限或特定环境变量,要提前配置好。可以在.claude/settings.json里配置允许的命令列表,避免它执行危险操作。
问题:响应速度慢。
响应慢通常是上下文太大导致的。检查是否有大量无关文件被读取,检查对话历史是否太长。可以通过配置忽略目录、定期开启新对话来缓解。
问题:生成的代码有安全隐患。
这个要特别注意。Claude Code可能会生成包含硬编码密钥、SQL注入风险、不安全的反序列化等问题的代码。建议在CLAUDE.md里明确写出安全规范,并且在它生成代码后做安全审查。对于关键模块,不要完全依赖它自动生成,要人工审核。
5.2 多Agent架构的典型故障
故障:Agent之间消息格式不匹配。
这是最常见的故障。Agent A输出的是自然语言,Agent B期望的是JSON,结果B解析失败。解决方法是要么统一格式,要么在中间加一个格式转换层。但更好的解决方法是合并这两个Agent。
故障:某个Agent反复失败导致整个流程卡住。
多Agent架构下,一个Agent失败会影响下游所有Agent。如果失败处理没做好,整个流程就卡住了。解决方法是要么加超时和重试机制,要么让下游Agent能处理上游失败的情况。但根本解决方法还是减少Agent数量,降低故障面。
故障:状态不一致。
多个Agent各自维护状态,容易出现状态不一致。比如Agent A认为任务完成了,Agent B认为还没完成。解决方法是引入一个中心化的状态管理,但这又增加了复杂度。单Agent架构下根本不存在这个问题。
故障:调试时无法复现。
多Agent系统的行为受很多因素影响:每个Agent的prompt、通信顺序、消息内容、外部工具返回结果等。出问题时很难复现。单Agent架构下,你只需要看对话记录就能复现问题。
5.3 避坑清单与最佳实践
根据我的经验,整理一份避坑清单。
- 不要为了多Agent而多Agent。先问自己:单Agent真的搞不定吗?大多数时候答案是“搞得定”。
- Agent数量控制在三个以内。超过三个,通信复杂度会急剧上升。
- 优先考虑合并而不是拆分。两个Agent如果通信频繁,合并它们。
- 给Agent足够的上下文。上下文不足是Agent表现差的主要原因。
- 让Agent自己验证结果。不要依赖外部验证,让Agent自己跑测试、自己看结果、自己修正。
- 保持prompt简洁。prompt越长,Agent越容易迷失。把关键约束放在最前面。
- 定期审查Agent的行为。不要完全放手,定期看看它做了什么、有没有跑偏。
- 做好安全防护。限制Agent能执行的命令,审查它生成的代码,不要给它过大的权限。
6. 我对Agent架构的几点个人体会
6.1 简单往往比复杂更可靠
做了这么久Agent开发,我最大的体会是:简单往往比复杂更可靠。
多Agent架构看起来很优雅,每个Agent各司其职,像一支训练有素的团队。但实际运行起来,通信损耗、状态同步、错误传播这些问题会让系统变得极其脆弱。而单Agent架构虽然看起来“笨”一些,但它没有这些问题,反而更稳定。
这让我想起一个类比:多Agent就像微服务架构,单Agent就像单体架构。微服务在规模大了之后确实有优势,但在规模不大时,单体架构的开发效率、调试便利性、部署简单性都远胜微服务。Agent架构也是同样的道理。
6.2 工具能力比Agent数量更重要
另一个体会是:与其增加Agent数量,不如增强单个Agent的工具能力。
一个Agent如果有了文件读写、命令执行、网络请求、数据库操作这些工具,它能做的事情远超五个只会聊天的Agent。工具让Agent能真正“做事”,而不只是“说事”。
Claude Code之所以强,很大程度上是因为它的工具集很完整。它能读文件、写文件、运行命令、查看结果,这些能力让它能完成端到端的任务。如果你的Agent只能生成文本,那不管起多少个,能力上限都很低。
6.3 上下文质量决定输出质量
最后一个体会是:上下文质量决定输出质量。
同样的模型,给它不同的上下文,输出质量天差地别。给足项目背景、给足约束条件、给足参考示例,它的输出就会贴合你的需求。反之,如果只给一句简单的指令,它的输出就会很泛泛。
所以与其花时间设计多Agent架构,不如花时间优化给Agent的上下文。写好CLAUDE.md、在对话中提供充分的背景信息、让它读关键文件,这些投入的回报远高于搭建复杂的Agent协作系统。
6.4 一个实用的小技巧
最后分享一个我常用的小技巧:让Claude Code在完成任务后写一份“工作日志”。
具体做法是在任务结束时说“请总结一下你刚才做了什么、遇到了什么问题、怎么解决的、有什么经验可以沉淀”。它会输出一份结构化的总结。这份总结你可以保存下来,作为项目文档的一部分,也可以作为下次类似任务的参考。
这个技巧的好处是:一方面帮你快速了解它做了什么(不用翻整个对话记录),另一方面沉淀下来的经验可以在后续任务中复用。我自己的项目里就积累了几十份这样的工作日志,遇到类似问题时翻一翻,往往能找到现成的解决方案。
这个内容后续还可以这样扩展:把工作日志作为CLAUDE.md的一部分,让Claude Code在开始新任务前先读一下历史日志,这样它能借鉴之前的经验,避免重复踩坑。我试过几次,效果不错,尤其是在处理同一类任务时,它能明显更快地找到正确方向。