减少工具 token 操作

1. 背景

我们知道,工具的定义和调用结果很“占 token”,一个工具还好,但是我们会用到的工具一般都很多,而且有时候不知道是要用哪个,很难按需使用,导致光是工具的定义就可以撑包上下文,以及对数据格式的规范定义边界模糊。

但是 claude 为我们提供了 3 种解决思路(Tool Search Tool、Programmatic Tool Calling、Tool Use Examples)

2. Tool Search Tool

针对「工具定义 token 爆炸」、「按需使用」痛点,claude 提供了 Tool Search Tool 的方案:

  • 提供的工具箱中,用defer_loading: true,在上下文中隐藏部分工具(这些工具一般是按需使用的工具,并不需要时时刻刻都加载入上下文)
  • defer_loading: false:不需要隐藏的工具,也就是常用的小工具,可以一开始就载入上下文中

2.1. 如何让隐藏的工具按需载入?

工具箱中有一个小工具,它的功能是模糊匹配查找需要的工具。

这么说应该就比较懂了。

举例:claude 发现自己可能需要用到 github 相关的工具,那么他就会用这个查找小工具,查找 github ,小工具会去工具箱中找 github 关键词匹配的工具出来给 claude 使用。

3. Programmatic Tool Calling

针对「工具调用结果 token 爆炸」痛点,采取了以下方案:

  • Claude 通过编写脚本去编排和调用工具,并控制最终结果输出的内容格式。
  • Claude 只会看到了脚本处理后的结果,而不是完整的工具调用结果,抛弃了无用的信息,减少了 token
  • Claude 从始至终都是在进行沙盒操作

4. Tool Use Examples

针对「数据格式的规范定义边界模糊」的情况,claude 也有提供方案,不过在此之前,先解释一下,为什么要关心这个边界模糊问题。

4.1. 格式边界模糊会带来的问题

假设工具的响应结果中有时间,那么,这个是“2024-11-06”、“Nov 6, 2024”还是“2024-11-06T00:00:00Z”?

这种歧义可能会影响 claude 的脚本的中间处理过程,导致 claude 最终得到的结果出现偏差,并且由于脚本沙盒的原因, claude 无法确认这个结果是否发生偏差了。

4.2. 具体方案

以下是示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"name": "create_ticket",
"input_schema": { /* same schema as above */ },
"input_examples": [
{
"title": "Login page returns 500 error",
"priority": "critical",
"labels": ["bug", "authentication", "production"],
"reporter": {
"id": "USR-12345",
"name": "Jane Smith",
"contact": {
"email": "jane@acme.com",
"phone": "+1-555-0123"
}
},
"due_date": "2024-11-06",
"escalation": {
"level": 2,
"notify_manager": true,
"sla_hours": 4
}
},
{
"title": "Add dark mode support",
"labels": ["feature-request", "ui"],
"reporter": {
"id": "USR-67890",
"name": "Alex Chen"
}
},
{
"title": "Update API documentation"
}
]
}

通过 input_examples可以让 claude 知道数据格式具体是什么样的

5. 并不是 3 种方案都必须严格执行

刚刚提到的 3 种方案并不代表一定要无时无刻都要实现,仅当你需要的时候才去采取这个方案。

  • 工具搜索工具的上下文膨胀 → Tool Search Tool
  • 大型中间结果污染上下文 → Programmatic Tool Calling
  • 参数错误和错误调用 → Tool Use Examples

不然你会很麻烦,比如Tool Use Examples,如果所有工具都要提供例子,那 token 一样会爆炸,仅仅当你需要举例让 claude 排除歧义的时候使用。

6. 参考文献

https://www.anthropic.com/engineering/advanced-tool-use