过去两年里,AI 调用工具的方法基本没变,大家也没怎么抱怨。
一开始,这个方法看起来很聪明。你把一堆工具的信息(名字、说明、需要什么参数)告诉大模型,它就不只是聊天机器人了。比如你问:"巴黎今天天气怎么样?" 模型会输出一段标准的 JSON 数据,后台服务器拿着它去查天气 API,再把结果交回来,模型整理成一句自然的话回复你。整个过程你看不到,但感觉就像 AI 自己会查资料一样,很神奇。
但这种"魔法"背后,其实是很机械的流程,而且越来越容易出问题。
问题在代理变复杂时暴露出来。
比如你让 AI 帮你找出 Gmail 里所有 Bob 发来的邮件。听着简单对吧?
它先调用 search_email("Bob"),拿到一堆邮件 ID。然后对每个 ID 再分别调用 read_email(id_1)、read_email(id_2)......一次又一次。而且每一步都要准确记住那些 ID,稍微出错就会出问题。
更糟的是,每次工具返回的内容都会被塞进模型的"上下文"里,就像不断往背包里塞东西:各种没用的元数据、HTML 代码、广告内容......很多根本用不上,却占地方。
写博客的代理更惨。它先搜索网页,拿到一堆网址;再抓取每个网址,得到大量 HTML;等到真正开始写文章时,还得把这些乱七八糟的原始内容重新整理再喂给写作工具。明明几行代码几毫秒就能做完的事,却浪费了成千上万的 token。
有人说,那就把上下文窗口做大一点。但问题不在"能装多少",而在"浪费太多"。模型真正能好好思考的空间,大概也就 12 万到 20 万 token 左右。不是容量不够,是效率太低。
Anthropic 给出的解决办法,不是换一个新模型,而是换一种思路。
核心叫做:程序化工具调用。
简单说,不要让模型一次次用 JSON 去"指挥"工具,而是让它自己写一小段代码,把所有步骤一次性搞定。
给模型一个可以安全执行代码的环境。把工具当成函数。然后模型可以写一个小程序,里面有循环、判断、变量,把整个流程一次性跑完。
这就像:与其让莎士比亚先学一个月普通话,再用普通话写剧本,不如直接让他用英语写。既然模型本来就擅长写代码式的逻辑,何必绕一圈?
实验发现,这种方法能减少 30% 到 50% 的 token 使用量,速度也更快。而且改造成本不高:加一个代码执行工具,做点小改动,就能用。
还有其他改进。
动态过滤 :
以前抓网页时,会把整个网页的 HTML 全部丢进模型,包括导航栏、广告、页脚。现在会先自动过滤,只留下有用的正文内容。光这一点,平均就能省下 24% 的 token。
工具搜索 :
如果一个系统里有几十上百个工具,以前是每次对话都把所有工具说明塞进上下文,很浪费。现在只加载一个"工具搜索工具",需要哪个工具再去找。没用到的工具就不出现。最多可以减少 80% 的上下文占用。
工具使用示例 :
有些工具参数特别复杂,比如客服系统里的 create_ticket,字段多又有各种规则。光看说明文档模型可能理解不透。
现在可以给模型一些示例调用,让它"照着例子学"。准确率从 72% 提升到 90%,在真实系统里,这种提升非常关键。
总的来说,这四个改进说明一件事:工具调用正在变成熟。
一开始,它只是个聪明的小技巧------让模型输出 JSON,就能调用工具。
但随着 AI 代理变复杂,这种方法开始显得笨重。
新的做法没有推翻旧基础,而是让它更高效:
用代码替代繁琐的来回调用,减少无用信息,按需加载工具,用示例教模型。
魔法还在。
只是现在更聪明、更省资源了。