使用 Claude 执行工具调用的指南
Claude 能够与外部客户端工具和函数交互,允许您使用自己的自定义工具来装备 Claude,以执行更广泛的任务。现在,对于使用 Anthropic Messages API、Amazon Bedrock 和 Google Vertex AI 的开发人员,工具使用功能已在整个 Claude 3 模型系列中普遍可用!以下是如何使用 Messages API 为 Claude 提供工具的示例:
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-3-opus-20240229",
"max_tokens": 1024,
"tools": [
{
"name": "get_weather",
"description": "获取给定位置的当前天气",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市和州,例如旧金山,加利福尼亚州"
}
},
"required": ["location"]
}
}
],
"messages": [
{
"role": "user",
"content": "旧金山的天气如何?"
}
]
}'
工具使用的工作原理
使用 Claude 的工具涉及以下步骤:
- 为 Claude 提供工具和用户提示:(API 请求)
- 定义您希望 Claude 访问的工具集,包括它们的名称、描述和输入模式。
- 提供一个用户提示,可能需要使用一个或多个这些工具来回答,例如“旧金山的天气如何?”。
- Claude 使用工具:(API 响应)
- Claude 评估用户提示,并决定是否有任何可用工具可以帮助回答用户的查询或任务。如果是,它还会决定使用哪些工具以及使用什么输入。
- Claude 构造格式正确的工具使用请求。
- API 响应将具有 stop_reason 为 tool_use,表示 Claude 想要使用外部工具。
- 提取工具输入,运行代码并返回结果:(API 请求)
- 在客户端,您应该从 Claude 的工具使用请求中提取工具名称和输入。
- 在客户端运行实际的工具代码。
- 通过使用包含 tool_result 内容块的新 user 消息继续对话,将结果返回给 Claude。
- Claude 使用工具结果来制定响应:(API 响应)
- 在收到工具结果后,Claude 将使用该信息来制定对原始用户提示的最终响应。
步骤 (3) 和 (4) 是可选的 - 对于某些工作流,Claude 使用工具就是您需要的所有信息,您可能不需要将工具结果返回给 Claude。
指定工具
工具在 API 请求的 tools
顶级参数中指定。每个工具定义包括:
name
:工具的名称。必须匹配正则表达式^[a-zA-Z0-9_-]{1,64}$
。description
:对工具功能、何时使用以及如何运作的详细纯文本描述。input_schema
:定义工具预期参数的 JSON Schema 对象。
以下是一个简单的工具定义示例:
{
"name": "get_weather",
"description": "获取给定位置的当前天气",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市和州,例如旧金山,加利福尼亚州"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位,'celsius' 或 'fahrenheit'"
}
},
"required": ["location"]
}
}
工具使用和工具结果内容块
当 Claude 决定使用您提供的工具之一时,它将返回一个 stop_reason 为 tool_use
的响应,并在 API 响应中包含一个或多个 tool_use
内容块,其中包括:
id
:此特定工具使用块的唯一标识符。name
:正在使用的工具的名称。input
:包含传递给工具的输入的对象,符合工具的input_schema
。
以下是包含 tool_use
内容块的 API 响应示例:
{
"id": "msg_01Aq9w938a90dw8q",
"model": "claude-3-opus-20240229",
"stop_reason": "tool_use",
"role": "assistant",
"content": [
{
"type": "text",
"text": "<thinking>我需要使用 get_weather,用户想要 SF,这可能是旧金山,加利福尼亚州。</thinking>"
},
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": {"location": "San Francisco, CA", "unit": "celsius"}
}
]
}
在收到工具使用响应时,您应该:
- 从
tool_use
块中提取name
、id
和input
。 - 在您的代码库中运行与该工具名称对应的实际工具,传入工具
input
。 - 通过发送一个新消息继续对话,其中 role 为 user,content 块包含tool_result 类型和以下信息:
tool_use_id
:这是结果对应的工具使用请求的id
。content
:工具的结果,作为字符串或嵌套内容块的列表。is_error
(可选):如果工具执行导致错误,则设置为true
。
以下是返回成功工具结果的示例:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "15 度"
}
]
}
错误处理
在使用 Claude 的工具时可能会发生几种不同类型的错误:
工具执行错误: 如果工具在执行过程中抛出错误(例如获取天气数据时的网络错误),您可以在
content
中返回错误消息以及is_error
:true
:{ "role": "user", "content": [ { "type": "tool_result", "tool_use_id": "toolu_01A09q90qw90lq917835lq9", "content": "ConnectionError: 天气服务 API 不可用(HTTP 500)", "is_error": true } ] }
超过最大令牌数: 如果由于达到
max_tokens
限制而截断了 Claude 的响应,并且截断的响应包含不完整的工具使用块,则需要使用更高的max_tokens
值重试请求以获取完整的工具使用。无效的工具使用: 如果 Claude 尝试使用工具无效(例如缺少必需参数),通常意味着没有足够的信息供 Claude 正确使用该工具。您可以返回错误响应,Claude 通常会使用填充了缺失信息的请求重试。
强制工具使用
在某些情况下,您可能希望 Claude 使用特定工具来回答用户的问题。您可以通过在 tool_choice
字段中指定工具来做到这一点:
"tool_choice": {"type": "tool", "name": "get_weather"}
工具使用最佳实践和限制
在使用 Claude 的工具时,请记住以下限制和最佳实践:
- 使用 Claude 3 Opus 处理复杂的工具使用,如果处理简单的工具则使用 Haiku。
- 工具数量:即使使用数百个简单工具,所有 Claude 3 模型仍可保持 >90% 的准确性。
- 复杂和深度嵌套的工具:尝试将输入模式从深度嵌套的 JSON 对象扁平化,并减少输入的数量。
- 顺序工具使用:设计工作流程和工具,以引出并使用来自 Claude 的一系列顺序工具。
- 重试:如果 Claude 的工具使用请求无效或缺少必需参数,可以返回错误响应,Claude 通常会使用填充了缺失信息的请求重试。
总结
工具使用是一种强大的技术,通过将 Claude 连接到外部数据源和功能来扩展其能力。使用设计良好的工具集,您可以使 Claude 能够处理大量仅凭其基础