第16章:Agent 工具——AI 的分身��
一个 AI 不够用怎么办?
有时候一个任务太复杂,需要同时做很多事情。比如:
"帮我重构项目中所有的数据库查询,用新的 ORM 替换旧的 SQL 语句。同时更新所有相关的测试。"
这个任务涉及几十个文件。如果 AI 一个一个处理,要花很长时间。而且它的上下文窗口可能放不下所有文件。
解决方案?创建"分身"。
Agent 工具是什么?
Agent 工具让 AI 可以创建子智能体(Sub-agent)——新的 AI 实例,有自己的上下文窗口、自己的任务、自己的工具集。
// AI 调用 Agent 工具
{
name: "Agent",
input: {
description: "重构数据库查询",
prompt: "请将 src/db/ 目录下所有文件中的原生 SQL 查询替换为 Prisma ORM 调用。...",
subagent_type: "general-purpose",
}
}
就像《火影忍者》里的"影分身术"——每个分身可以独立工作,完成后把结果报告回来。
子智能体的工作方式
主智能体
├── 接收用户任务
├── 分析任务复杂度
├── 决定创建几个子智能体
│
├── 子智能体 A: "重构 src/db/users.ts"
│ ├── 有自己的上下文窗口
│ ├── 可以使用 FileRead, FileEdit 等工具
│ ├── 独立完成任务
│ └── 返回结果给主智能体
│
├── 子智能体 B: "重构 src/db/posts.ts"
│ ├── 有自己的上下文窗口
│ ├── 可以使用同样的工具
│ ├── 独立完成任务
│ └── 返回结果给主智能体
│
└── 主智能体汇总结果,回复用户
子智能体的类型
Claude Code 支持几种预定义的子智能体类型:
// 通用型:什么都能做
{
subagent_type: "general-purpose"
}
// 探索型:专门用于搜索和研究代码
{
subagent_type: "Explore"
}
// 规划型:专门用于设计实施方案
{
subagent_type: "Plan"
}
general-purpose(通用型)
拥有所有工具(除了不能再创建子智能体),可以执行任何操作。适合需要修改代码的任务。
Explore(探索型)
只有搜索和读取工具,不能修改文件。专门用于快速探索代码库。比如:
"帮我了解这个项目的认证系统是怎么实现的"
→ 创建一个 Explore 型子��能体
→ 它会搜索相关文件、读取代码、整理报告
→ 返回一份全面的分析报告
Plan(规划型)
同样只有搜索和读取工具,但专注于设计实施方案。适合:
"帮我规划一下怎么把这个项目从 JavaScript 迁移到 TypeScript"
→ 创建一个 Plan 型子智能体
→ 它会分析项目结构、识别依赖关系
→ 返回一份详细的迁移计划
子智能体的上下文隔离
每个子智能体有自己独立��上下文窗口。这意味着:
主智能体的上下文:
[用户的原始请求]
[之前的对话历史]
[系统提示词]
共占用 50,000 tokens
子智能体 A 的上下文:
[子任务描述] ← 从主智能体传来
[系统提示词(缓存)] ← 重用主智能体的缓存
[��立的工具调用历史] ← 自己产生的
共占用 30,000 tokens ← 不受主智能体的历史影响
好处:
- 1. 子智能体不会被主智能体的对话历史"污染"
- 2. 子智能体有"新鲜"的上下文空间
- 3. 主智能体的上下文不会因为子任务的细节而膨胀
并行 vs 串行
子智能体可以并行运行:
// AI 可以同时启动多个子智能体
[
{
name: "Agent",
input: { prompt: "重构 users.ts", ... }
},
{
name: "Agent",
input: { prompt: "重构 posts.ts", ... }
},
{
name: "Agent",
input: { prompt: "更新测试文件", ... }
},
]
// 三个子智能体同时工作!
也可以在后台运行:
{
name: "Agent",
input: {
prompt: "...",
run_in_background: true // 后台运行
}
}
后台运行的子智能体不会阻塞主智能体——主智能体可以继续和用户对话。子智能体完成后,主智能体会收到通知。
Git Worktree 隔离
对于可能有冲突的并行任务,子智能体可以在独立的工作目录中运行:
{
name: "Agent",
input: {
prompt: "重构认证模块",
isolation: "worktree" // 在独立的 git worktree 中运行
}
}
Git worktree 是 Git 的一个功能——它让你同时有多个工作目录,每个在不同的分支上。子智能体在自己的 worktree 里修改文件,不会影响主工作目录。
主工作目录: /Users/alice/project (main 分支)
子���能体 A: /tmp/worktree-a/ (feature-auth 分支)
子智能体 B: /tmp/worktree-b/ (feature-db 分支)
完成后,子智能体的修改可以通过 Git 合并回主分支。
自定义智能体
除了预定义的类型,用户还可以创建自定义智能体:
# ~/.claude/agents/security-reviewer.md
---
name: security-reviewer
description: 安全代码审查专家
tools: ["FileRead", "Grep", "Glob"]
---
你是一个安全代码审查专家。你的任务是:
1. 查找 OWASP Top 10 安全漏洞
2. 检查输入验证
3. 检查身份认证和授权
4. 检查敏感数据处理
5. 给出修复建议
这个文件定义了一个专门做安全审查的智能体。AI 可以这样调用它:
{
name: "Agent",
input: {
subagent_type: "security-reviewer",
prompt: "审查 src/api/ 目录下的所有接口"
}
}
子智能体之间的通信
子智能体不能直接互相通信——它们只能通过文件系统间接交互:
子智能体 A 修改了 config.ts
子智能体 B 读取了 config.ts
→ B 看到了 A 的修改
这种"通过共享状态通信"的模式避免了复杂的消息传递,但也意味着如果两个子智能体同时修改同一个文件,可能会冲突。这就是为什么有 worktree 隔离模式。
本章小结
- - Agent 工具让 AI 创建子智能体来处理复杂任务
- - 子智能体有独立的上下文窗口和工具集
- - 三种预定义类型:通用型、探索型、规划型
- - 子智能体可���并行运行、后台运行
- - Git worktree 隔离防止并行修改冲突
- - 用户可以创建自定义智能体
- - 子智能体通过文件系统间接通信
思考题
- 1. 如果一个子智能体的任务失败了,主智能体应该怎么处理?
- 2. 子智能体能不能创建自己的子智能体?这样做的风险是什么?
- 3. 什么样的任务适合用子智能体,什么样的任务不适合?
多智能体的类比:软件开发团队
多智能体系统和真实的软件开发团队惊人地相似:
| 真实团队 | 多智能体 |
|---|---|
| 项目经理分配任务 | 主智能体分配子任务 |
| 开发者各自写代码 | 子智能体各自执行 |
| 用 Git 分支隔离工作 | 用 Worktree 隔离修改 |
| Code Review 检查质量 | 主智能体汇总审查 |
| 最终合并到 main 分支 | 合并所有修改 |
这不是巧合——多智能体系统本身就是在模拟人类团队的协作方式。理解了团队协作的原则(明确分工、减少耦合、统一标准),你就理解了多智能体系统的设计精髓。
下一章,我们将进入安全与权限篇——Claude Code 最重要的防线。
本书由 everettjf 使用 Claude Code 分析泄露源码编写 | 保留出处即可自由转载