smolagents — 架构与原理
30 秒导读: smolagents 是 Hugging Face 的一个极简 agent 库。它最大的赌注是——让大模型不要用 JSON 描述「我要调用哪个工具」,而是直接写一段 Python 代码来行动。这段代码跑在一个它自己手写的、逐行解释 AST 的「迷你 Python」里,只放行白名单里的模块和函数。核心 agent 循环压到约一千行。
本项目较大(源码约 1.3 万行,多个子系统),文档拆成多章。本页是 Layer 0(这是什么)+ Layer 1(顶层全景)+ 阅读地图;各机制的细节在分章里。
1. 这是什么(零基础也能懂)
一句话定义: smolagents 是一个「让 LLM 反复地思考→行动→看结果」的 agent 框架,而它的行动方式是写代码。
它想解决的问题。 你想让 AI 自动完成一个多步骤任务(「查一下猎豹全速跑过这座桥要几秒」),这需要:上网搜、把数字抠出来、做算术、给出答案。单靠一次模型调用做不到——模型不会上网、不会精确算术。于是需要一个循环:模型说一步,系统执行一步,把结果喂回去,再问下一步。这类系统叫 agent(智能体)。
它和别的 agent 框架不同在哪。 多数框架让模型输出结构化的「工具调用」(一段 JSON:工具名 + 参数)。smolagents 的主打是另一条路——CodeAgent:模型直接写 Python。想连续调三个工具、把结果存进变量、写个循环?一段代码就搞定,不用来回三轮对话。
它能做什么:
- 两种 agent:
CodeAgent(写代码行动)和ToolCallingAgent(传统 JSON 工具调用)。 - 模型无关:HF Inference、LiteLLM(100+ 家)、OpenAI、Bedrock、本地 Transformers/vLLM/MLX 都接。
- 工具无关:自带 web 搜索/访问网页;能从 MCP server、LangChain、HF Hub Space 拉工具。
- 代码执行有多档隔离:本地受限解释器,或 E2B / Docker / Modal / Blaxel 远程沙箱。
- agent 可嵌套(一个 agent 当另一个的「工具」,即 managed agents),可存取 Hub。
用起来什么样:
from smolagents import CodeAgent, WebSearchTool, InferenceClientModel
model = InferenceClientModel()
agent = CodeAgent(tools=[WebSearchTool()], model=model)
agent.run("猎豹全速跑过巴黎艺术桥要多少秒?")
agent.run(...) 内部会转起一个循环:模型写一段代码 → 解释器执行 → 把打印输出和返回值当「观测」喂回 → 直到模型调用 final_answer(...) 收尾。
一句话直觉: 把 agent 想成一个「只会用 Python 交互的实习生」——你给它一套函数(工具),它写代码调用它们、串联它们;它每写一段你就帮它跑一段,把结果念给它听,直到它说「这就是最终答案」。