工具使用(函数调用)
Claude能够与外部客户端工具和函数进行交互,让您可以为Claude配备自己的自定义工具来执行更多样化的任务。
以下是如何使用Messages API为Claude提供工具的示例:
工具使用的工作原理
通过以下步骤将外部工具与Claude集成:
向Claude提供工具和用户提示
- 在API请求中定义带有名称、描述和输入模式的工具。
- 包含可能需要这些工具的用户提示,例如”旧金山的天气如何?”
Claude决定使用工具
- Claude评估是否有工具可以帮助回答用户的查询。
- 如果是,Claude构建格式正确的工具使用请求。
- API响应的
stop_reason
为tool_use
,表明Claude的意图。
提取工具输入、运行代码并返回结果
- 在您这边,从Claude的请求中提取工具名称和输入。
- 在客户端执行实际的工具代码。
- 继续对话,发送包含
tool_result
内容块的新user
消息。
Claude使用工具结果制定响应
- Claude分析工具结果以制定对原始用户提示的最终响应。
注意:步骤3和4是可选的。对于某些工作流程,Claude的工具使用请求(步骤2)可能就是您所需要的全部内容,无需将结果发送回Claude。
工具由用户提供
需要注意的是,Claude没有访问任何内置的服务器端工具。所有工具都必须由您(用户)在每个API请求中明确提供。这让您可以完全控制和灵活地使用Claude可以使用的工具。
计算机使用(测试版)功能是一个例外 - 它引入了由Anthropic提供但由您(用户)实现的工具。
如何实现工具使用
选择模型
通常,对于复杂工具和模糊查询,使用Claude 3.5 Sonnet或Claude 3 Opus;它们能更好地处理多个工具,并在需要时寻求澄清。
对于简单的工具,使用Claude 3.5 Haiku或Claude 3 Haiku,但请注意它们可能会推断缺失的参数。
指定工具
工具在API请求的顶级tools
参数中指定。每个工具定义包括:
参数 | 描述 |
---|---|
name | 工具的名称。必须匹配正则表达式^[a-zA-Z0-9_-]{1,64}$ 。 |
description | 详细的纯文本描述,说明工具的功能、使用时机和行为方式。 |
input_schema | 一个JSON Schema对象,定义工具的预期参数。 |
工具使用系统提示
当您使用tools
参数调用Anthropic API时,我们会从工具定义、工具配置和任何用户指定的系统提示构建一个特殊的系统提示。构建的提示旨在指导模型使用指定的工具并提供工具正常运行所需的必要上下文:
工具定义的最佳实践
要在使用工具时获得最佳性能,请遵循以下准则:
- 提供极其详细的描述。 这是影响工具性能最重要的因素。您的描述应该解释工具的每个细节,包括:
- 工具的功能
- 何时使用(以及何时不使用)
- 每个参数的含义及其如何影响工具的行为
- 任何重要的注意事项或限制,例如如果工具名称不清晰,工具不会返回哪些信息。您能为Claude提供的关于工具的上下文越多,它就越能更好地决定何时以及如何使用它们。每个工具描述至少应该有3-4个句子,如果工具复杂,则需要更多。
- 优先考虑描述而不是示例。 虽然您可以在工具的描述或随附的提示中包含如何使用工具的示例,但这不如对工具的目的和参数有清晰和全面的解释重要。只有在完全充实描述后才添加示例。
好的描述清楚地解释了工具的功能、何时使用、返回什么数据以及ticker
参数的含义。糟糕的描述过于简短,让Claude对工具的行为和用法产生了许多疑问。
控制Claude的输出
强制使用工具
在某些情况下,您可能希望Claude使用特定工具来回答用户的问题,即使Claude认为不使用工具也能提供答案。您可以通过在tool_choice
字段中指定工具来实现这一点:
在使用tool_choice参数时,我们有三种可能的选项:
auto
允许Claude决定是否调用任何提供的工具。这是默认值。any
告诉Claude它必须使用提供的工具之一,但不强制使用特定工具。tool
允许我们强制Claude始终使用特定工具。
此图说明了每个选项的工作原理:
请注意,当tool_choice
为any
或tool
时,我们会预填充助手消息以强制使用工具。这意味着即使明确要求,模型也不会在tool_use
内容块之前发出链式思维text
内容块。
我们的测试表明这不应该降低性能。如果您想在请求模型使用特定工具的同时保持链式思维(特别是使用Opus时),您可以使用{"type": "auto"}
作为tool_choice
(默认值),并在user
消息中添加明确的指示。例如:伦敦的天气如何?在您的回答中使用get_weather工具。
JSON输出
工具不一定需要是客户端函数 — 只要您希望模型返回遵循提供的模式的JSON输出,就可以使用工具。例如,您可以使用具有特定模式的record_summary
工具。有关完整的工作示例,请参见工具使用示例。
链式思维
在使用工具时,Claude通常会显示其”链式思维”,即它用来分解问题并决定使用哪些工具的逐步推理。如果tool_choice
设置为auto
(这是默认值,请参见强制使用工具),Claude 3 Opus模型会这样做,而Sonnet和Haiku可以通过提示来实现这一点。
例如,给定提示”旧金山现在的天气如何,那里现在几点了?“,Claude可能会回应:
这种链式思维让我们了解Claude的推理过程,并可以帮助调试意外行为。
对于Claude 3 Sonnet模型,默认情况下链式思维不太常见,但您可以通过在用户消息或系统提示中添加类似"在回答之前,请在标签中逐步解释您的推理。"
的内容来提示Claude显示其推理。
重要的是要注意,虽然<thinking>
标签是Claude用来表示其链式思维的常见约定,但确切的格式(例如这个XML标签的名称)可能会随时间变化。您的代码应该像处理任何其他助手生成的文本一样处理链式思维,而不要依赖于<thinking>
标签的存在或特定格式。
禁用并行工具使用
默认情况下,Claude可能会使用多个工具来回答用户查询。您可以通过在tool_choice
字段中设置disable_parallel_tool_use=true
来禁用此行为。
- 当
tool_choice
类型为auto
时,这确保Claude最多使用一个工具 - 当
tool_choice
类型为any
或tool
时,这确保Claude恰好使用一个工具
处理工具使用和工具结果内容块
当Claude决定使用您提供的工具之一时,它将返回一个stop_reason
为tool_use
的响应,以及API响应中的一个或多个tool_use
内容块,包括:
id
:此特定工具使用块的唯一标识符。这将用于稍后匹配工具结果。name
:正在使用的工具的名称。input
:包含传递给工具的输入的对象,符合工具的input_schema
。
当您收到工具使用响应时,您应该:
- 从
tool_use
块中提取name
、id
和input
。 - 在您的代码库中运行与该工具名称对应的实际工具,传入工具
input
。 - [可选]通过发送一个
role
为user
的新消息继续对话,该消息包含tool_result
类型的content
块和以下信息:tool_use_id
:这是结果对应的工具使用请求的id
。content
:工具的结果,可以是字符串(例如"content": "15度"
)或嵌套内容块的列表(例如"content": [{"type": "text", "text": "15度"}]
)。这些内容块可以使用text
或image
类型。is_error
(可选):如果工具执行导致错误,则设置为true
。
收到工具结果后,Claude将使用该信息继续生成对原始用户提示的响应。
与其他API的区别
与分离工具使用或使用特殊角色如tool
或function
的API不同,Anthropic的API将工具直接集成到user
和assistant
消息结构中。
消息包含text
、image
、tool_use
和tool_result
块的数组。user
消息包括客户端内容和tool_result
,而assistant
消息包含AI生成的内容和tool_use
。
故障排除错误
在使用Claude的工具时可能会出现几种不同类型的错误:
工具使用示例
以下是演示各种工具使用模式和技术的几个代码示例。为了简洁起见,这些工具都是简单工具,工具描述也比确保最佳性能所需的要短。
定价
工具使用请求的定价与任何其他Claude API请求相同,基于发送给模型的输入令牌总数(包括tools
参数中的)和生成的输出令牌数。
工具使用带来的额外令牌来自:
- API请求中的
tools
参数(工具名称、描述和模式) - API请求和响应中的
tool_use
内容块 - API请求中的
tool_result
内容块
当您使用tools
时,我们还会自动为模型包含一个特殊的系统提示,以启用工具使用。每个模型所需的工具使用令牌数量如下所示(不包括上面列出的额外令牌):
模型 | 工具选择 | 工具使用系统提示令牌数 |
---|---|---|
Claude 3.5 Sonnet (Oct) | auto any , tool | 346个令牌 313个令牌 |
Claude 3 Opus | auto any , tool | 530个令牌 281个令牌 |
Claude 3 Sonnet | auto any , tool | 159个令牌 235个令牌 |
Claude 3 Haiku | auto any , tool | 264个令牌 340个令牌 |
Claude 3.5 Sonnet (June) | auto any , tool | 294个令牌 261个令牌 |
这些令牌数量会添加到您的正常输入和输出令牌中,以计算请求的总成本。有关当前每个模型的价格,请参阅我们的模型概述表。
当您发送工具使用提示时,就像任何其他API请求一样,响应将输出输入和输出令牌数作为报告的usage
指标的一部分。
下一步
在我们的cookbook中探索现成的工具使用代码示例:
Was this page helpful?