Claude 外部工具使用:从原理到实战开发
课程说明:本课程将深度解析 Claude 的“外部工具使用”(Tool Use/Function Calling)机制。通过本课程,您将学习如何打破 AI 的知识边界,让 Claude 能够实时获取天气、操作数据库、甚至像程序员一样编辑文件。
第一课:工具使用机制全解析
1.1 为什么需要工具?
默认情况下,Claude 仅拥有训练数据中的知识,无法获知实时信息(如“今天的天气”)。外部工具为 Claude 创建了一个结构化的通道,允许它根据需求向外部系统请求并接收最新数据。
1.2 工具调用的闭环流程
工具调用遵循一个清晰的往返模式:
- 基础请求:您向 Claude 发送问题,并提供可调用的工具说明(模式)。
- 工具请求:Claude 分析问题发现需要额外信息,返回一个包含具体参数的“工具调用请求”。
- 数据检索:您的服务器解析该请求,执行相应的代码(访问 API 或数据库)。
- 最终响应:您将获取的数据返回给 Claude,Claude 结合原始问题与新数据生成最终答案。
1.3 核心优势
- 实时性:获取训练日期之后的最新资讯。
- 系统集成:连接数据库、第三方仓库或内部服务。
- 动态交互:基于最新可用信息提供精准回答。
第二课:实战项目:智能提醒系统
核心逻辑:我们将构建一个提醒系统,通过工具解决 AI 的三个弱点:
- 时间感模糊:模型知道日期但不一定知道精确的时间。
- 日期计算困难:对于“下周四”这种计算,AI 容易出错。
- 缺乏执行力:AI 无法自行执行“设置提醒”的操作。
规划所需工具
get_current_datetime:获取当前精确时间。add_duration_to_datetime:精确计算未来时间戳。set_reminder:在系统中正式录入提醒。
第三课:编写工具函数与定义模式 (Schema)
3.1 编写工具函数 (Tool Functions)
工具函数是普通的 Python 函数。 最佳实践:
- 描述性命名:函数名和参数名应明确表达意图。
- 输入校验:在函数内部检查参数合法性。
- 异常处理:返回清晰的错误信息,Claude 看到错误后可能会尝试修正参数重新调用。
def get_current_datetime(date_format="%Y-%m-%d %H:%M:%S"):
if not date_format:
raise ValueError("日期格式不能为空")
return datetime.now().strftime(date_format)3.2 定义 JSON 模式 (JSON Schema)
模式是交给 Claude 阅读的“说明书”,包含三个部分:
- name:工具名称。
- description:详细描述工具用途(建议 3-4 句)。
- input_schema:参数的类型、描述及是否必填。
💡 小技巧:您可以将函数代码发给 Claude,让它基于 Anthropic 规范自动为您生成标准的 JSON 模式。
第四课:API 交互与多块消息处理
4.1 开启工具支持
在 API 调用中,通过 tools 参数传入您的模式列表:
response = client.messages.create(
model="claude-3-5-sonnet",
tools=[get_current_datetime_schema],
messages=messages
)4.2 解析多块消息 (Multi-block Messages)
当 Claude 决定使用工具时,返回的消息包含多个块:
- 文本块 (Text Block):解释它要做什么。
- 工具调用块 (ToolUse Block):包含唯一的
id、函数名及经过格式化的input参数。
历史记录管理:必须完整保存这些块(包括 tool_use 块)到对话历史中,否则 Claude 会丢失上下文。
第五课:多轮对话与自动化循环 (Conversation Loop)
核心逻辑:复杂任务(如计算后提醒)需要多轮对话。我们需要建立一个循环,持续运行直到 Claude 不再请求工具。
5.1 检测终止原因 (Stop Reason)
通过检查响应中的 stop_reason 来决定循环是否继续:
- 如果
stop_reason == "tool_use":代表需要执行工具并返回结果。 - 如果
stop_reason != "tool_use":代表对话已完成。
5.2 自动化循环结构
def run_conversation(messages):
while True:
response = chat(messages, tools=all_tools)
add_assistant_message(messages, response)
if response.stop_reason != "tool_use":
break # 最终回复已生成
tool_results = run_tools(response) # 执行工具并封装为 tool_result 块
add_user_message(messages, tool_results)
return messages第六课:进阶技巧:批量工具与结构化数据提取
6.1 批量工具 (Batch Tool)
有时 Claude 会依次请求多个工具,产生多次往返。您可以定义一个 batch_tool,引导 Claude 在一个请求中打包所有需要的操作,从而大幅降低 API 延迟。
6.2 强制工具调用 (Tool Choice)
如果您只需要 Claude 提取结构化数据(如 JSON),可以使用 tool_choice 参数:
{"type": "auto"}:模型自动决定(默认)。{"type": "any"}:强制使用任意工具。{"type": "tool", "name": "my_tool"}:强制且仅使用指定的工具。
第七课:流式传输中的工具调用 (Streaming)
开启流式传输时,工具相关的事件有所不同:
- 输入 JSON 事件 (InputJsonEvent):实时推送生成的参数碎片。
partial_json:当前的片段。snapshot:当前已构建完成的完整 JSON 镜像。
- 精细化调用 (Fine-grained):默认情况下,API 会缓冲并校验 JSON。如果您需要极速响应,可以开启
fine_grained=True以获取原始碎片(需自行处理不完整的 JSON 语法)。
第八课:内置工具:文本编辑器与网页搜索
8.1 文本编辑器工具 (Text Editor Tool)
可以让 Claude 查看目录、读取文件范围、甚至是执行 str_replace。您无需定义模式,但需要根据 Claude 提供的操作指令在服务器端编写具体的执行代码。
8.2 网页搜索工具 (Web Search Tool)
- 配置:设置
max_uses限制搜索次数。 - 域限制:使用
allowed_domains将搜索范围锁定在权威站点(如nih.gov)。 - 引用与透明度:响应会包含引用块(Citations),详细展示信息来源。
结语:能力扩展的阶梯
- 从简单到复杂:先实现单一工具,再构建自动化循环。
- 安全性首位:工具意味着赋予 AI 行动力,务必在本地代码中做好权限校验。
- 模式驱动:高质量的描述(Description)是工具调用成功率的关键。
© 内容基于技术文档整理 | 外部工具集成实战手册
测验题 (Quiz)
- 如何判断对话中 Claude 是否想要发起另一次工具调用?
- [ ] A. 检查回复中是否包含 "tool" 单词
- [ ] B. 检查回复是否比平时更长
- [ ] C. 检查
stop_reason字段是否为"tool_use" - [ ] D. 计算消息块的数量
- 当 Claude 使用工具时,它返回什么类型的消息结构?
- [ ] A. 包含文本块 (Text Block) 和工具调用块 (Tool Use Block) 的多块消息
- [ ] B. 简单的纯文本回复
- [ ] C. 不含文本的纯 JSON 数据
- [ ] D. 仅返回错误信息
- JSON 模式 (JSON Schema) 在 Claude 工具中的主要作用是什么?
- [ ] A. 为用户格式化最终回复
- [ ] B. 告知 Claude 预期的参数以及如何使用该工具
- [ ] C. 存储工具函数调用的结果
- [ ] D. 加密 Claude 与服务器之间的数据
- 批量工具 (Batch Tool) 解决了什么问题?
- [ ] A. 让工具运行得更快
- [ ] B. 将工具结果翻译成不同语言
- [ ] C. 减少需要多个工具时产生的往返通信次数
- [ ] D. 自动修复工具回复中的错误
- 工具使用流程的正确顺序是?
- [ ] A. 基础请求 → 工具请求 → 数据检索 → 最终响应
- [ ] B. 工具请求 → 基础请求 → 最终响应 → 数据检索
- [ ] C. 最终响应 → 基础请求 → 工具请求 → 数据检索
- [ ] D. 数据检索 → 工具请求 → 基础请求 → 最终响应
- Claude 默认只能访问训练数据。什么能让它获取实时的最新信息?
- [ ] A. 基于模式进行合理的猜测
- [ ] B. 更仔细地搜索训练数据
- [ ] C. 要求用户提供更多细节
- [ ] D. 使用工具访问外部信息
- Claude 内置的文本编辑器和网页搜索工具与自定义工具有何不同?
- [ ] A. Claude 已提供模式定义,但你仍需在服务器端实现具体功能
- [ ] B. 它们需要特殊的 API 密钥
- [ ] C. 它们仅支持特定的文件类型
- [ ] D. 使用成本更高
测验题参考答案
- C (检查
stop_reason字段是否为"tool_use") - A (多块消息,且包含唯一的工具调用 ID)
- B (模式充当了 Claude 阅读的“工具说明书”)
- C (通过一次请求打包多个操作以降低延迟)
- A (经典的闭环往返流程)
- D (通过定义结构化的外部通道让 AI 具备“行动力”)
- A (内置工具仅内置了协议约定,服务端实现仍需手动完成)
© 内容基于技术文档整理 | 外部工具集成实战手册