一、Claude Tool Use 工作流程概述
Claude 的 Tool Use 功能允许模型调用外部工具来增强其能力,特别适用于数学计算、信息检索等任务。
1. 工具调用响应机制
响应类型判断:通过检查 API 响应中的 stop_reason
字段来判断是否需要调用工具。
stop_reason: "tool_use"
表示需要调用工具。stop_reason: "end_turn"
表示正常对话结束。工具调用响应结构:包含 ToolUseBlock
,其中包含:
2. 工具结果的本地运行与返回
执行步骤:
- 从响应中提取工具名称和输入参数。本地调用对应函数并传入参数。准备结果返回消息,包含
tool_use_id
和 content
。错误处理:通过设置 is_error
标志来传递执行异常信息。
3. 工具使用结果的最终响应
- 结果整合:Claude 根据
tool_result
信息生成最终响应。智能处理:能够解析错误信息并指导用户调整输入。4. 可选步骤与工作流程
- 流程灵活性:步骤 2 和 3(本地执行和结果返回)是可选的。简化场景:当仅需工具调用建议时,可止步于获取 Claude 的工具使用请求。
二、应用案例
1. 数学计算助手
大模型在进行数学计算时可能不够精确,例如将 1,984,135 * 9,343,116
错误计算为 18,576,948,360,060
,而实际应为 18,538,003,464,660
。(Composio)
解决方案:通过工具增强能力,本地定义计算器函数(含加减乘除),让模型调用而非自行计算。
实现要点:
- 需准备两个要素:函数 JSON 描述和本地可执行函数。函数入参设计需考虑:操作类型(enum 限定加减乘除)、两个操作数(必须参数)。
示例代码:
import redef calculate(expression): # 移除表达式中的非数字和运算符字符 expression = re.sub(r'[^0-9+-*/().]', '', expression) try: # 使用 eval() 计算表达式 result = eval(expression) return str(result) except (SyntaxError, ZeroDivisionError, NameError, TypeError, OverflowError): return "Error: Invalid expression"
工具描述:
tools = [ { "name": "calculator", "description": "一个简单的计算器,执行基本的算术运算。", "input_schema": { "type": "object", "properties": { "expression": { "type": "string", "description": "要计算的数学表达式(例如,'2 + 3 * 4')。" } }, "required": ["expression"] } }]
2. 发送邮件外部函数
函数描述规范:
name:需符合正则,如 "send_email"
。
description:明确功能说明,如 "向指定收件人发送带主题和内容的邮件"
。
input_schema:定义参数类型和约束。
- 必需参数:
to
(收件人邮箱)、subject
(主题)、body
(内容)。类型限定:均为 string
类型。开发技巧:建议复制标准模板后修改键值,保持 JSON 结构不变。
3. 搜索产品外部函数
参数设计特点:
- 枚举类型:
category
参数限定为 ["electronics","clothing","home","toys","sports"]
。可选参数:max_price
(number
类型)用于价格筛选。必需参数:仅 query
(产品名称/关键词)为必须。描述要点:每个参数需包含 type
、description
字段,如 query
的 description
应说明 "产品名称或搜索关键词,如 'iPhone 13 Pro'"
。
三、完整代码实现
以下是一个完整的示例,展示了如何使用 Claude 的 Tool Use 功能进行数学计算:
from anthropic import Anthropicclient = Anthropic()MODEL_NAME = "claude-3-opus-20240229"def process_tool_call(tool_name, tool_input): if tool_name == "calculator": return calculate(tool_input["expression"])def chat_with_claude(user_message): message = client.messages.create( model=MODEL_NAME, max_tokens=4096, messages=[{"role": "user", "content": user_message}], tools=tools, ) if message.stop_reason == "tool_use": tool_use = next(block for block in message.content if block.type == "tool_use") tool_name = tool_use.name tool_input = tool_use.input tool_result = process_tool_call(tool_name, tool_input) response = client.messages.create( model=MODEL_NAME, max_tokens=4096, messages=[ {"role": "user", "content": user_message}, {"role": "assistant", "content": message.content}, { "role": "user", "content": [ { "type": "tool_result", "tool_use_id": tool_use.id, "content": tool_result, } ], }, ], tools=tools, ) else: response = message final_response = next( (block.text for block in response.content if hasattr(block, "text")), None, ) print(f"\n最终响应: {final_response}") return final_response
测试示例:
chat_with_claude("计算 1984135 * 9343116 的结果是多少?")
四、扩展工作流
完整的五步流程:
- 提供工具描述和用户提示。Claude 决定是否使用工具。提取参数并本地执行。将结果返回 Claude。Claude 基于结果生成最终响应。
应用场景:
- 实时信息查询(如维基百科搜索)。专业领域数据加工。时效性内容处理。
五、Claude API 高级调用
1. tool_choice
参数及 JSON 格式回答
必需参数:
- model:指定 Claude 模型版本。messages:包含对话历史和当前输入的数组。max_tokens:回答的最大令牌数。
可选参数:
- temperature:控制响应随机性(0.0-1.0)。top_k:仅从前 K 个选项中抽样。
tool_choice
模式:
- auto:模型自主决定是否调用工具(默认)。any:必须使用提供的工具,但不指定特定工具。tool:强制使用指定的工具。none:禁止使用任何工具。(Anthropic)
示例:
tool_choice = {"type": "tool", "name": "get_weather"}
这将强制 Claude 使用 get_weather
工具来回答用户的问题。(Anthropic)