Claude API 进阶 Tool Use:三招降本提准
工具调用最常见的失败不是“模型不会调用 API”,而是工具定义塞满 context、参数填错、以及中间结果反复进出模型。先定位是哪一种,再选择 Tool Search、Programmatic Tool Calling 或 input_examples;三种能力不是互相替代。
先看决策表
| 症状 | 首选能力 | 原因 | 不要做什么 |
|---|---|---|---|
| 有 20 个以上工具,每轮只用少数几个 | Tool Search | 延迟加载工具定义 | 把所有 schema 固定塞进 system prompt |
| 一次任务要批量调用、过滤、循环 | Programmatic Tool Calling | 中间结果留在执行环境 | 让模型逐条读 10,000 行数据 |
| 工具选对了,但日期或嵌套参数常填错 | input_examples | 展示 schema 无法表达的调用惯例 | 用一段模糊 description 解释所有边界 |
| 工具少且调用链短 | 普通 Tool Use | 实现最简单 | 为了“高级”引入沙箱和额外延迟 |
官方当前把这几种方法放在同一套 Tool Context 管理框架中:Tool Search 减少预加载定义,程序化调用减少 tool_result 往返,Prompt Caching 降低重复前缀成本,Context Editing 清掉已经失去价值的旧结果。
1. Tool Search:只加载本轮需要的定义
Tool Search 的适用条件不是“接了 MCP”,而是工具目录已经大到影响 baseline context。工具标记为 defer_loading: true 后,定义不会一开始就进入 prompt;Claude 先搜索,再通过 tool_reference 加载命中的工具。
import os
from anthropic import Anthropic
client = Anthropic()
tools = [
{
"type": "tool_search_tool_regex_20251119",
"name": "tool_search",
},
{
"name": "get_customer_orders",
"description": "Return orders for one customer. Use for order history, not account details.",
"defer_loading": True,
"input_schema": {
"type": "object",
"properties": {"customer_id": {"type": "string"}},
"required": ["customer_id"],
},
},
]
response = client.messages.create(
model=os.environ["ANTHROPIC_MODEL"],
max_tokens=1200,
tools=tools,
messages=[{"role": "user", "content": "查客户 C-1042 最近三笔订单"}],
)
Tool Search 验收标准
- 首轮 prompt 中没有被延迟工具的完整 schema。
- 搜索结果能区分名称相近但职责不同的工具。
- 工具描述写清楚 什么时候用、什么时候不用。
- 记录搜索命中率、额外延迟和输入 token,而不是只看回答是否正确。
2. Programmatic Tool Calling:把批处理留在沙箱里
程序化工具调用允许 Claude 在 Code Execution 沙箱里写代码,再由代码调用被授权的工具。适合 fan-out、聚合、过滤和条件分支;中间结果不会逐项进入对话历史。
tools = [
{"type": "code_execution_20260120", "name": "code_execution"},
{
"name": "get_service_health",
"description": "Return health and latency for one service.",
"allowed_callers": ["code_execution_20260120"],
"input_schema": {
"type": "object",
"properties": {"service": {"type": "string"}},
"required": ["service"],
},
},
]
用户请求“找出 50 个服务里延迟超过 500ms 的项目”时,正确的数据路径是:
Claude 写循环
→ 沙箱并发调用 get_service_health
→ 在沙箱中过滤 latency_ms > 500
→ 只把异常服务返回 context
严格串行、每一步都需要模型重新判断的任务不适合这种模式。那种场景无法减少模型回合,却增加了代码执行和沙箱开销。
3. input_examples:修复“选对工具,填错参数”
JSON Schema 能定义类型,却不擅长表达团队惯例。例如日期必须是业务时区、可选字段必须成对出现、或数组内元素需要特定组合。这时才加 input_examples。
{
"name": "create_incident",
"description": "Create an incident after an alert has been verified. Do not use for unverified alerts.",
"input_schema": {
"type": "object",
"properties": {
"service": {"type": "string"},
"severity": {"type": "string", "enum": ["sev1", "sev2", "sev3"]},
"started_at": {"type": "string", "description": "ISO 8601 with timezone"},
"evidence_urls": {"type": "array", "items": {"type": "string"}},
},
"required": ["service", "severity", "started_at", "evidence_urls"],
},
"input_examples": [
{
"service": "checkout-api",
"severity": "sev2",
"started_at": "2026-08-25T09:42:00+10:00",
"evidence_urls": ["https://monitor.example/incidents/abc"],
}
],
}
示例本身也占 token,所以只给误填率高的工具添加。先修 description,再补 example,最后才考虑在 prompt 里堆更多规则。
一套可复用的上线流程
- 从 trace 里统计三类失败:选错工具、参数不合法、结果过大。
- 为每类失败只引入一种控制变量。
- 建立 30–100 条真实任务 eval,不用演示用 happy path。
- 比较成功率、输入 token、工具轮数、P95 延迟和总成本。
- 达到阈值后灰度发布,并保留普通 Tool Use 回退路径。
完成标准
- 工具选择准确率没有下降。
- Schema 校验失败率低于团队设定阈值。
- 大结果在进入模型前完成过滤。
- 每项节省都有 trace 或账单证据,不写“显著降低”这种空结论。
常见错误
| 错误 | 根因 | 修法 |
|---|---|---|
| Tool Search 找不到工具 | 名称和 description 太泛 | 写清业务对象、使用条件和排除条件 |
| Deferred 工具破坏缓存 | 工具数组或 cache breakpoint 放置不当 | 保持稳定前缀,在非 deferred 工具上设置断点 |
| 程序化调用输出仍很大 | 代码只是批量调用,没有过滤 | 在沙箱里聚合,只返回决策所需字段 |
input_examples 收效甚微 | 错误其实是选错工具 | 先修工具边界,不要拿示例补职责冲突 |
| 本地 eval 很好,上线变差 | 任务集过于理想化 | 从生产 trace 抽样并覆盖超时、空结果、权限错误 |
动手练习
假设你有订单、客户、退款、库存、物流共 35 个工具。选一个“调查延迟订单”的任务:
- 标出本轮真正需要的 3–5 个工具。
- 为其余工具配置延迟加载。
- 用程序化调用并发查询订单与物流状态。
- 为退款工具补一个包含时区和证据链接的 input example。
- 用相同 20 条任务比较普通调用与新方案。
自检
- 我能解释三种能力分别减少哪一种失败。
- 我没有把官方示例中的版本字符串当成永久常量。
- 我为成本、延迟、准确率分别留了指标。
- 我能在新方案失败时回退到普通 Tool Use。
相关阅读
参考资料
📚 相关资源
❓ 常见问题
点击问题,查看本章对应的实践答案。
这三个特性还需要 beta header 吗?
不需要。Tool Search、程序化工具调用(PTC)和 input_examples 目前都已在 Claude API 正式可用,直接用普通的 messages.create 即可。早期资料里的 advanced-tool-use-2025-11-20 header 已过时。注意平台差异:PTC 不支持 Amazon Bedrock 和 Google Cloud,Tool Search 在 Bedrock 上只走 InvokeModel API。
Tool Search 能省多少 token?会不会破坏 prompt cache?
官方数据:典型多 MCP server 配置的工具定义约 55k token,Tool Search 通常能降低 85% 以上,每次只加载 3-5 个需要的工具。它对缓存是友好的——deferred 工具不进 system prompt 前缀,搜到的工具以 tool_reference 追加,前缀不变、缓存不失效。唯一限制是 cache_control 断点必须打在非 defer 的工具上,否则 400。
什么情况下不该用程序化工具调用(PTC)?
严格串行的工作流——每次调用都依赖 Claude 对上一个结果的推理时,脚本省不掉模型回合,容器启动的固定开销反而让你倒贴:官方在 τ²-bench 上实测分数不变、成本高出约 8%。PTC 的强项是 fan-out(查 50 台服务器)、大结果先过滤再进上下文、以及带循环/条件的批处理。另外 strict: true、MCP connector 工具、disable_parallel_tool_use 都与 PTC 不兼容。
input_examples 和写好 description 应该优先做哪个?
先写 description——官方明确说详细描述是工具调用质量的第一影响因素。input_examples 是补充手段,专治 schema 表达不了的"惯例":日期格式、可选参数何时一起出现、嵌套结构怎么组织。每个示例必须通过 input_schema 校验(否则 400),且计入 prompt token(简单 20-50、复杂嵌套 100-200/个),所以只给最容易填错的工具加,不要每个工具无脑加。