AIUnlimited
🌳

AI基础

🌱
AI 种子

从零开始

🌿
AI 萌芽

打好基础

🌳
AI 枝干

付诸实践

🏕️
AI 树冠

深入探索

🌲
AI 森林

精通AI

🔨

AI精通

✏️
AI 草图

从零开始

🪨
AI 雕刻

打好基础

⚒️
AI 匠心

付诸实践

💎
AI 打磨

深入探索

🏆
AI 杰作

精通AI

📘

AI实战

📖
理解开源模型

开源模型的基础知识和资源

🎯
问题到模型任务

将业务问题转化为模型任务

⚡
跑通第一个模型

30分钟快速看到第一个结果

🔧
微调与评测

微调模型并评估性能

🚀
应用系统

构建实际AI应用系统

🎨
生成式AI

探索AIGC的开源模型

🤖
Agent智能体

学习Agent框架和MCP工具

📐
基础补充

LLM基础知识和评测

🎓

Claude 学院

🤖
Claude 101 入门

用 Claude 学习 AI 基础知识

💻
Claude Code 101 入门

让 Claude 成为你的结对编程伙伴

🤝
Claude Cowork 入门

与 Claude 协作完成复杂项目

⚙️
Claude 平台 101

使用 Claude API 构建应用

实验室

已加载 7 个实验
🧬神经网络沙盒🤖AI 还是人类?🥋提示工程道场🏁算法竞速🧠AI 知识挑战🏗️系统设计画布
🎯模拟面试进入实验室→
🚀

职业发展

🚀
面试发射台

开启你的旅程

🌟
行为面试精通

掌握软技能

💻
技术面试

通过编程轮次

🤖
AI与ML面试

ML面试精通

🏆
Offer与未来

拿下最好的Offer

立即开始
AIUnlimited

AI 教育平台

沪ICP备18025655号-11

学习

  • AI基础
  • AI实战
  • Claude学院
  • 实验室
  • 职业发展

社区

  • 关于
  • 常见问题

支持

  • 服务条款
  • 隐私政策
  • 联系我们
AI & 工程学习计划›⚙️ Claude 平台 101›课程›什么是 Tool Use?
🔧
Claude 平台 101 • 中级⏱️ 8 分钟阅读

什么是 Tool Use?

什么是工具使用?

你现有的工作流依赖许多不同的技术——项目管理软件、数据库、文件。Claude 无法自己检查这些内容。相反,它依赖 工具,工具让 Claude 访问外部数据和操作。

工具是什么

简单来说,工具是你 定义并暴露给 Claude 的函数。你描述它做什么以及它接受什么输入,Claude 决定何时调用它。

需要内化的关键点是:Claude 不执行工具——你的代码执行。流程如下:

  1. Claude 请求 工具调用。
  2. 你的代码执行 函数。
  3. 结果返回给 Claude,然后继续。

工具如何定义

工具是包含三部分的 JSON 模式:名称、描述 和 输入模式。你在请求体中以 tools 数组的形式传递它们。

描述 是 Claude 读取以决定是否调用工具的内容。如果你写了一个模糊的描述,你会得到糟糕的工具使用。这是 agent 失误或不使用可用工具的头号原因。要具体。

这是一个工具定义的样子:

{
  "name": "lookup_building_code",
  "description": "Look up a specific building code section by its identifier. Returns the full text of that code section.",
  "input_schema": {
    "type": "object",
    "properties": {
      "section": {
        "type": "string",
        "description": "The building code section to look up"
      }
    },
    "required": ["section"]
  }
}

那么当我们使用这个时会发生什么?假设我们向 agent 发送一份合规报告。在第一轮中,Claude 返回 stop_reason: "tool_use" — 这是我们的信号。这个响应是什么样子的:

我们的循环使用 Claude 请求的参数调用 lookup_building_code,然后将结果作为 工具结果 反馈——一个包含与工具调用 id 关联的 tool_result 块的用户消息。

然后 Claude 继续。在那时,我们可以继续调用工具并将结果返回给 Claude,直到它有所需的内容。

多个工具:让 Claude 选择

一个工具有用,但有趣的部分是给 Claude 多个工具 并观察它选择使用哪个、按什么顺序。

想象这个场景:你正在为三天的丹佛之旅打包行李,你想要今天和未来几天的天气。所以我们声明两个工具而不是一个:

const tools = [
  {
    name: "get_weather",
    description: "Get today's current weather for a city.",
    input_schema: {
      type: "object",
      properties: {
        city: { type: "string", description: "The city to check" }
      },
      required: ["city"]
    }
  },
  {
    name: "get_forecast",
    description: "Get the weather forecast for the next few days for a city.",
    input_schema: {
      type: "object",
      properties: {
        city: { type: "string", description: "The city to check" }
      },
      required: ["city"]
    }
  }
];
第 9 课,共 26 课已完成 0%
←流式响应

讨论

登录 参与讨论

循环与我们已经看到的 agent 循环相同。唯一新的是一个 runTool 函数,它使用 switch 语句按 工具名称分发 — 这段代码只是你的代码实际运行的地方:

function runTool(name, input) {
  switch (name) {
    case "get_weather":
      return getWeather(input.city);
    case "get_forecast":
      return getForecast(input.city);
  }
}

while (true) {
  const response = await client.messages.create({
    model: "claude-sonnet-5",
    max_tokens: 1024,
    messages,
    tools,
  });

  if (response.stop_reason !== "tool_use") {
    // Claude 完成——这是最终答案
    break;
  }

  messages.push({ role: "assistant", content: response.content });

  const toolResults = response.content
    .filter((block) => block.type === "tool_use")
    .map((block) => ({
      type: "tool_result",
      tool_use_id: block.id,
      content: runTool(block.name, block.input),
    }));

  messages.push({ role: "user", content: toolResults });
}

这就是整个模式。想要第三个工具?添加到数组中,在 switch 中添加一个 case,然后你就完成了。

运行它,你会看到 Claude 调用 get_weather 然后 get_forecast — 有时在同一轮中,有时一个接一个。然后它回答:打包分层衣物,预计今天有阵雪,本周逐渐变暖。

现在注意 Claude 如何选择。它读取描述,将你的提示映射到 "今天的天气" 和 "未来几天",并为每个选择正确的工具。这就是为什么你的工具描述真的很重要。

工具运行器:跳过样板代码

你可能已经发现我们刚才写的有两个问题:

  • 对于两个简单的查询来说,这是 大量的代码。
  • 在真实的代码库中,你不想为每个函数 手写 JSON 模式。就像写两次代码。

这就是 工具运行器 的用武之地。它在 Claude SDK 中以测试版发布:TypeScript、Python、Ruby、C#、Go、Java 和 PHP。你定义每个工具一次,运行器在内部处理整个工具使用/工具结果循环。

你的代码缩减为:描述工具、发送提示、等待结果。这是通过工具运行器连接的相同两个工具的天气演示:

// 我们手动运行的相同两个查询——只是普通的 TypeScript 函数
function getWeather(city: string) {
  // ...现有查询
}

function getForecast(city: string) {
  // ...现有查询
}

const runner = client.beta.messages.toolRunner({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [
    {
      role: "user",
      content:
        "I'm packing for a three-day trip to Denver. What's the weather today and over the next few days?",
    },
  ],
  tools: [getWeather, getForecast],
});

// 等待运行器以在所有工具交互结束后获取最终消息
const finalMessage = await runner;

相同的场景,代码的一小部分:

  • 没有 while 循环,没有停止原因 switch,没有手动将工具结果推回消息——运行器处理所有这些。
  • 没有 JSON 模式,所以你不需要写两次。
  • 两个函数是我们一分钟前手动运行的相同查询,只是普通的 TypeScript。
  • 等待运行器在一切稳定后返回最终助手消息。

运行它,你会得到相同的答案。

真实的工具包装你现有的代码

在现实生活中,你的工具不会是硬编码的天气数据。它们会包装 你应用程序中已有的实际函数。

以合规审查 agent 为例:它的工具是围绕 lookup_building_code 和 search_building_code 函数的薄包装器,这些函数已经存在于代码库中。使用工具运行器,你直接传递这些函数,agent 在它编写的每个发现中引用特定的代码部分——不需要编写模式。

回顾

  • 工具让 Claude 访问你的系统。 工具是你定义并暴露的函数;Claude 决定何时调用它,你的代码执行它。
  • 工具是包含 名称、描述 和 输入模式 的 JSON 模式,在请求中作为 tools 数组传递。
  • 编写具体的描述。 模糊的描述是 agent 失误的头号原因。
  • stop_reason: "tool_use" 是你运行工具并将其结果作为工具结果反馈的信号。
  • 对于多个工具,按工具名称分发。添加工具意味着添加到数组并添加一个 case。
  • SDK 的 工具运行器(在 Claude SDK 中以测试版提供)从你的实际函数构建模式并处理整个循环——或者你可以自己运行循环。
  • 你执行,或者你委派循环。在该范围的远端,managed agents 将整个 agent 委派给 Anthropic。