首页 / 资讯中心 / 文章详情

AI编程实践:从Claude Code子代理到团队协作的优化思考|得物技术

AI编程实践:从Claude Code子代理到团队协作的优化思考|得物技术 ★ FEATURED ARTICLE
1. 为什么单打独斗的 Claude Code 会话总在团队协作里翻车先说一个我观察到的现象很多团队引入 Claude Code 之后头两周效率提升明显第三周开始就有人抱怨“AI 生成的代码风格不统一”“同一个需求两个人问出来的实现方案完全不一样”。问题不在模型而在于我们把 Claude Code 当成了一个“更聪明的补全工具”而不是一个需要被编排的协作系统。Claude Code 是 Anthropic 推出的命令行 AI 编程代理它能读写文件、执行命令、跑测试适合谁适合已经在用 Git 做多人协作、有一定工程规范沉淀的后端或全栈团队。它能做什么核心价值不是替你敲代码而是把“需求理解→方案设计→编码→审查”这条链路里的重复认知劳动外包出去。但如果你只开一个会话从头聊到尾上下文会随着轮次增加而衰减早期定下的约束会被稀释最后生成的代码就像三个人接力写出来的——每段单看都对拼起来接口对不上。我在一个商家运营后台项目里踩过这个坑。当时三个人共用一个 Claude Code 会话做任务分配模块A 定了用 MyBatis-Plus 的 BaseMapper聊到第十轮 B 让 AI 加个查询AI 直接生成了 JPA 风格的 RepositoryC 没注意就合并了编译报错才发现。这不是模型笨是会话里没有“角色边界”和“约束锚点”。真正要解决的问题有三个第一上下文切换成本高一个人从需求切到编码再切到审查每次都要重建认知框架第二知识传递效率低项目规范散在文档和个人脑子里AI 每次都要重新学第三流程割裂需求、设计、编码、审查串行传递信息失真且反馈滞后。子代理加系统提示词的组合本质上是把“一个人的多线程”变成“多个角色的流水线”让每个 AI 角色只关心自己那一段通过标准化中间产物对齐。下面我会给出可直接复制的子代理配置片段、系统提示词模板以及用真实项目验证协作效率的具体步骤。所有配置都基于 Claude Code 的.claude/目录约定你可以直接放进仓库。2. 前置准备TaoToken 接入 Claude Code 的 Base URL 与 Key 配置在讲子代理之前得先把 Claude Code 接到一个稳定的模型服务上。Claude Code 默认走 Anthropic 官方接口但团队协作场景下我们更希望有一个统一的入口来管理 Key、看调用量、做成本归因。TaoToken 提供的就是这样一个兼容 Anthropic 协议的接入层官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。这里要强调一个概念TaoToken 不是“中转”它是一个标准的 API 网关你拿到的 Key 和 Base URL 就是给 Claude Code 用的。Claude Code 支持通过环境变量覆盖默认端点具体是ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY这两个。你可以在 shell 的 profile 里写也可以在每个项目的.env里写后者更适合团队——因为不同项目可以用不同的 Key 做成本隔离。先拿 Key。打开 https://taotoken.net/api-keys 登录后创建一个新 Key权限选“模型调用”复制出来。注意这个 Key 只显示一次丢了就重建。然后配置环境变量macOS/Linux 下编辑~/.zshrc或~/.bashrcexport ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的KeyWindows 下用 PowerShell 的话$env:ANTHROPIC_BASE_URLhttps://taotoken.net/api $env:ANTHROPIC_API_KEYsk-你的Key配完之后验证一下 Claude Code 能不能识别。在终端跑claude --version claude -p 用一句话说明你当前使用的模型如果第二条命令返回了模型名称而不是报 401说明接入成功。这里有个细节Claude Code 的模型 ID 需要显式指定默认可能是claude-sonnet-4-5这类。你可以在项目根目录建一个.claude/settings.json把模型 ID 固定下来避免不同成员本地默认值不一致{ model: claude-sonnet-4-5, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key } }注意把 Key 写进 settings.json 只适合内部私有仓库公开仓库请用环境变量注入。团队协作里我建议用.env.local加.gitignore的方式settings.json 只放 model 和权限配置。为什么前置这一步很重要因为子代理系统会频繁调用模型如果每个成员各自配一套 Key成本无法归因出了问题也不知道是谁的会话在刷量。统一走 TaoToken 之后你可以在控制台看到每个 Key 的调用曲线这对后面做“协作效率提升”的量化验证是基础。控制台地址是 https://taotoken.net/console 接入文档在 https://taotoken.net/doc 。3. 可复制的子代理配置settings.json 与系统提示词模板这一节是全文的核心给出可以直接落地的配置。Claude Code 的子代理机制通过.claude/agents/目录下的 Markdown 文件定义每个文件是一个角色包含 frontmatter 和系统提示词正文。同时.claude/settings.json负责全局的模型、权限和 MCP 配置。先看目录结构这是团队协作的“骨架”项目根/ ├── .claude/ │ ├── settings.json │ ├── agents/ │ │ ├── architect.md │ │ ├── implementer.md │ │ ├── reviewer.md │ │ └── frontend-gen.md │ └── CLAUDE.md ├── docs/ │ └── tech-solution.md └── src/settings.json的完整片段如下注意 permissions 里把危险命令挡掉团队协作最怕某个成员的 AI 会话误删文件{ model: claude-sonnet-4-5, permissions: { allow: [ Read, Glob, Grep, Edit, Write ], deny: [ Bash(rm -rf:*), Bash(git push --force:*), Bash(curl:* | sh) ] }, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api } }然后是四个子代理的定义。architect.md负责需求拆解和技术方案--- name: architect description: 需求分析与技术方案设计输出 tech-solution.md tools: Read, Write, Glob, Grep --- 你是技术方案架构师。你的唯一职责是把需求拆解为模块并写入 docs/tech-solution.md。 规则 1. 每个模块必须包含模块ID、功能描述、复杂度、依赖模块、责任人。 2. 技术选型必须引用项目现有组件禁止引入未在 package.json 或 pom.xml 中声明的新依赖。 3. 输出前先读 docs/tech-solution.md 的现有内容增量修改不要覆盖其他模块。 4. 模块划分粒度单个模块的实现代码不超过 300 行。 5. 完成后在文档末尾追加一行[architect] 方案更新于 时间戳。implementer.md负责按方案写代码--- name: implementer description: 根据 tech-solution.md 实现单个模块的代码与单测 tools: Read, Write, Edit, Glob, Grep, Bash --- 你是代码实现专家。你一次只实现一个模块模块ID由调用方指定。 规则 1. 开始前必须读 docs/tech-solution.md确认该模块的接口定义和依赖。 2. 必须复用项目现有工具类禁止重复实现。遇到不确定的复用点先 Grep 搜索。 3. 所有 public 方法必须有单元测试测试文件放在 src/test 对应路径。 4. 实现完成后把 tech-solution.md 中该模块状态改为 [已实现]。 5. 禁止修改其他模块的文件如需跨模块改动在文档中标注 [需architect确认]。reviewer.md负责审查--- name: reviewer description: 审查代码是否符合架构设计与规范 tools: Read, Glob, Grep --- 你是代码审查专家。你只审查不修改代码。 审查清单 1. 是否使用了 tech-solution.md 中指定的技术栈。 2. 命名是否符合项目规范类名大驼峰、方法名小驼峰、常量全大写下划线。 3. 是否有空指针风险、资源未关闭、事务边界错误。 4. 单元测试覆盖率是否覆盖核心分支。 5. 输出格式每条问题给出文件路径、行号、问题描述、修改建议。 6. 审查通过后把 tech-solution.md 中该模块状态改为 [已审查]。frontend-gen.md针对低代码后台场景生成页面配置--- name: frontend-gen description: 根据接口定义生成前端页面配置 tools: Read, Write, Glob --- 你是前端页面生成器。输入是后端接口的 DTO 定义输出是页面 JSON 配置。 规则 1. 列表页默认包含搜索区、表格、分页、操作列。 2. 表单页字段类型映射String→inputInteger→numberDate→datePickerEnum→select。 3. 权限字段从接口的 Permission 注解读取。 4. 输出文件放在 src/pages/{module}/config.json。系统提示词模板放在.claude/CLAUDE.md控制在 200 字以内只放最关键的约束。我试过写 5000 字的“百科全书”效果反而差AI 会顾此失彼。现在的模板是# 项目约定 - 分层Controller → Service → MapperService 继承 BaseServiceImpl。 - 返回统一 ResultT错误码用 ErrorCode 枚举。 - 数据库MyBatis-Plus实体继承 BaseEntity表名 ocs_ 前缀。 - 权限Permission 注解参数校验用 Valid。 - 外部调用飞书用 FeishuClient禁止重复实现。 - 遇到分布式事务参考 docs/分布式事务最佳实践.md 的 TCC 方案。这套配置的关键在于“约束锚定”每个子代理启动时都会读 CLAUDE.md等于每次对话都重新强调一遍核心规范解决了上下文衰减问题。三件套 Base URL、Key、Model ID 分别在 settings.json 的 env、env、model 字段里缺一不可。4. 验证请求用真实项目跑通子代理协作链路配置写完得验证它真的能跑。我拿一个“拜访任务线上化”的真实需求做演示这个需求包含 12 个模块从任务创建到 ES 同步复杂度跨度大很适合验证子代理拆分能力。第一步启动 architect 子代理做方案设计。在 Claude Code 里输入architect 分析需求实现拜访任务线上化包含任务创建、审批、日程同步、列表查询、详情、统计、结果提交、分配、触达、ES同步、导入、状态变更。输出到 docs/tech-solution.mdarchitect 会读现有文档然后生成模块清单。实测下来它输出的结构是这样的## 模块清单 | 模块ID | 功能 | 复杂度 | 依赖 | 责任人 | |--------|------|--------|------|--------| | M1 | 任务创建 | Medium | - | implementer | | M2 | 任务审批 | High | M1 | implementer | | M3 | 日程同步 | Medium | M2 | implementer | | M4 | 任务列表 | Medium | M1 | implementer | | M5 | 任务详情 | Low | M1 | implementer | | M6 | 任务统计 | Low | M4 | implementer | | M7 | 结果提交 | Medium | M1 | implementer | | M8 | 任务分配 | High | M1 | implementer | | M9 | 任务触达 | Medium | M1,M7 | implementer | | M10 | ES同步 | Medium | M1,M4 | implementer | | M11 | 任务导入 | High | M1 | implementer | | M12 | 状态变更 | Low | - | implementer |第二步让 implementer 逐个实现。注意一次只给一个模块 IDimplementer 实现 M1参考 docs/tech-solution.mdimplementer 会先读文档确认 M1 的接口定义然后生成 Service、Mapper、DTO 和单测。完成后它会把 M1 状态改成[已实现]。这里有个验证点你去看 tech-solution.mdM1 那行的状态确实变了说明子代理的写回机制生效了。第三步让 reviewer 审查reviewer 审查 M1 的实现reviewer 输出问题清单比如“TaskCreateService.java 第 45 行缺少空指针校验”“单测未覆盖审批驳回分支”。implementer 根据清单修改reviewer 复审通过后把状态改成[已审查]。第四步验证接口能通。跑一下单测mvn test -DtestTaskCreateServiceTest预期输出Tests run: 8, Failures: 0, Errors: 0。再启动服务用 curl 打一下创建接口curl -X POST http://localhost:8080/api/v1/task/create \ -H Content-Type: application/json \ -d {taskName:测试拜访,merchantId:M001,assigneeId:U001}返回{code:0,data:{taskId:T20250101}}就说明链路通了。这套流程跑下来12 个模块的协作时间是 3 天而之前单人单会话模式做同样需求花了 5 天且返工两次。效率提升主要来自两点一是 reviewer 在编码阶段就拦住了问题避免了后期联调才发现接口不一致二是 tech-solution.md 作为单一事实来源任何人接手都能看懂当前进度。如果你只想验证模型连通性不想跑完整项目可以用模型对话页面快速测一下https://taotoken.net/models 输入一段 prompt 看返回是否正常。但真正的协作验证必须在项目里跑因为子代理的价值体现在文件读写和状态同步上。5. 常见报错排查401、local proxy failed 与 reading choices这一节列几个团队协作里高频出现的报错以及对应的排查路径。这些错误我在不同项目里都遇到过按出现频率排序。401 Unauthorized。最常见的原因是 Key 没生效或 Base URL 写错。先检查环境变量echo $ANTHROPIC_BASE_URL echo $ANTHROPIC_API_KEY如果 Base URL 末尾多了斜杠比如https://taotoken.net/api/某些版本的 Claude Code 会拼出//v1/messages导致 401。改成不带斜杠的https://taotoken.net/api。另一个原因是 Key 被禁用或额度耗尽去 https://taotoken.net/api-keys 看状态。还有一种隐蔽情况settings.json 里的 env 覆盖了 shell 的环境变量但 Key 写错了这时候echo看到的是对的实际用的是错的。排查方法是临时把 settings.json 的 env 删掉只靠 shell 变量跑一次。local proxy failed。这个报错通常出现在公司网络环境里Claude Code 尝试走系统代理但代理不可达。注意这里说的不是让你去配什么特殊网络工具而是检查你的 shell 里有没有残留的HTTP_PROXY或HTTPS_PROXY变量env | grep -i proxy如果有且指向一个已经关掉的本地端口就会报 local proxy failed。解决方法是 unset 掉unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxy然后重启终端。团队协作里这个错误经常出现在新成员机器上因为他们的 shell 配置是从旧项目拷过来的。reading choices 相关报错。完整报错类似error reading choices: unexpected end of JSON input这通常是模型返回的流式响应被截断。原因可能是网络抖动也可能是单次请求的 max_tokens 设得太小。检查 settings.json 里有没有手动设max_tokens如果有且小于 4096调大。另一个原因是子代理的 prompt 太长超过了模型上下文窗口这时候需要精简 CLAUDE.md 或拆分任务。实测下来把单个子代理的输入控制在 8000 token 以内最稳。OAuth 相关报错。如果你之前用 Claude Code 登录过官方账号本地会缓存 OAuth token切换成 API Key 模式时可能冲突。报错类似OAuth token invalid。解决方法是清掉缓存目录rm -rf ~/.claude/credentials.json然后重新用 API Key 启动。注意不要删整个.claude目录那里面还有你的 agents 配置。子代理不写回文档。这个不算报错但很常见。现象是 implementer 跑完了tech-solution.md 状态没变。原因是子代理的 tools 里没加 Write 权限。检查 agents/implementer.md 的 frontmattertools字段必须包含Write和Edit。另外如果文档被其他进程占用比如你正开着编辑器且没保存写入会失败关掉编辑器再跑。CC Switch 切换后配置丢失。有些团队用 CC Switch 管理多套配置切换后 settings.json 被覆盖。这时候三件套要重新确认Base URL 是不是https://taotoken.net/apiKey 是不是当前环境的Model ID 是不是claude-sonnet-4-5。建议把这三项写进项目的 README新成员照着填。排障的通用思路是先确认环境变量再确认 settings.json最后看子代理的 tools 权限。90% 的问题出在前两步。如果还搞不定去接入文档 https://taotoken.net/doc 搜报错关键词或者直接在模型对话页 https://taotoken.net/models 发一条最小请求看是不是模型侧的问题。6. 把子代理协作沉淀为团队资产从 Coding Plan 到长期迭代跑通一次不难难的是让这套东西在团队里持续运转。我的经验是把它当成一个“内部产品”来维护而不是一次性配置。第一件事是建立 tech-solution.md 的评审机制。子代理生成的方案不能直接信必须有人工评审环节。我们的做法是每天站会花 10 分钟过一遍文档里新增的模块确认接口定义和依赖关系合理。这一步不能省因为如果方案阶段就错了后面 implementer 和 reviewer 会把错误放大。我见过一个案例architect 把“任务分配”的依赖写成了 M2 而不是 M1结果 implementer 按错误依赖实现reviewer 也没发现联调时才发现审批流根本没触发。第二件事是维护“AI 错误案例库”。每次 reviewer 发现 AI 的典型错误就记一条到 docs/ai-error-cases.md比如“AI 忘记处理分布式锁超时”“日期格式转换用了系统默认时区”。每两周回顾一次把高频错误提炼成 CLAUDE.md 里的新约束。这样系统提示词是活的会随着项目演进而进化而不是一开始写死。第三件事是量化协作效率。我们在 TaoToken 控制台看每个 Key 的调用量结合 Git 提交记录算两个指标单模块平均实现时长、reviewer 拦截问题数。前者反映协作速度后者反映质量。实测下来引入子代理后单模块时长从 4 小时降到 2.5 小时reviewer 平均每个模块拦下 3 个问题其中 1 个是接口不一致类的严重问题。如果你团队要长期做 AI 辅助编码建议上 Coding Plan它把模型调用、成本归因、团队配额做在了一起比每人各自管 Key 省心。入口在 https://taotoken.net/coding-plan 。对于只是偶尔验证模型的场景用模型对话页就够了不必上完整方案。最后说一个我踩过的坑不要试图让子代理直接连生产数据库。MCP 可以扩展 AI 的外部能力但生产库的读写权限必须走人工审批。我们的做法是 MCP 只连测试环境和文档系统生产变更一律走 CI/CD。子代理再智能也不能绕过工程纪律。这套方法的核心不是让 AI 替你做决定而是让 AI 把重复的认知劳动接过去人专注于方案评审和质量把控。角色边界清晰了上下文就不会丢中间产物标准化了协作就不会乱。你可以先从 architect 和 reviewer 两个角色开始试跑顺了再加 implementer循序渐进比一次性铺开更稳。
阅读完成 · 觉得有帮助?
咨询建站