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 | { |
通过 input_examples可以让 claude 知道数据格式具体是什么样的
5. 并不是 3 种方案都必须严格执行
刚刚提到的 3 种方案并不代表一定要无时无刻都要实现,仅当你需要的时候才去采取这个方案。
- 工具搜索工具的上下文膨胀 → Tool Search Tool
- 大型中间结果污染上下文 → Programmatic Tool Calling
- 参数错误和错误调用 → Tool Use Examples
不然你会很麻烦,比如Tool Use Examples,如果所有工具都要提供例子,那 token 一样会爆炸,仅仅当你需要举例让 claude 排除歧义的时候使用。