智能体课程文档
将动作编写为代码片段或 JSON Blob
并获得增强的文档体验
开始使用
将动作编写为代码片段或 JSON Blob
工具调用 Agent (Tool Calling Agents) 是 smolagents
中可用的第二种 Agent 类型。与使用 Python 代码片段的代码 Agent 不同,这些 Agent 使用 LLM 提供商内置的工具调用功能,以 JSON 结构生成工具调用。这是 OpenAI、Anthropic 和许多其他提供商使用的标准方法。
让我们看一个例子。当 Alfred 想要搜索餐饮服务和派对创意时,一个 CodeAgent
会生成并运行如下的 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 Blob 随后被用于执行工具调用。
虽然 smolagents
主要关注 CodeAgents
,因为它们整体性能更好,但对于不需要变量处理或复杂工具调用的简单系统,ToolCallingAgents
也是有效的。
工具调用 Agent 如何工作?
工具调用 Agent 遵循与代码 Agent 相同的多步骤工作流程(详见上一节)。
关键区别在于它们构建动作的方式:它们生成指定工具名称和参数的 JSON 对象,而不是可执行的代码。然后,系统会解析这些指令来执行相应的工具。
示例:运行一个工具调用 Agent
让我们重温一下之前 Alfred 开始派对准备的例子,但这次我们将使用 ToolCallingAgent
来突显差异。我们将构建一个可以使用 DuckDuckGo 搜索网页的 Agent,就像我们的代码 Agent 示例一样。唯一的区别是 Agent 的类型——框架会处理其他所有事情。
from smolagents import ToolCallingAgent, DuckDuckGoSearchTool, InferenceClientModel
agent = ToolCallingAgent(tools=[DuckDuckGoSearchTool()], model=InferenceClientModel())
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 会生成一个结构化的工具调用,系统处理这个调用以产生输出,而不是像 CodeAgent
那样直接执行代码。
现在我们了解了两种 Agent 类型,我们可以根据我们的需求选择合适的类型。让我们继续探索 smolagents
,让 Alfred 的派对圆满成功吧!🎉
资源
- ToolCallingAgent 文档 - ToolCallingAgent 的官方文档