SmolAgents 工具实战:注册到多智能体协作指南
【免费下载链接】agents-courseThis repository contains the Hugging Face Agents Course.项目地址: https://gitcode.com/GitHub_Trending/ag/agents-course
假设你要做一个"派对筹备"助手:它得先查哥谭市评分最高的餐饮服务商,再按场合生成菜单,最后把结果汇总成回复。单靠大模型聊天做不了——查实时信息要联网,算账要执行代码。HuggingFace Agents Course 的 unit2 用 smolagents 框架解决这个问题:把普通 Python 函数用@tool装饰器标记,塞进CodeAgent的工具列表,模型会自己决定什么时候调用、传什么参数。整条链路你只需要写"函数 + 一行注册代码",见 units/zh-CN/unit2/smolagents/tools.mdx。
工具调用的运转链路
smolagents 的工具调用不是一次性的,而是一个"思考→行动→观察"的 while 循环(课程第 1 单元称其为 ReAct 循环,详见 units/zh-CN/unit1/agent-steps-and-structure.mdx)。CodeAgent每一轮做的事固定为四步:
这里有两个关键点,直接决定你的工具好不好用:
- LLM 不直接执行工具。它只输出调用工具的代码文本,真正执行的是智能体框架。所以工具的"说明书"——函数名、docstring、参数类型——会被自动解析后注入系统提示,模型靠这些文本决定怎么调。
- 观察结果会回灌进日志。工具返回什么,模型下一轮就"看到"什么,因此工具返回值要信息密度高、格式稳定,别返回一堆原始 dump。
快速上手:5 分钟注册一个可用工具
1. 安装框架并登录模型服务
smolagents 本体约千行代码,默认通过 HF 无服务器推理 API 调模型(默认Qwen/Qwen2.5-Coder-32B-Instruct),所以本地要能访问推理端点并持有 token。
pip install smolagents -Ufrom huggingface_hub import login login()2. 把函数写成"能被自解释"的工具
框架用 Python 内省(inspect)自动提取工具的元信息,所以三条纪律:函数名要描述功能、参数和返回值必须有类型注解、docstring 里写Args:逐参数说明。缺任何一条,注入系统提示的工具描述就会残缺,模型调用出错率会明显上升。
3. 注册工具并运行智能体
工具不需要显式"注册表",创建CodeAgent时把工具对象放进tools列表即完成注册,下面的最小示例可直接运行(餐饮评分工具改写自课程示例):
from smolagents import CodeAgent, InferenceClientModel, tool @tool def catering_service_tool(query: str) -> str: """Return the highest-rated catering service. Args: query: A search term for finding catering services. """ services = {"Gotham Catering Co.": 4.9, "Wayne Manor Catering": 4.8} return max(services, key=services.get) agent = CodeAgent(tools=[catering_service_tool], model=InferenceClientModel()) print(agent.run("Find the highest-rated catering service in Gotham City.")) # -> Gotham Catering Co.4. 看运行轨迹确认工具真的被调了
agent.run()会在终端打印逐步轨迹,每步能看到Executing parsed code:后面的代码和工具返回。确认两点即可:代码里出现了对工具函数的调用、参数符合注解类型。如果模型压根没调工具直接编答案,回第 2 步把 docstring 写得更具体。
进阶玩法:把子智能体当工具做任务拆解
单智能体扛复杂任务时步骤会膨胀,课程 unit2 的多智能体章节(units/zh-CN/unit2/smolagents/multi_agent_systems.mdx)给出最实用的组合方式:把另一个智能体包成工具挂给管理智能体(Manager Agent)。管理智能体只负责拆题和汇总,专业活交给子智能体,上下文各管各的,轨迹也更短。
from smolagents import CodeAgent, InferenceClientModel, tool @tool def research(query: str) -> str: """Search and summarize material on a given topic. Args: query: the research topic. """ sub = CodeAgent(tools=[], model=InferenceClientModel()) return sub.run(f"Research '{query}' and summarize in 3 sentences.") manager = CodeAgent(tools=[research], model=InferenceClientModel()) manager.run("对比代码智能体与工具调用智能体两种方案,给出选型建议。")跑通这个模式后,往tools列表里继续加DuckDuckGoSearchTool、VisitWebpageTool等默认工具箱成员(或Tool.from_space()加载的 HF Space),就是一个可落地的多角色编排系统。两种智能体的差别值得一看:CodeAgent生成 Python 代码行动,ToolCallingAgent生成 JSON 调用指令,后者适合不需要变量处理的简单链路,详见 units/zh-CN/unit2/smolagents/tool_calling_agents.mdx。
踩坑速查
| 现象 | 原因 | 处理办法 |
|---|---|---|
| 模型不认工具或传参张冠李戴 | 缺 docstring 的Args:说明或函数名太含糊 | 补类型注解,逐参数写清楚用途和取值 |
| 工具描述没进系统提示 | 函数参数/返回值没有类型注解,内省提取失败 | 给所有参数和返回值加注解后重新运行 |
| 智能体反复循环调同一个工具 | 工具返回空或报错,观察结果没提供新信息 | 工具内捕获异常并返回带提示的文字,而非抛栈 |
| 外部 API 调用卡死整个智能体 | 网络请求没设超时 | 工具函数里给 HTTP 客户端加 timeout 和重试 |
load_tool()加载社区工具报远程代码错误 | 未显式信任远端代码 | 传trust_remote_code=True,并确认来源可靠 |
往下走
- 代码智能体逐步执行细节与记忆机制:units/zh-CN/unit2/smolagents/code_agents.mdx
- 多智能体编排完整案例(含安装依赖清单):units/zh-CN/unit2/smolagents/multi_agent_systems.mdx
- 智能体可观测性与评估(Langfuse 埋点、数据集回归):units/zh-CN/bonus_unit2/what-is-agent-observability-and-evaluation.mdx
【免费下载链接】agents-courseThis repository contains the Hugging Face Agents Course.项目地址: https://gitcode.com/GitHub_Trending/ag/agents-course
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考