第 4 课:工具系统详解
AI 的"工具箱"
上一课提到,resume-generator 给 AI 配了 7 个工具:
allowedTools: ['Skill', 'WebSearch', 'WebFetch', 'Bash', 'Write', 'Read', 'Glob']
这些工具就像给你的超级助手配了一套装备。没有工具的 AI 只能"动嘴说",有了工具它才能"动手干"。
7 个工具逐一拆解
1. WebSearch —— 搜索引擎
作用:让 AI 上网搜索
比喻:给 AI 一个搜索框
AI 用它来做什么:
搜索 "Elon Musk professional background"
搜索 "Elon Musk education Stanford"
搜索 "SpaceX CEO career history"
在简历生成中,这是第一步——AI 要先搜集目标人物的信息。
2. WebFetch —— 网页抓取
作用:访问一个具体的网页,读取内容
比喻:给 AI 打开一个浏览器标签页
AI 用它来做什么:
打开 LinkedIn 页面看详细信息
访问公司官网看职位描述
读取 GitHub 主页看技术背景
WebSearch 是"搜索",WebFetch 是"打开网页看内容"。通常先搜后抓。
3. Write —— 写文件
作用:创建或覆盖一个文件
比喻:给 AI 一支笔和一张纸
AI 用它来做什么:
写一个 generate_resume.js 文件(生成简历的代码)
这是最关键的工具之一。AI 会用它写出一段 JavaScript 代码,这段代码负责生成 Word 文档。
4. Bash —— 执行命令
作用:在终端执行命令
比喻:给 AI 一个命令行窗口
AI 用它来做什么:
node generate_resume.js ← 执行自己写的代码
ls agent/custom_scripts/ ← 检查文件是否生成了
AI 写完代码后,用 Bash 来执行它。这就是"代码生成模式"的关键一环。
5. Read —— 读文件
作用:读取一个文件的内容
比喻:给 AI 一双眼睛
AI 用它来做什么:
读取 SKILL.md 了解怎么用 docx 库
读取 docx-js.md 查看 API 参考
读取已有的代码检查有没有错误
6. Glob —— 查找文件
作用:按文件名模式查找文件
比喻:给 AI 一个文件搜索功能
AI 用它来做什么:
查找 *.docx 文件确认简历是否生成
查找 .claude/skills/ 下有什么技能可用
7. Skill —— 读取技能文件
作用:加载 .claude/skills/ 目录下的技能说明
比喻:给 AI 一本操作手册
AI 用它来做什么:
读取 docx 技能,学会怎么生成 Word 文档
这个工具比较特殊,下一课会专门讲。
工具是怎么配合的?
在简历生成这个任务里,7 个工具的协作流程是这样的:
graph TD
A["AI 接到任务:生成简历"] --> B["第一阶段:了解技能"]
B --> B1["Skill - 读 SKILL.md"]
B --> B2["Read - 读 docx-js.md"]
B --> C["第二阶段:搜集资料"]
C --> C1["WebSearch - 搜索"]
C --> C2["WebFetch - 读网页"]
C --> D["第三阶段:生成文档"]
D --> D1["Write - 写 JS 代码"]
D --> D2["Bash - 执行代码"]
D --> D3["Glob - 确认文件存在"]
安全:为什么要限制工具?
你可能会想:"直接给 AI 所有工具不就行了?"不行。这就像给实习生配权限——你不会给一个做简历的实习生银行账户的管理权限吧。
❌ 不安全的做法:
allowedTools: ['*'] // 给 AI 所有权限
✅ 安全的做法:
allowedTools: ['Skill', 'WebSearch', 'WebFetch', 'Bash', 'Write', 'Read', 'Glob']
// 只给需要的权限
原则:最小权限原则——AI 做这个任务需要什么工具,就只给什么工具。
工具调用长什么样?
当 AI 决定使用一个工具时,它会发出一个 tool_use 消息。在代码里长这样:
// AI 的消息里包含一个 tool_use 块
{
type: 'tool_use',
name: 'WebSearch', // 要用哪个工具
input: {
query: 'Elon Musk professional background' // 工具的参数
}
}
在 resume-generator 的代码里,是这样处理的:
if (block.type === 'tool_use') {
if (block.name === 'WebSearch') {
// 特殊处理搜索——显示搜索关键词
console.log(`🔍 Searching: "${block.input.query}"`);
} else {
// 其他工具——只显示工具名
console.log(`🔧 Using tool: ${block.name}`);
}
}
工具调用的完整生命周期
1. AI 决定:"我需要搜索"
↓
2. AI 发出 tool_use 消息
{ name: "WebSearch", input: { query: "..." } }
↓
3. SDK 底层执行这个工具调用
↓
4. 工具返回结果
{ type: "result", content: "搜索结果..." }
↓
5. AI 看到结果,决定下一步怎么做
↓
6. 回到步骤 1(直到任务完成)
这个"AI 思考 → 用工具 → 看结果 → 再思考"的循环,就是 Agent 的核心工作方式。
本课小结
- 7 个工具各有分工:搜索、抓取、写文件、执行命令、读文件、查找文件、加载技能
- 工具之间有明确的协作流程:先学技能 → 再搜资料 → 最后生成文档
- 遵循最小权限原则,只给 AI 需要的工具
- 工具调用是一个"思考 → 行动 → 观察"的循环
课后练习
- 在 resume-generator 的
for await循环里加一些console.log,把每个工具调用的完整 input 打印出来看看 - 试着从
allowedTools里去掉Bash,看看 AI 在不能执行代码的情况下会怎么应对 - 想一想:如果你要做一个"新闻摘要生成器",需要哪些工具?不需要哪些?