加载中
加载中

创建 Claude 会选择的工具

摘要文字记录

当 Claude 选错工具时,首先要查看的是工具的定义。本视频跟随 Meridian(一家虚构的工程咨询公司)展开。Meridian 重写了其工具定义,并在重写前后分别运行了同样的 30 个问题。

本视频中的演示录制于 2026 年 9 月,运行在 Claude Sonnet 5(claude-sonnet-5)上。结果在更新的模型上可能有所不同。

假设您的工具循环可以正常工作,但随后发生了以下情况之一:

  • Claude 调用了错误的工具。
  • 为一个事实调用了三次工具。
  • 它传入了 0142,而您的代码需要的是 MEG-2026-0142。

Claude 永远不会接触到运行您工具的那个函数。它只能看到您发送的定义,以及您返回的结果。所以当 Claude 误用某个工具时,首先要查看的是该工具的定义。

Meridian 有一个面向员工的内部助手,用于解答关于项目、许可证和账单的问题。重写其工具定义后,在 30 道测试题中的得分从 14 分提升到了 26 分,使用的是同一个模型。

Claude 能看到的工具信息

工具定义是一段 JSON,用于告诉 Claude 某个工具的存在。 您会在每次请求的 tools 列表中发送它。

下面是 Meridian 项目工具重写后的定义,它由四部分组成。

json
{
  "name": "lookup_project_status",
  "description": "Returns current facts about a single Meridian …",
  "input_schema": {
    "type": "object",
    "properties": {
      "project_id": {
        "type": "string",
        "description": "Full Meridian job number in the format MEG-YYYY-NNNN, e.g. MEG-2026-0142."
      },
      "fields": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": ["phase", "status", "lead", "hours", "deadline", "site", "client"]
        },
        "description": "Which fields to return. Omit to return everything."
      }
    },
    "required": ["project_id"]
  },
  "input_examples": [
    {"project_id": "MEG-2026-0142", "fields": ["phase", "status"]},
    {"project_id": "MEG-2025-0417", "fields": ["lead", "hours"]},
    {"project_id": "MEG-2024-0233"}
  ]
}
  • name 是 Claude 用来调用该工具的名称。
  • description 是您编写、Claude 会读取的纯文本。此处被截短,完整内容会在下一节展示。
  • input_schema 使用 JSON Schema 列出该工具的参数,每个参数都有名称、类型和自己的描述。required 说明了哪些参数是必须提供的。
  • input_examples 是可选的。它向 Claude 展示一个好的输入长什么样,例如一个完整的作业编号。每个示例都必须符合 input_schema,否则 API 会返回 400 错误。

Claude 通过阅读用户的请求以及每个工具的描述,来决定是否进行工具调用。

编写详细的描述

在这四部分中,description 起到的作用最大。

至少写三到四句话,如果工具比较复杂,可以写得更多。请涵盖以下四点:

  1. 该工具的作用
  2. 何时使用它,以及何时不该使用
  3. 每个参数的含义
  4. 它不会返回什么

以下是 Meridian 的完整描述:

text
Returns current facts about a single Meridian project: phase,
schedule status, project lead, hours budgeted and consumed,
deadline, site city, and client. Use this only when the user asks
about a specific project by name or job number; if only a partial
number is given (e.g. 'the 0142 job'), normalize it to the full
MEG-YYYY-NNNN format before calling. Pass the fields parameter to
fetch just the fields the question needs instead of the whole
record. This tool does not return permit or invoicing information.
Use get_permit_status or get_billing_summary for those.
Meridian 的工具描述,每一段都按其涵盖的四点内容之一进行了着色标注。

Meridian 的描述涵盖了一个好的描述所需的全部四点内容。

说明何时使用该工具、何时不使用,有助于 Claude 避免调用错误的工具。Meridian 的描述将该工具限定于关于单一项目的问题。对于许可证和账单问题,它则指明了应使用的工具。

将重叠的工具合并为一个

当多个工具所做的事情几乎相同时,再好的描述也帮不上多大忙。

Meridian 最初的那套工具里有六个单薄的工具,每个都只有一句话的描述。其中四个各自只返回一条项目事实。这四个工具相互重叠,导致 Claude 不得不去猜某个问题需要哪一个。

解决方法是把这四个合并为一个工具 lookup_project_status,并用一个 fields 参数来指定要返回哪些事实。 另外两个分别用于许可证和账单,做的是不同的事,所以予以保留。六个工具变成了三个。

用评测来衡量变化

评测(eval)是一组固定的测试问题,带有已知的正确答案,用于对 Claude 运行并打分。 它可以显示新定义是否更好。

Meridian 的评测检查 Claude 是否调用了正确的工具。其中有 30 道员工可能会问的问题,每道都标注了正确的工具调用。Meridian 在 claude-sonnet-5 上将这 30 道题各运行了两次,分别使用两套不同的工具。

工具集工具数量得分
单薄版614/30 (47%)
合并版326/30 (87%)

只修复出问题的那部分

要修复一次失败,找到定义中出问题的那一部分,只修改那一部分,然后重新运行您的评测。

Claude 做错了什么要修改的部分该怎么做
调用了错误的工具,或调用的工具数量超出问题所需description说明每个工具的作用以及何时使用它。合并重叠的工具。
传入了类型或格式错误的值schema 和示例在参数自身的 description 中给出格式说明。添加 input_examples。

工具使用问题排查 列出了更多症状和修复方法。

要点总结

  • 编写至少三到四句话的描述,并说明何时不应使用该工具。
  • 将重叠的工具合并为一个带参数的工具。
  • 用评测来衡量变化。
  • 要修复一次失败,只修改出问题的那部分。