上一课提到,resume-generator 给 AI 配了 7 个工具:

第 4 课:工具系统详解


AI 的"工具箱"

上一课提到,resume-generator 给 AI 配了 7 个工具:

bash
allowedTools: ['Skill', 'WebSearch', 'WebFetch', 'Bash', 'Write', 'Read', 'Glob']

这些工具就像给你的超级助手配了一套装备。没有工具的 AI 只能"动嘴说",有了工具它才能"动手干"。

7 个工具逐一拆解

1. WebSearch —— 搜索引擎

code
作用:让 AI 上网搜索
比喻:给 AI 一个搜索框

AI 用它来做什么:
  搜索 "Elon Musk professional background"
  搜索 "Elon Musk education Stanford"
  搜索 "SpaceX CEO career history"

在简历生成中,这是第一步——AI 要先搜集目标人物的信息。

2. WebFetch —— 网页抓取

code
作用:访问一个具体的网页,读取内容
比喻:给 AI 打开一个浏览器标签页

AI 用它来做什么:
  打开 LinkedIn 页面看详细信息
  访问公司官网看职位描述
  读取 GitHub 主页看技术背景

WebSearch 是"搜索",WebFetch 是"打开网页看内容"。通常先搜后抓。

3. Write —— 写文件

code
作用:创建或覆盖一个文件
比喻:给 AI 一支笔和一张纸

AI 用它来做什么:
  写一个 generate_resume.js 文件(生成简历的代码)

这是最关键的工具之一。AI 会用它写出一段 JavaScript 代码,这段代码负责生成 Word 文档。

4. Bash —— 执行命令

code
作用:在终端执行命令
比喻:给 AI 一个命令行窗口

AI 用它来做什么:
  node generate_resume.js    ← 执行自己写的代码
  ls agent/custom_scripts/   ← 检查文件是否生成了

AI 写完代码后,用 Bash 来执行它。这就是"代码生成模式"的关键一环。

5. Read —— 读文件

code
作用:读取一个文件的内容
比喻:给 AI 一双眼睛

AI 用它来做什么:
  读取 SKILL.md 了解怎么用 docx 库
  读取 docx-js.md 查看 API 参考
  读取已有的代码检查有没有错误

6. Glob —— 查找文件

code
作用:按文件名模式查找文件
比喻:给 AI 一个文件搜索功能

AI 用它来做什么:
  查找 *.docx 文件确认简历是否生成
  查找 .claude/skills/ 下有什么技能可用

7. Skill —— 读取技能文件

code
作用:加载 .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 所有工具不就行了?"不行。这就像给实习生配权限——你不会给一个做简历的实习生银行账户的管理权限吧。

bash
❌ 不安全的做法:
  allowedTools: ['*']  // 给 AI 所有权限

✅ 安全的做法:
  allowedTools: ['Skill', 'WebSearch', 'WebFetch', 'Bash', 'Write', 'Read', 'Glob']
  // 只给需要的权限

原则:最小权限原则——AI 做这个任务需要什么工具,就只给什么工具。

工具调用长什么样?

当 AI 决定使用一个工具时,它会发出一个 tool_use 消息。在代码里长这样:

code
// AI 的消息里包含一个 tool_use 块
{
  type: 'tool_use',
  name: 'WebSearch',      // 要用哪个工具
  input: {
    query: 'Elon Musk professional background'  // 工具的参数
  }
}

在 resume-generator 的代码里,是这样处理的:

code
if (block.type === 'tool_use') {
  if (block.name === 'WebSearch') {
    // 特殊处理搜索——显示搜索关键词
    console.log(`🔍 Searching: "${block.input.query}"`);
  } else {
    // 其他工具——只显示工具名
    console.log(`🔧 Using tool: ${block.name}`);
  }
}

工具调用的完整生命周期

code
1. AI 决定:"我需要搜索"
       ↓
2. AI 发出 tool_use 消息
   { name: "WebSearch", input: { query: "..." } }
       ↓
3. SDK 底层执行这个工具调用
       ↓
4. 工具返回结果
   { type: "result", content: "搜索结果..." }
       ↓
5. AI 看到结果,决定下一步怎么做
       ↓
6. 回到步骤 1(直到任务完成)

这个"AI 思考 → 用工具 → 看结果 → 再思考"的循环,就是 Agent 的核心工作方式。

本课小结

  • 7 个工具各有分工:搜索、抓取、写文件、执行命令、读文件、查找文件、加载技能
  • 工具之间有明确的协作流程:先学技能 → 再搜资料 → 最后生成文档
  • 遵循最小权限原则,只给 AI 需要的工具
  • 工具调用是一个"思考 → 行动 → 观察"的循环

课后练习

  1. 在 resume-generator 的 for await 循环里加一些 console.log,把每个工具调用的完整 input 打印出来看看
  2. 试着从 allowedTools 里去掉 Bash,看看 AI 在不能执行代码的情况下会怎么应对
  3. 想一想:如果你要做一个"新闻摘要生成器",需要哪些工具?不需要哪些?

沿着当前专题继续,或返回课程目录重新整理阅读顺序。

返回课程目录