1. 先看清楚:这份手册到底在讲什么
Anthropic 前不久把自己内部沉淀的 AI 原生软件开发手册公开了出来,这事儿在技术圈里讨论度很高。我身边很多人的第一反应是:这不就是把 Claude Code 的使用心得整理了一下吗?等真正细读之后才发现,人家是把“怎么组织一个 AI 原生开发团队”这件事儿掰开揉碎了讲,从单个智能体的任务设计,到多智能体协作、上下文工程、代码审查机制,甚至团队流程都覆盖了。这篇文章就是基于这份公开手册,结合我自己用 Claude Code 和类似工具做项目落地的经历,把里面的核心思路、实操要点和踩坑记录都整理一遍,适合正在搭 AI 原生开发流程的工程师、技术负责人,也适合对 AI Agent 编程感兴趣的从业者。
1.1 手册的背景:为什么一家 AI 公司要公开自己的工程实践
Anthropic 自己的产品团队,日常开发里大量使用 Claude 系列模型来写代码,这本身就是一种很典型的“dogfooding”——自己吃自己家的狗粮。把内部手册公开,背后有很明显的行业引导意图:随着 AI 编程工具的使用越来越普及,大量开发者的用法其实还停留在“把 Copilot 当高级自动补全”或者“让 AI 一口气生成整个文件”的阶段,结果往往是表面热闹,代码质量却参差不齐。Anthropic 想通过这份手册告诉开发者,AI 编程的正确姿势不是让 AI 替你拍板,而是重新设计整个开发流程,让模型的能力和人的判断力在每一个环节各司其职。
从我个人的观察来看,这份手册选择公开的时机也很妙。Claude Code 这类 AI Agent 工具已经在真实项目里跑出了效果,但业内对“AI 会不会让软件开发失控”的担忧依然存在。公开内部最佳实践,既是在回应这种担忧,也是在给 AI 原生开发这个新物种立规矩。手册里没有故作高深的理论,全是工程团队在高压迭代中总结出来的硬经验,这一点特别难得。
1.2 核心思想:AI 原生开发不等于“让 AI 帮你写代码”
很多人对“AI 原生软件开发”的理解有一个误区,觉得只要在 IDE 里装一个 AI 插件,让模型帮你补全函数、生成测试,就算 AI 原生开发了。实际上,传统辅助编程模式下,人是主导者,AI 是补全工具;而真正的 AI 原生开发模式里,人和 AI 更像是一对紧密协作的搭档。人的核心工作变成了拆任务、定边界、审结果;AI 的核心工作则是写实现、写测试、做验证。整个流程的起点不再是“写代码”,而是“定义任务”——把需求翻译成模型能准确理解的、边界清晰的任务描述。
为什么要做这种转变?因为大模型在“理解宏大目标”和“做长期规划”这两件事上依然不可靠,但在“按明确指令实现一个边界清晰的小功能”这件事上,速度和完成度已经远超人类平均水平。与其让 AI 去做它不擅长的大方向决策,不如把人从重复劳动中解放出来,去盯真正需要判断力的事情。这个思想贯穿了手册的始终,也是后面所有具体方法的地基。
2. 关键实践一:把任务拆分到 AI 能“一口吃下”
2.1 为什么任务拆分是 AI 原生开发的第一课
大模型没有真正的“全局记忆”和“长期规划”能力,如果你丢给它一个“帮我做一个电商后台”这种级别的需求,它大概率会生成一个看起来结构完整、实际上到处是占位符和假数据的答案。而如果你把需求拆成“实现用户列表的查询接口,支持分页、关键字搜索、状态过滤,并补上单元测试”这样的单个任务,它的完成度会立刻高一个档次。Anthropic 手册里反复强调的一个原则就是 atomic,也就是让每个智能体任务都保持原子性,小到一次改动可以被完整理解和审查。
这里可以打个比方:你带团队的时候,不会让一个新来的实习生“负责整个项目”,而是会告诉他“先把这 20 个用户的资料从 Excel 里整理出来,按模板清洗完交给我”。任务越具体,执行者越容易交付好结果。AI 也是一样,它本质上是一个能力很强但缺乏常识校对的执行者,你给它的任务描述越精确,它跑偏的概率就越低。
2.2 任务描述模板:目标、约束、上下文、验收标准
在我实际用下来,一个合格的任务描述至少应该包含四块内容,缺一块都容易出问题:
- 任务目标:用一句话说清楚要做什么,明确写入的代码文件路径。
- 约束条件:技术栈要求、代码风格、禁止做的事项,避免 AI 自由发挥走样。
- 输入材料:告诉 AI 应该先读哪些文件,比如接口文档、类型定义、相关模块的现有实现。
- 验收标准:可执行的测试、代码检查命令,或者明确的行为指标,方便判断任务是否真正完成。
举个例子,假设要做一个用户角色管理模块,我会把它拆成四个独立任务,而不是一次性丢给 AI。
任务一:定义 Role 数据模型与迁移脚本。约束:使用 TypeScript + Prisma,字段包含 name、code、description、status,默认状态为 enabled。上下文:先读 prisma/schema.prisma 和 src/modules/user/user.model.ts。验收标准:运行npx prisma migrate dev --name add_role成功,且生成的文件里不含 any 类型。
任务二:实现角色 CRUD API。约束:RESTful 风格,使用项目已有的统一响应包装,权限注解使用 @RequirePermission。上下文:参考 src/modules/user/user.controller.ts 的写法,接口路径统一以 /api/roles 开头。验收标准:新增测试文件通过npm run test:role,覆盖增删改查和非法参数校验。
任务三:实现角色管理前端页面。约束:React + Ant Design,表格展示、弹窗编辑、状态开关,文案使用中文。上下文:读 src/pages/user 下的页面结构和 src/api/role.ts(如果还没有就按 user 的 api 文件风格创建)。验收标准:npm run build通过,页面能完成角色的增删改查。
任务四:接入权限控制中间件,确保只有 admin 角色能操作角色管理相关接口。约束:不改动已有的认证逻辑,只在路由层增加角色校验。上下文:读 src/middleware/auth.ts 和 src/router/index.ts。验收标准:用非 admin 身份调用接口返回 403,并有测试覆盖。
每个任务独立交给 AI 执行,一次只盯着一个目标,比让它一口气做完整个模块可靠得多。实测下来,这种拆分方式让 AI 生成代码的一次通过率明显提升,出错后定位问题也快很多。
2.3 任务拆分的粒度到底怎么把握
拆分粒度没有绝对标准,但有一个经验可以参考:如果 AI 为了完成任务需要读取超过十个文件,或者改动范围横跨多个模块,说明任务还是太大了。反过来,如果任务描述本身超过五百字,里面塞进了太多背景说明,也说明它可能违背了“原子性”原则。理想的状态是:一个任务里,AI 只需要读两三个核心文件,改动控制在几十行到一百行左右,改动逻辑能被你在五分钟内完整审视一遍。
不过这里也要提醒一句,任务拆得过细同样有问题。如果你把一个函数拆成“先写第一行到第十行”“再写第十一行到第二十行”这种粒度,AI 会因为没有全局视角而写出前后不一致的代码。合理的做法是让它完成一个“功能闭环”——比如“实现某个接口 + 对应测试”,既不大到失控,也不小到只见树木不见森林。
3. 关键实践二:上下文工程是 AI 原生开发的地基
3.1 项目记忆:用 CLAUDE.md 把约定固化下来
Claude Code 有一个很实用的机制:每次启动时会自动读取项目根目录下的 CLAUDE.md 文件,把它作为基础上下文注入给模型。这个文件相当于 AI 的“入职培训手册”,你可以把项目的技术栈、目录结构、编码规范、常用命令、需要避免的坑全都写进去。很多团队忽略了这个文件的威力,实际上它才是保证 AI 输出稳定性的核心配置。
我自己的一个项目里,CLAUDE.md 是这样写的:
# 项目约定 - 技术栈:Node.js 20 + TypeScript + Fastify + Prisma,禁止使用 any - 代码风格:遵循 .eslintrc 配置,提交前运行 npm run lint - 目录结构:src/modules 下按业务模块组织,每个模块包含 controller/service/repo 三层 - 数据库变更:必须通过 Prisma Migration 提交,禁止手改数据库 - 接口规范:统一返回 { code, data, message },错误码在 src/common/codes.ts 中定义 - 测试要求:新增接口必须附带单元测试,测试文件放在同目录 __tests__ 下这份文件写好之后,AI 生成的代码风格基本能和团队其他成员保持一致,减少了大量人工纠正的返工。需要注意的是,CLAUDE.md 不是写一次就完事的,它应该像团队规范文档一样持续迭代,每当发现 AI 反复犯同一类错误时,就把它写进这份文件里,让下一次会话不再踩同一个坑。
3.2 按需注入上下文:别把整个仓库丢给 AI
很多开发者在使用 AI 编程时有一个坏习惯:觉得模型是万能的,于是把整个代码仓库的路径丢给它,让它“自己看着办”。结果模型在无关文件里迷路,生成的代码风格与项目现有代码严重割裂,甚至会引用不存在的函数。Anthropic 手册里特别强调了上下文按需注入的原则:你给 AI 的上下文应该像数据库查询结果一样精准,只包含完成任务所必需的信息。
在实际操作中,我会在任务描述里明确写清楚让 AI 读哪些文件、参考哪些现有实现。比如“先读 src/modules/user/user.service.ts 了解现有的分页写法,然后按同样风格实现角色模块的 service”,而不是让它自己满仓库找。这样做还有一个额外好处:减少上下文噪音后,模型的注意力更集中,输出质量显著提升,响应速度也更快。说到底,上下文窗口虽然越来越大,但“塞满”不等于“用好了”,精挑细选的上下文才是工程级的做法。
3.3 上下文污染与长会话失效问题
AI 编码过程中最让人头疼的一个问题,是长会话里模型越往后越“糊涂”,甚至开始反复修改已经确认过的代码。这种情况通常不是模型变笨了,而是上下文污染——早期对话里留下的试探性错误、中途被推翻的方案、无关的调试输出,都在持续占用模型注意力并制造误导。一个有效的手段就是:当会话开始变得混乱时,果断开新会话,把关键任务描述、CLAUDE.md 约定和必要的上下文用干净的语言重新组织再交给模型,而不是在旧会话里继续“拉扯”。
我在团队里推广这套做法时,有个同事问过一句很实在的话:怎么判断该不该开新会话?我的经验是,当你发现模型开始重复提及你已经否定过的方案,或者修改一个函数时牵动了一大片无关代码,就说明上下文已经脏了,这时候重启一个干净会话,往往比继续纠缠更省时间。这个习惯培养起来之后,团队整体使用 AI 的效率上了一个台阶。
4. 关键实践三:原子化修改与可审查的 AI 编码流
4.1 为什么“增量修改”比“整文件生成”更可靠
让 AI 一次性生成一个几百行的大文件,看起来效率很高,但后续维护成本往往让人崩溃。原因在于,整文件生成时模型缺少对现有代码的精读,很容易把既有逻辑改坏,或者生成大量与项目风格不符的代码。Anthropic 内部实践非常强调增量修改:每次只让 AI 修改一个明确范围内的代码,优先复用现有函数和模式,而不是推倒重来。这条经验我深有体会,有一次让 AI 重写一个订单状态机的处理模块,结果它把我精心设计的并发控制逻辑全部删掉了,换成了它认为“更简洁”的写法,后果就是线上出现了重复提交的 bug。
所以后来的规则就变成:默认只允许 AI 在不改变现有接口签名和核心流程的前提下做增量修改。如果要动核心逻辑,必须先提交一份修改计划,等人工确认后再执行。这样虽然多了一道交互,但带来的安全感和可控性远超那点效率损失。
4.2 工作流:让 AI 先生成计划,再动手改代码
这里分享一个很实用的工作流,可以让 AI 的改动风险大幅降低。第一步,先让 AI 进入计划模式,用自然语言描述它准备怎么改、会涉及哪些文件、有没有隐患,先输出一个改动方案。第二步,人对这个方案做审查,发现方案里夹带私货或者思路不对,就直接打回重写。第三步,方案确认后,再让 AI 正式执行修改,并且明确要求它在改动后运行相关的测试命令。
这套流程看起来多了一次交互,实际用下来反而很快。因为 AI 在最开始就明确了思路,执行阶段跑偏的概率大幅降低,人工审查成本也小了。尤其是改动涉及核心业务逻辑时,这一步绝对不能省。我在项目里用过一条咒语式的指令,效果很好:先分析当前代码结构和潜在风险,输出一个最小改动方案,经过我确认后再实施。改动必须保持现有接口兼容,并补充或更新相关测试。实测下来,AI 生成的代码质量比直接让它改要稳定得多。
4.3 结合 git:把 AI 的改动当作“代码评审候选人”对待
AI 生成的代码,本质上是一个“候选人提交”,必须经过和人类同事一样的代码评审流程才能进入主干分支。因此,git 工作流的配合就变得格外重要。我在团队里规定了几个强制动作:AI 的改动必须单独开分支;提交时要用规范的 commit message,说明改了什么、为什么改;合并前必须通过 CI 检查和人工评审。这些动作看起来很基础,但很多团队正是因为省略了它们,才让 AI 生成的坏代码悄悄溜进了主干。
另外值得竖起招牌推荐的是,让 AI 自己参与代码评审。我会把 AI 本次产生的 diff 交给同一个或另一个模型实例,让它以资深工程师的口吻审查这段代码,指出潜在问题。这种“AI 写、AI 审、人拍板”的流程,能在早期拦截掉大量低级错误,比如遗漏的边界条件、不合理的异常处理、风格不一致等问题。当然,AI 的评审意见不能全信,但它提供的视角往往能覆盖人类 reviewer 容易忽略的细节。
5. 多智能体协作:从单点到系统
5.1 什么时候需要多智能体
单个 AI Agent 的能力再强,也没法在一个上下文窗口里同时处理几十个相互依赖的任务。当项目规模发展到一定程度,任务之间又存在清晰的边界时,就可以考虑引入多智能体协作。Anthropic 手册里提到的做法是:由一个主代理负责理解整体需求和任务编排,把具体的子任务分发给若干专职的子代理去执行,最后再由主代理汇总结果。这种“主管 + 专员”的结构,其实和人类团队的组织方式非常像。
不过我想先泼一盆冷水:如果你的项目还停留在“让 AI 写个脚本、补个测试”的阶段,完全没必要上多智能体。多智能体带来的编排成本、上下文传递损耗和协调复杂度都是真实代价,只有任务量大到单代理根本忙不过来,或者任务之间存在明显的专业分工时,它才划算。我见过有些团队为了追热点,硬是把一个简单功能拆给三个子代理做,结果光是把需求传清楚就花了一下午,效率反而暴跌。
5.2 子代理的定义与编排思路
在 Claude Code 里,子代理是通过 markdown 文件定义的,放在.claude/agents/目录下。文件里通过 frontmatter 声明子代理的名称、职责描述、可用工具,正文则是更详细的角色设定和工作要求。主代理会根据任务描述,动态选择把任务路由给哪个子代理。
举个例子,下面是一个前端子代理的定义:
--- name: frontend-specialist description: 负责 React 组件开发、样式调整和前端页面实现,适合处理 UI 相关编码任务 tools: Read, Edit, Write, Grep, Bash --- 你是一名资深前端工程师,专注 React + TypeScript 技术栈。 1. 组件开发时,必须遵循项目 design system 中定义的样式规范。 2. 优先使用项目已有的通用组件,禁止重复造轮子。 3. 任何 UI 改动完成后,必须运行 `npm run test:ui` 确保测试通过。 4. 组件 props 需要设计合理的默认值,并对必填项做运行时校验。定义好子代理之后,主代理的任务描述里只要包含“这个任务交给前端专家处理”的意图,路由机制就会自动匹配到对应的子代理。整体上,这种“一号多代理”的编排方式可以让每个子代理都保持高度专注的上下文,不会因为做了太多跨领域的事而变糊涂。
5.3 多智能体协作的实际效果与风险
多智能体协作在并行处理相互独立的模块时效果非常明显。比如前端页面、后端接口、数据模型这三个模块,如果都依赖同一个底层设计,让一个智能体串行完成会耗费很多时间;但拆给三个子代理并行开发,主代理只负责接口对齐,整体交付速度可以提升数倍。我实际做过一次对比,一个中等规模的管理后台,单代理串行大概跑了四个小时,多代理并行只用了不到一个半小时,而且最终代码的模块边界更清晰。
但风险同样存在,最典型的是“上下文漂移”:各个子代理只知道自己的局部目标,容易忽略全局设计,导致最终合入时出现接口对不上的问题。缓解办法是让主代理在每个子代理开工前,统一发一份“接口契约”文档,明确各模块之间的交互协议,并且在汇总时做一次全量集成测试。还有一点要特别注意,多智能体协作时的修改冲突比人类协作更隐蔽。AI 子代理在修改同一个文件时,可能会互相覆盖彼此的改动,所以一定要通过 git 分支把不同子代理的工作隔离开,最后再做合并。
6. 团队落地与常见问题排查
6.1 如何把这套实践沉淀为团队规范
手册里的方法论,只有落到团队流程里才有意义。我自己在推进团队转型时,总结了几个比较顺的落地步骤。第一步是做试点,挑一两个边界清晰、风险可控的中小型需求,用完整的人工智能原生开发流程走一遍,让全团队直观感受效果。第二步是沉淀模板,把任务描述模板、CLAUDE.md 模板、子代理配置模板整理成团队规范文档,统一放进去,形成自己的“内部手册”。第三步是定红线,明确哪些场景不允许 AI 直接操作,比如生产环境配置、数据库结构变更、核心资金链路逻辑,这些必须人工处理。
还有一个很容易被忽视的点:把“如何写好任务描述”当成一种新技能来培养。不少工程师刚开始接触这种开发模式时,最不适应的就是“写需求比写代码还费劲”。但一旦习惯了,你会发现这个能力本身就是产品价值的一部分。我们团队每周五有个小复盘,专门讨论这周哪些任务描述写得糟糕、哪些写得精彩,三个月下来,大家的 AI 使用水平普遍提升了一个档次。
6.2 AI 生成结果不达标的排查路径
经常有人问我,AI 生成的代码不靠谱怎么办。这里要给一个系统化的排查思路,而不是头痛医头。先判断是不是任务描述本身有问题:任务目标不清晰、验收标准缺失、上下文给错,都会导致结果跑偏。再判断是不是上下文问题:该读的文件没读,读了一堆无关文件,或者会话历史里积累了太多错误信息。最后判断是不是工具配置问题:CLAUDE.md 缺失、子代理定义不合理、测试命令没配置正确,都会影响输出质量。
为了方便团队排查,我做了一张简单的速查表:
| 现象 | 可能原因 | 排查与解决方向 |
|---|---|---|
| 生成的代码和现有风格不一致 | CLAUDE.md 缺失或内容不够具体 | 完善项目约定,加入代码风格和目录结构说明 |
| 改动了不该动的文件 | 任务描述边界不清晰 | 重新定义任务范围,明确“只允许修改哪些文件” |
| 连续几次修改都在原地打转 | 上下文污染或长会话失效 | 开新会话,重新写干净的任务描述 |
| 生成的代码跑不起来,缺依赖 | 验收标准里没有定义运行命令 | 在任务描述中明确列出测试和构建命令 |
| 多代理协作后接口对不上 | 缺少统一的接口契约 | 预先把接口协议文档发给所有子代理 |
排查时要记住一个原则:AI 出错通常不是“模型变笨了”,而是它获得的信息和指令有问题。把问题归因到“信息流”上,解决起来会顺畅很多。
6.3 效率与质量的平衡:AI 原生开发加速的临界点
AI 原生开发会让效率明显提升,但提升幅度并不是线性的。我自己的体会是,任务越标准、越琐碎,AI 的效率优势越明显;任务越需要高屋建瓴的架构判断,AI 的参与价值就越低。所以一个成熟的团队,会把工作分成三六九等:重复性高、规则明确的工作大量交给 AI;复杂度中等的任务让 AI 出初稿、人工做把关;真正决定系统走向的核心架构设计,还是保留给资深工程师人工完成。
另外还要提一个反直觉的观察:AI 编码能让一个团队的“生产力下限”大幅提高,但对“生产力上限”的提升有限。换句话说,一个普通水平的开发者可以用 AI 写出超过他平时水平的代码,但一个资深架构师靠 AI 写出来的代码,并不会比他亲自写的强多少。所以团队负责人不要把 AI 当成神,它更像是一个可以让全员水平向“平均线以上”拉齐的杠杆。想清楚这一点,你在任务分配和团队培养上才不会走偏。
最后再分享一个小技巧:这套方法论的落地,不一定非要严格的 Claude Code 环境。市面上主流的 AI 编程工具,执行力都大差不差,核心差异往往在对上下文的理解和编排能力上。你完全可以把这套任务描述、上下文管理、原子化修改的思路,平移到任何 AI 辅助编程工具里。根据我的实际经验,思路对了,工具只是放大器;思路错了,换再贵的工具也很难救回来。