8.2 工具定义与设计

8.2.1 优秀工具定义的特征

一个优秀的工具定义应该:

  • 清晰明确:模型能准确理解工具的用途

  • 参数完整:所有必要参数都有定义

  • 易于使用:参数设计简洁合理

  • 文档充分:描述和示例足够详细

8.2.2 工具定义结构

{
  "name": "search_products",
  "description": "在产品数据库中搜索商品",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "搜索关键词"
      },
      "category": {
        "type": "string",
        "enum": ["electronics", "clothing", "books"],
        "description": "产品类别"
      },
      "price_max": {
        "type": "number",
        "description": "最高价格限制"
      },
      "sort_by": {
        "type": "string",
        "enum": ["price", "rating", "newest"],
        "default": "rating",
        "description": "排序方式"
      }
    },
    "required": ["query"]
  }
}

8.2.3 设计原则

原则一:单一职责

每个工具只做一件事,避免功能过于复杂:

原则二:参数设计清晰

参数应该直观、类型明确:

原则三:提供足够的描述

描述应该帮助模型理解何时以及如何使用:

原则四:合理使用枚举

受限的参数使用枚举限制:

8.2.4 常见工具类型

类型
示例
特点

查询类

搜索、获取信息

只读,无副作用

操作类

创建、更新、删除

有副作用,需确认

计算类

数学运算、转换

确定性输出

通信类

发送邮件、消息

外部影响

8.2.5 工具数量的权衡

工具数量影响效果和成本:

  • 太少:能力受限

  • 太多:模型选择困难、Token 开销大

建议:

  • 核心场景所需工具优先

  • 动态加载相关工具

  • 按场景分组管理

8.2.6 工具分组策略

将工具按功能分组,动态加载:

spinner

根据对话场景选择加载哪个工具组。

8.2.7 工具文档最佳实践

描述模板

示例:

参数说明

每个参数都应有清晰的描述,必要时给出示例:

8.2.8 工具测试

工具定义需要测试:

  1. 理解测试:模型是否能正确理解何时调用

  2. 参数测试:参数提取是否准确

  3. 边界测试:模糊情况如何处理

  4. 拒绝测试:无关请求是否不会调用

8.2.9 上下文感知的工具设计

来自 Anthropic 工程团队的高级工具设计技巧,专注于优化上下文使用效率。

命名空间(Namespacing)

当智能体需要访问数十个 MCP 服务器和数百个工具时,工具功能重叠或用途模糊会导致选择困难。

命名空间策略:

  • 按服务分组asana_searchjira_searchgithub_search

  • 按资源分组asana_projects_searchasana_users_search

响应格式优化

工具返回信息应优先考虑上下文相关性,避免低级技术标识符:

灵活的响应格式

通过添加 response_format 参数,让智能体控制返回详细程度:

模式
Token 消耗
适用场景

concise

低(~⅓)

最终展示、无后续操作

detailed

需要 ID 进行后续工具调用

工具使用示例(Tool Use Examples)

JSON Schema 能定义结构有效性,但无法表达使用模式。通过提供示例,展示:

  • 格式约定:日期用 YYYY-MM-DD,ID 用 USR-XXXXX

  • 可选参数相关性:关键任务填写所有字段,简单任务只需核心字段

  • 嵌套结构用法

Last updated