跳到正文
北京时间
原文
Anthropic:Newsroom·· 2025-11-24精选AI 评分74

Anthropic 在 Claude 开发者平台推出高级工具使用功能

Introducing advanced tool use on the Claude Developer Platform

AI 导读

Anthropic 在 Claude 开发者平台发布三项 beta 功能:Tool Search Tool、Programmatic Tool Calling 和 Tool Use Examples。

推荐理由

官方给出了三项功能的机制说明和内部测试数字,开发者可据此判断大型工具库下如何节省上下文与提升调用准确率。

正文 · AI 翻译

AI 智能体的未来是模型能够在数百或数千种工具之间无缝协作。一个集成 git 操作、文件操作、包管理器、测试框架和部署流水线的 IDE 助手。一个同时连接 Slack、GitHub、Google Drive、Jira、公司数据库和数十个 MCP 服务器的运营协调器。

要构建高效的智能体,它们需要能够使用无限的工具库,而不必事先把每个定义都塞进上下文。我们关于使用 MCP 进行代码执行的博客文章讨论了工具结果和定义有时会在智能体读取请求之前就消耗 50,000+ 个 token。智能体应当按需发现和加载工具,只保留与当前任务相关的内容。

智能体还需要具备从代码中调用工具的能力。使用自然语言工具调用时,每次调用都需要一次完整的推理过程,而中间结果无论是否有用都会堆积在上下文中。代码天然适合编排逻辑,例如循环、条件判断和数据转换。智能体需要能够根据手头任务在代码执行和推理之间灵活选择。

智能体还需要从示例中学习正确的工具用法,而不仅仅是模式定义。JSON 模式定义了结构上有效的内容,但无法表达使用模式:何时包含可选参数、哪些组合是合理的,或者你的 API 期望什么约定。

今天,我们发布三项功能来实现这一点:

  • Tool Search Tool,它允许 Claude 使用搜索工具访问数千种工具,而不消耗其上下文窗口
  • Programmatic Tool Calling,它允许 Claude 在代码执行环境中调用工具,从而减少对模型上下文窗口的影响
  • Tool Use Examples,它提供了一个通用标准,用于演示如何有效使用给定工具

在内部测试中,我们发现这些功能帮助我们构建了传统工具使用模式无法实现的东西。例如, Claude for Excel 使用 Programmatic Tool Calling 读取和修改包含数千行的电子表格,而不会使模型的上下文窗口过载。

基于我们的经验,我们相信这些功能为你用 Claude 构建的东西开辟了新的可能性。

Video thumbnail

Tool Search Tool

挑战

MCP 工具定义提供了重要的上下文,但随着更多服务器连接,这些 token 会不断累积。考虑一个五服务器配置:

  • GitHub:35 个工具(约 26K token)
  • Slack:11 个工具(约 21K token)
  • Sentry:5 个工具(约 3K token)
  • Grafana:5 个工具(约 3K token)
  • Splunk:2 个工具(约 2K token)

这就是 58 个工具,在对话甚至还没开始时就消耗约 55K 个 token。再添加更多服务器,比如 Jira(仅它自己就使用约 17K token),你很快就会接近 100K+ token 的开销。在 Anthropic,我们见过工具定义在优化前消耗 134K 个 token。

但 token 成本并不是唯一的问题。最常见的失败是工具选择错误和参数不正确,尤其是当工具名称相似时,比如 notification-send-user 与 notification-send-channel。

我们的解决方案

Tool Search Tool 不预先加载所有工具定义,而是按需发现工具。Claude 只会看到当前任务实际需要的工具。

Tool Search Tool diagram

与 Claude 的传统方法相比,Tool Search Tool 保留了 191,300 个 token 的上下文,而传统方法为 122,800 个。

传统方法:

  • 所有工具定义预先加载(50+ 个 MCP 工具约需 72K tokens)
  • 对话历史和系统提示词争夺剩余空间
  • 任何工作开始前的总上下文消耗:约 77K tokens

使用 Tool Search Tool 时:

  • 仅预先加载 Tool Search Tool(约 500 tokens)
  • 工具按需发现(3-5 个相关工具,约 3K tokens)
  • 总上下文消耗:约 8.7K tokens,保留 95% 的上下文窗口

这意味着 token 用量减少了 85%,同时仍可访问完整的工具库。内部测试显示,在处理大型工具库时,MCP 评估的准确率显著提升。启用 Tool Search Tool 后,Opus 4 从 49% 提升至 74%,Opus 4.5 从 79.5% 提升至 88.1%。

Tool Search Tool 的工作原理

Tool Search Tool 让 Claude 动态发现工具,而不是预先加载所有定义。你将所有工具定义提供给 API,但用 defer_loading: true 标记工具,使其可按需被发现。延迟加载的工具最初不会载入 Claude 的上下文。Claude 只能看到 Tool Search Tool 本身以及带有 defer_loading: false 的工具(你最关键、最常用的工具)。

当 Claude 需要特定能力时,它会搜索相关工具。Tool Search Tool 返回匹配工具的引用,这些引用会在 Claude 的上下文中展开为完整定义。

例如,如果 Claude 需要与 GitHub 交互,它会搜索“github”,此时只会加载 github.createPullRequest 和 github.listIssues——而不是你在 Slack、Jira 和 Google Drive 中的其他 50+ 个工具。

这样,Claude 可以访问你的完整工具库,同时只为实际需要的工具支付 token 成本。

提示词缓存说明:Tool Search Tool 不会破坏提示词缓存,因为延迟加载的工具完全被排除在初始提示词之外。它们只在 Claude 搜索后才被添加到上下文中,因此你的系统提示词和核心工具定义仍可被缓存。

实现方式:

对于 MCP 服务器,你可以延迟加载整个服务器,同时保持特定高频工具处于加载状态:

Claude Developer Platform 开箱即用地提供基于正则表达式和基于 BM25 的搜索工具,但你也可以使用嵌入或其他策略实现自定义搜索工具。

何时使用 Tool Search Tool

与任何架构决策一样,启用 Tool Search Tool 需要权衡取舍。该功能在工具调用前增加了一个搜索步骤,因此当上下文节省和准确率提升超过额外延迟时,它的投资回报率最高。

适用场景:

  • 工具定义消耗超过 10K tokens
  • 遇到工具选择准确率问题
  • 构建由多个服务器支持的 MCP 系统
  • 可用工具数量在 10 个以上

收益较小的场景:

  • 工具库较小(少于 10 个工具)
  • 每个会话中所有工具都频繁使用
  • 工具定义较为紧凑

程序化工具调用

挑战

随着工作流变得更加复杂,传统工具调用产生了两个根本性问题:

  • 中间结果造成的上下文污染:当 Claude 分析一个 10MB 的日志文件以查找错误模式时,整个文件都会进入其上下文窗口,尽管 Claude 只需要错误频率的摘要。当跨多个表获取客户数据时,每条记录都会累积在上下文中,无论是否相关。这些中间结果消耗大量 token 预算,并可能将重要信息完全挤出上下文窗口。
  • 推理开销与手动综合:每次工具调用都需要一次完整的模型推理过程。收到结果后,Claude 必须“目测”数据以提取相关信息、推理各部分如何拼合,并决定下一步做什么——这一切都通过自然语言处理完成。一个包含五个工具的工作流意味着五次推理过程,外加 Claude 解析每个结果、比较数值并综合结论。这既慢又容易出错。

我们的解决方案

Programmatic Tool Calling 使 Claude 能够通过代码来编排工具,而不是通过一次次单独的 API 往返调用。Claude 不再一次请求一个工具、每个结果都返回其上下文,而是编写代码来调用多个工具、处理它们的输出,并控制哪些信息真正进入其上下文窗口。

Claude 擅长编写代码,通过让它用 Python 表达编排逻辑,而不是通过自然语言进行工具调用,你能获得更可靠、更精确的控制流。循环、条件、数据转换和错误处理都在代码中显式表达,而不是隐含在 Claude 的推理中。

示例:预算合规检查

考虑一个常见的业务任务:“哪些团队成员超出了第三季度差旅预算?”

你有三个可用工具:

  • get_team_members(department) - 返回团队成员列表,包含 ID 和级别
  • get_expenses(user_id, quarter) - 返回某用户的费用明细项
  • get_budget_by_level(level) - 返回某员工级别的预算上限

传统方式:

  • 获取团队成员 → 20 人
  • 对每个人,获取其第三季度费用 → 20 次工具调用,每次返回 50-100 条明细项(机票、酒店、餐饮、收据)
  • 按员工级别获取预算上限
  • 所有这些都进入 Claude 的上下文:2,000+ 条费用明细项(50 KB+)
  • Claude 手动汇总每个人的费用、查找其预算、将费用与预算上限进行比较
  • 更多模型往返、大量上下文消耗

使用 Programmatic Tool Calling:

不再让每个工具结果返回给 Claude,而是由 Claude 编写一个 Python 脚本编排整个工作流。脚本在 Code Execution 工具(沙箱环境)中运行,在需要你的工具返回结果时暂停。当你通过 API 返回工具结果时,这些结果由脚本处理,而不是被模型消费。脚本继续执行,Claude 只看到最终输出。

Programmatic tool calling flow

Programmatic Tool Calling 使 Claude 能够通过代码来编排工具,而不是通过一次次单独的 API 往返调用,从而实现工具的并行执行。

以下是 Claude 针对预算合规任务编写的编排代码:

Claude 的上下文只收到最终结果:超出预算的那两三个人。2,000+ 条明细项、中间汇总值和预算查询都不会影响 Claude 的上下文,将消耗从 200KB 的原始费用数据降至仅 1KB 的结果。

效率提升非常显著:

  • Token 节省:通过将中间结果排除在 Claude 的上下文之外,PTC 大幅降低了 token 消耗。在复杂研究任务上,平均用量从 43,588 降至 27,297 个 token,减少了 37%。
  • 降低延迟:每次 API 往返都需要模型推理(数百毫秒到数秒)。当 Claude 在单个代码块中编排 20+ 次工具调用时,你消除了 19+ 次推理过程。API 处理工具执行,无需每次都返回模型。
  • 更高的准确性:通过编写显式的编排逻辑,Claude 在同时处理多个工具结果时比用自然语言处理时犯的错误更少。内部知识检索从 25.6% 提升到 28.5%;GIA 基准测试从 46.5% 提升到 51.2%。

生产工作流涉及杂乱的数据、条件逻辑以及需要扩展的操作。Programmatic Tool Calling 让 Claude 以编程方式处理这种复杂性,同时将注意力集中在可操作的结果上,而不是原始数据处理上。

Programmatic Tool Calling 的工作原理

1. 将工具标记为可从代码中调用

将 code_execution 添加到 tools 中,并将 allowed_callers 设置为选择启用程序化执行的工具:

API 会将这些工具定义转换为 Claude 可以调用的 Python 函数。

2. Claude 编写编排代码

Claude 不再一次请求一个工具,而是生成 Python 代码:

3. 工具执行不会进入 Claude 的上下文

当代码调用 get_expenses() 时,你会收到一个带有 caller 字段的工具请求:

你提供结果,该结果会在 Code Execution 环境中处理,而不是在 Claude 的上下文中处理。这个请求-响应循环会针对代码中的每个工具调用重复进行。

4. 只有最终输出进入上下文

当代码运行完成后,只有代码的结果会返回给 Claude:

这就是 Claude 看到的全部内容,而不是沿途处理过的 2000 多个费用行项目。

何时使用 Programmatic Tool Calling

Programmatic Tool Calling 会为你的工作流增加一个代码执行步骤。当 token 节省、延迟改善和准确性提升非常显著时,这一额外开销是值得的。

在以下情况下最有益:

  • 处理大型数据集,而你只需要聚合结果或摘要
  • 运行包含三个或更多依赖工具调用的多步骤工作流
  • 在 Claude 看到工具结果之前对其进行过滤、排序或转换
  • 处理中间数据不应影响 Claude 推理的任务
  • 对许多项目运行并行操作(例如检查 50 个端点)

在以下情况下不太有益:

  • 进行简单的单工具调用
  • 处理 Claude 应查看并推理所有中间结果的任务
  • 运行响应较小的快速查询

Tool Use Examples

挑战

JSON Schema 擅长定义结构——类型、必填字段、允许的枚举值——但它无法表达使用模式:何时包含可选参数、哪些组合是合理的,或者你的 API 期望什么约定。

以一个支持工单 API 为例:

该 schema 定义了什么是有效的,但留下了关键问题未解答:

  • 格式歧义:due_date 应使用 "2024-11-06"、"Nov 6, 2024" 还是 "2024-11-06T00:00:00Z"?
  • ID 约定:reporter.id 是 UUID、"USR-12345",还是仅仅 "12345"?
  • 嵌套结构用法:Claude 应在何时填充 reporter.contact?
  • 参数相关性:escalation.level 和 escalation.sla_hours 与优先级有何关系?

这些歧义可能导致工具调用格式错误和参数使用不一致。

我们的解决方案

Tool Use Examples 让你直接在工具定义中提供示例工具调用。你不再仅依赖 schema,而是向 Claude 展示具体的使用模式:

从这三个示例中,Claude 可以学到:

  • 格式约定:日期使用 YYYY-MM-DD,用户 ID 遵循 USR-XXXXX,标签使用 kebab-case
  • 嵌套结构模式:如何构造带有嵌套 contact 对象的 reporter 对象
  • 可选参数关联:严重缺陷包含完整联系信息 + 升级路径,并配有严格的 SLA;功能请求包含报告人,但没有联系信息/升级路径;内部任务只有标题

在我们自己的内部测试中,工具使用示例将复杂参数处理的准确率从 72% 提升到了 90%。

何时使用工具使用示例

工具使用示例会增加工具定义中的 token 数量,因此当准确率提升超过额外成本时,它们最有价值。

最有价值的情况:

  • 复杂的嵌套结构,其中有效的 JSON 并不意味着正确的用法
  • 具有许多可选参数且包含模式很重要的工具
  • 具有领域特定约定、但未在 schema 中体现的 API
  • 相似的工具,示例可以说明应使用哪一个(例如 create_ticket 与 create_incident)

价值较低的情况:

  • 用法显而易见的简单单参数工具
  • Claude 已经理解的标准格式,如 URL 或电子邮件
  • 验证问题更适合由 JSON Schema 约束处理

最佳实践

构建执行真实世界操作的 agent 意味着要同时处理规模、复杂性和精确性。这三项功能协同工作,解决工具使用工作流中的不同瓶颈。以下是如何有效地组合它们。

有策略地分层使用功能

并非每个 agent 在给定任务中都需要使用全部三项功能。从你最大的瓶颈开始:

  • 工具定义导致上下文膨胀 → 工具搜索工具
  • 大型中间结果污染上下文 → 程序化工具调用
  • 参数错误和格式错误的调用 → 工具使用示例

这种聚焦的方法让你能够解决限制 agent 性能的特定约束,而不是一开始就增加复杂性。

然后根据需要分层添加其他功能。它们是互补的:工具搜索工具确保找到正确的工具,程序化工具调用确保高效执行,工具使用示例确保正确调用。

设置工具搜索工具以实现更好的发现

工具搜索会匹配名称和描述,因此清晰、描述性的定义可以提高发现准确率。

添加系统提示指导,让 Claude 知道有哪些可用工具:

将你最常用的三到五个工具始终保持加载,其余工具延迟加载。这在常见操作的即时访问与其他所有内容的按需发现之间取得平衡。

设置程序化工具调用以实现正确执行

由于 Claude 编写代码来解析工具输出,因此要清楚地记录返回格式。这有助于 Claude 编写正确的解析逻辑:

请参阅下文了解受益于程序化编排的需选择启用的工具:

  • 可以并行运行的工具(独立操作)
  • 可以安全重试的操作(幂等)

设置工具使用示例以提高参数准确率

编写示例以实现行为清晰性:

  • 使用真实数据(真实城市名称、合理的价格,而不是 "string" 或 "value")
  • 展示多样性,包含最小、部分和完整规格模式
  • 保持简洁:每个工具 1-5 个示例
  • 聚焦于歧义(仅在正确用法无法从 schema 中明显看出时添加示例)

开始使用

这些功能处于 beta 阶段。要启用它们,请添加 beta 标头并包含你需要的工具:

有关详细的 API 文档和 SDK 示例,请参阅我们的:

这些特性将工具使用从简单的函数调用推进到智能编排。随着智能体处理跨越数十个工具和大型数据集的更复杂工作流,动态发现、高效执行和可靠调用成为基础。

我们期待看到你构建的作品。

来源:Anthropic:Newsroom · anthropic.com