将行动编写为代码片段或 JSON 数据块

Tool Calling Agent 是 smolagents 提供的第二种类型的 Agent。与使用 Python 代码片段的 Code Agent 不同,Tool Calling Agent 使用 LLM 提供商内置的工具调用功能,以 JSON 结构的形式生成工具调用。这是 OpenAI、Anthropic 和许多其它提供商采用的标准方法。

下面看一个示例。当 Alfred 想要搜索餐饮服务和派对创意时,Code Agent 将生成且运行类似下面的 Python 代码:

for query in [
    "Best catering services in Gotham City", 
    "Party theme ideas for superheroes"
]:
    print(web_search(f"Search for: {query}"))

ToolCallingAgent 将创建如下 JSON 结构:

[
    {"name": "web_search", "arguments": "Best catering services in Gotham City"},
    {"name": "web_search", "arguments": "Party theme ideas for superheroes"}
]

然后使用该 JSON 块执行工具调用。

虽然 smolagents 主要关注 Code Agent,因为其整体表现更好,但是对于不需要变量处理或复杂工具调用的简单系统而言,Tool Calling Agent 也可以有效地发挥作用。


1. Tool Calling Agent 的工作方式

Tool Calling Agent 遵循与 Code Agent 相同的多步骤工作流。
关键区别在于
它们如何构建其行动:Tool Calling Agent 不生成可执行代码,而是生成指定工具名称和参数的 JSON 对象。系统随后解析这些指令,执行相应的工具。


2. 运行 Tool Calling Agent

下面回顾之前 Alfred 开始准备派对的示例,但这次将使用 ToolCallingAgent 突出显示两种 Agent 的不同之处。我们将构建能够使用 DuckDuckGo 进行网络搜索的 Agent。唯一的区别在于 Agent 类型 - 框架将处理其它所有事情:

from smolagents import ToolCallingAgent, DuckDuckGoSearchTool, HfApiModel

agent = ToolCallingAgent(tools=[DuckDuckGoSearchTool()], model=HfApiModel())

agent.run("Search for the best music recommendations for a party at the Wayne's mansion.")

检查 Agent 的跟踪记录时,将看到类似下面的内容,而非 Executing parsed code:

╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Calling tool: 'web_search' with arguments: {'query': "best music recommendations for a party at Wayne's         │
│ mansion"}                                                                                                       │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Agent 生成结构化的工具调用,系统通过处理它,产生输出,而不是像 Code Agent 那样直接执行代码。