首页
学习
活动
专区
圈层
工具
发布
技术百科首页 >smolagents

smolagents

修改于 2026-08-19 18:00:20
40
概述

smolagents 是由 Hugging Face 团队开发的开源 AI Agent 框架,采用 Apache-2.0 协议,核心 Agent 逻辑仅约 1,000 行 Python 代码。该框架以"代码即行动"(Code as Action)为核心理念,让大语言模型通过编写和执行 Python 代码来完成复杂任务,而非传统的 JSON 工具调用模式。smolagents 支持多种大语言模型后端、多模态输入、沙箱化代码执行以及多智能体层级委托,适用于快速原型开发、研究实验和轻量级生产部署场景。

一、smolagents 的 ReAct 循环工作机制是怎样的?

1. 基本执行流程

smolagents 中的 CodeAgent 和 ToolCallingAgent 均继承自 MultiStepAgent,遵循 ReAct(Reason → Act → Observe)循环范式。Agent 接收用户任务后,在每一步中由大语言模型生成行动指令,框架执行后将结果作为观察反馈给模型,循环往复直至任务完成或达到最大步数限制。

2. 步骤类型与状态流转

Agent 的执行过程由多种步骤类型构成:

  • TaskStep:记录用户的初始任务输入
  • ActionStep:包含模型的输出、工具执行结果和观察信息
  • PlanningStep:当启用规划功能时,记录模型的策略总结
  • FinalAnswerStep:Agent 完成任务后返回的最终答案

所有步骤按顺序存储在 AgentMemory 对象中,构成完整的执行轨迹。

3. 终止条件

循环在以下三种情况下终止:

  • 模型通过 final_answer 工具或匹配的工具调用产出最终答案
  • 当前步数达到 max_steps 设定的上限,抛出 AgentMaxStepsError
  • 模型返回无效代码或工具调用且重试失败,抛出相应的解析或执行错误

二、smolagents 的工具系统是如何设计和使用的?

1. 工具定义方式

smolagents 中的工具本质上是带有结构化元数据的 Python 可调用对象。最常用的定义方式是 @tool 装饰器:

代码语言:javascript
复制
from smolagents import tool

@tool
def get_current_weather(city: str) -> str:
    """Returns the current weather for a given city.
    Args:
        city: Name of the city to check.
    """
    return fetch_weather(city)

装饰器会自动解析函数签名和文档字符串,生成大语言模型可读的工具描述和参数模式。文档字符串和类型注解直接成为模型决策时的参考信息。

2. 工具来源与集成

smolagents 支持从多种渠道获取工具:

  • 内置工具:包括 DuckDuckGoSearchToolWebSearchTool、Whisper 语音转写工具和浏览器自动化工具
  • Hugging Face Hub:通过 Tool.from_hub() 加载社区共享的工具,或通过 Tool.push_to_hub() 分享自定义工具
  • LangChain 工具:通过 Tool.from_langchain() 直接包装现有 LangChain 工具
  • MCP 服务器:通过 ToolCollection.from_mcp() 连接任意 MCP 服务器获取工具集
  • Hub Space:通过 Tool.from_space() 将 Hugging Face Space 转换为可调用工具

3. 工具元数据规范

每个工具需具备以下核心属性:

  • name:工具名称,作为模型调用时的函数标识
  • description:工具功能描述,帮助模型判断何时使用该工具
  • inputs:参数字典,包含每个参数的类型和说明
  • output_type:输出类型标注
  • forward():实际执行逻辑的方法

三、smolagents 支持哪些大语言模型和推理后端?

1. 模型无关设计

smolagents 采用模型无关(Model-Agnostic)架构,model 参数接受任何符合消息列表到响应映射接口的对象。内置适配器覆盖主流推理后端:

适配器类

后端类型

安装方式

InferenceClientModel

Hugging Face Inference Providers(Together、Fireworks 等)

核心库内置

LiteLLMModel

100+ 提供商(OpenAI、Anthropic、Bedrock 等)

pip install 'smolagents[litellm]'

TransformersModel

本地 transformers 流水线

pip install 'smolagents[transformers]'

OpenAIServerModel

任意 OpenAI 兼容端点

核心库内置

MLXModel

Apple Silicon 本地推理

pip install 'smolagents[mlx-lm]'

VLLMModel

本地 vLLM 服务器

pip install 'smolagents[vllm]'

2. 本地模型部署

对于希望在本地运行模型的场景,可通过 Ollama 或 vLLM 提供服务,然后将 LiteLLMModelOpenAIServerModel 指向本地端点(如 http://localhost:11434)。这使得 Agent 可以在完全离线、数据不出网络的环境中运行。

3. 模型切换的便利性

更换模型仅需修改一行代码,Agent 的业务逻辑和工具配置保持不变。这种设计避免了被单一供应商锁定,开发者可根据成本、延迟和性能需求灵活选择模型。

四、smolagents 的代码执行沙箱机制有哪些选项?

1. 执行环境类型

CodeAgent 通过 executor_type 参数选择代码执行环境,不同选项在安全性和适用场景上存在差异:

执行器类型

安全级别

适用场景

local(默认)

受限(基于 AST 的导入白名单)

本地开发、可信环境

e2b

高(云端 Firecracker 微虚拟机)

生产环境、不可信代码

docker

高(容器隔离)

自托管、完全控制

modal

高(无服务器容器)

大规模自动扩缩容

blaxel

高(托管远程执行)

边缘原生执行

wasm

高(WebAssembly 沙箱)

浏览器级隔离、边缘部署

2. 本地执行器的安全限制

默认的 LocalPythonExecutor 并非真正的安全沙箱,它通过以下机制提供基础防护:

  • 将导入限制在用户显式传递的白名单内
  • 阻止危险模块(如 ossyssubprocess)的导入
  • 限制操作总数和循环迭代次数,防止资源耗尽
  • 禁止 evalexecos.system 等危险内置函数

官方文档明确指出,本地执行器不能用作安全边界,生产环境中处理不可信输入时必须使用远程沙箱执行器。

3. 远程沙箱的选择建议

  • E2B:云端托管沙箱,启动时间约 2 秒,提供免费额度,适合原型开发
  • Modal:基于 gVisor 隔离,支持大规模自动扩缩容,适合生产规模
  • Docker:自托管,完全控制,需本地 Docker 守护进程
  • WebAssembly(Pyodide + Deno):在浏览器级 WASM 沙箱中运行,适合无法使用 Docker 的边缘环境

需要注意的是,沙箱化执行目前不支持多智能体系统,架构设计时应将不可信输入的处理隔离在独立的子 Agent 中。

五、smolagents 如何实现工具的组合调用和链式操作?

1. 代码即组合

CodeAgent 的核心优势在于工具组合的自然性。与传统 JSON 工具调用每次只能执行单一操作不同,CodeAgent 生成的 Python 代码可以在单一步骤中实现:

  • 函数嵌套:将一个工具的输出直接作为另一个工具的输入
  • 循环处理:对列表或数据集进行批量操作
  • 条件分支:根据中间结果决定后续操作路径
  • 变量持久化:在步骤间保留复杂对象(如 DataFrame、图像)供后续使用

2. 实际执行示例

例如,当 Agent 被要求"查找巴黎的人口并乘以法国的 GDP 人均值"时,CodeAgent 会自主生成如下代码:

代码语言:javascript
复制
population = get_population("Paris")
gdp_per_capita = get_gdp_per_capita("France")
result = population * gdp_per_capita
final_answer(result)

整个计算过程在一次模型调用中完成,无需多次往返传递中间结果。

3. 授权导入管理

Agent 生成的代码可以导入额外的 Python 模块,但需通过 additional_authorized_imports 参数显式声明。默认情况下,解释器仅允许 mathstatisticsdatetime 等安全模块。任何工具依赖的第三方库(如 requestspandasmatplotlib)都必须在此列表中声明,这一机制既保障了安全性,又保持了灵活性。

六、smolagents 的规划功能(planning_interval)是如何工作的?

1. 触发机制

planning_interval 参数控制 Agent 在执行过程中周期性暂停行动、生成策略规划的频率。当设置为整数 N 时,Agent 会在第 1 步生成初始计划,之后每 N 个行动步骤再生成一次计划更新。

触发条件为:step_number == 1(step_number - 1) % planning_interval == 0

2. 事实调查方法论

默认的规划策略采用结构化的"事实调查"(Facts Survey)方法,要求模型在生成计划前先完成三项分析:

  • 任务中已知的事实:用户提供的具体名称、日期或数值
  • 需要查找的事实:当前缺失但必需的信息(如搜索查询)
  • 需要推导的事实:从已收集信息中通过逻辑或计算得出的结论

这种方法论在 CodeAgent 和 ToolCallingAgent 中均适用,有助于减少多跳问题中的无效探索。

3. 人机协作扩展

通过 step_callbacks 参数可以拦截规划过程。当回调函数检测到 PlanningStep 类型时,可实现人工审核工作流——在 Agent 继续执行前检查或修改其计划。这为需要人类监督的关键场景提供了干预点。

七、smolagents 的记忆管理机制是如何工作的?

1. 进程内记忆架构

smolagents 的记忆通过 AgentMemory 对象管理,以 Python 列表形式保存完整的步骤历史。每次模型推理、工具执行或规划事件都会向列表中追加对应的步骤对象,完整的步骤序列在每次模型调用前被序列化为聊天消息,使大语言模型感知到持续的对话上下文。

2. 记忆的生命周期

当前版本(v1.26.0)的记忆仅存在于进程内存中,不具备以下能力:

  • 内置的磁盘序列化或外部存储后端(如 RedisSQL、mem0)
  • 跨进程重启的持久化
  • 长期用户画像或跨会话记忆

社区已多次请求持久化功能,但目前仍作为开放特性请求跟踪。

3. 记忆的访问与使用

开发者可以直接访问和检查 Agent 的记忆:

代码语言:javascript
复制
result = agent.run("你的任务")
for step in agent.memory.steps:
    print(step.step_number, step.tool_calls or step.code_action)

AgentMemory 支持 succinct_steps() 方法,可在规划更新时提供精简的历史上下文,避免上下文窗口溢出。此外,记忆结构适合导出到 Langfuse、OpenTelemetry 等可观测性平台进行日志记录和分析。

八、smolagents 的多模态能力(视觉、音频)是如何实现的?

1. 模态无关设计

smolagents 支持文本、视觉、视频和音频输入,通过模态无关(Modality-Agnostic)架构实现。Agent 可以将图像、音频和视频直接纳入代码生成和执行流程,处理多模态数据。

2. 视觉能力扩展

Hugging Face 社区推出了 smolagents-can-see 扩展库,为 Agent 提供视觉理解能力。这使得 Agent 可以处理网页截图、检测 UI 元素,并基于视觉输入生成相应的 Python 操作代码。在 GAIA 基准测试的标注数据集中,也包含了 PDF 和 Excel 文件的手动截图,以辅助基于视觉的推理。

3. 多模态工具集成

多模态能力主要通过自定义工具实现。例如,可以定义一个图像分析工具,使用 PIL 处理图像并返回描述信息;或定义语音转写工具,将音频文件转换为文本。Agent 在代码中可以调用这些工具,对多模态输入进行分析、转换和综合处理。

九、smolagents 如何处理复杂任务分解和子任务分配?

1. ManagedAgent 层级委托

smolagents 通过 ManagedAgent 包装器支持多智能体层级架构。任何 Agent 都可以被包装为托管 Agent,并作为工具传递给父级 Agent 使用。被包装的 Agent 必须具备 namedescription 属性,父级 Agent 根据描述决定何时将任务委托给该子 Agent。

2. 委托执行流程

层级委托遵循特定的交互序列:

  • 父级 Agent(Manager)在代码中调用托管 Agent,如同调用普通工具
  • 子 Agent 接收任务描述,独立运行其完整的多步推理循环
  • 子 Agent 完成任务后返回结果,父级 Agent 继续后续处理

这种模式实现了专业分工——例如,一个"网页研究"子 Agent 负责搜索和信息收集,一个"数据分析"子 Agent 负责数值计算和图表生成,而管理 Agent 专注于任务编排和结果整合。

3. 多模型路由优化

在大规模多智能体任务中,可通过 LiteLLMRouterModel 将模型工作负载分布到不同的提供商或实例。例如,管理 Agent 使用高性能模型进行复杂推理,而专业子 Agent 使用成本更低的小模型执行特定任务,从而在性能和成本之间取得平衡。

十、ToolCallingAgent 与 CodeAgent 有什么区别,何时使用哪种?

1. 核心范式差异

维度

CodeAgent

ToolCallingAgent

行动表达方式

可执行 Python 代码

JSON 结构化工具调用

单步操作能力

多工具组合、循环、条件

每次调用单一工具

状态管理

变量跨步骤持久化

无内置变量持久化

模型要求

需具备代码生成能力

需具备函数调用能力

基准表现

在多工具任务上更优

传统范式,兼容性更好

2. CodeAgent 的优势场景

CodeAgent 是 smolagents 的默认和旗舰 Agent 类型。当任务涉及多工具组合、数据转换、数值计算或需要保留中间状态时,CodeAgent 通过代码表达可以显著减少步骤数和模型调用次数。研究表明,相比 JSON 工具调用,代码方式可减少约 30% 的步骤,并在 GAIA 等复杂规划基准上取得更好的性能。

3. ToolCallingAgent 的适用场景

ToolCallingAgent 适用于以下情况:

  • 使用的模型对 JSON 函数调用有更好的支持(如某些小型模型)
  • 需要与现有的 JSON 工具调用日志或评估系统兼容
  • 工具逻辑简单,无需链式组合
  • 需要更严格的输出格式控制

总体而言,除非有特定的兼容性或格式需求,建议优先使用 CodeAgent。

十一、smolagents 的安全风险有哪些,如何防范?

1. 代码执行风险

smolagents 的核心特性是让大语言模型生成并执行 Python 代码,这带来了固有的安全风险:

  • 任意代码执行:模型可能生成包含危险操作的代码,如文件写入、网络请求或系统命令
  • 资源耗尽:模型可能生成无限循环或大量文件操作,导致系统资源被耗尽
  • 数据泄露:模型可能通过生成的代码将敏感数据发送到外部服务器
  • 提示注入:恶意输入可能诱导模型生成有害代码

2. 本地执行器的局限性

默认的 LocalPythonExecutor 虽然提供了导入白名单、危险模块阻止和操作数量限制等防护,但官方明确声明其不能作为安全边界使用。经过对抗性微调的模型仍可能绕过这些限制,对用户环境造成损害。

3. 生产环境的安全建议

对于处理不可信输入的生产系统,建议采取以下措施:

  • 使用远程沙箱:选择 E2B、Modal、Docker 或 WASM 执行器,实现进程级隔离
  • 资源限制:配置执行超时、内存上限和磁盘配额
  • 网络隔离:限制沙箱的网络访问权限,防止数据外泄
  • 最小权限原则:仅授予完成任务所必需的工具和导入权限
  • 可观测性集成:通过 OpenTelemetry 或 Phoenix 等工具追踪 Agent 的执行轨迹

十二、smolagents 的生产环境部署需要注意哪些问题?

1. 可观测性现状

当前版本的可观测性评分相对较低,默认使用 Rich 控制台格式化输出,适合人工阅读但不适合机器解析。生产部署需要额外集成:

  • 结构化 JSON 日志
  • 健康检查端点(/healthz/readyz
  • 分布式追踪(OpenTelemetry)

社区已提供与 Phoenix 的集成方案,用于实时追踪复杂的多步执行轨迹和评估。

2. 记忆持久化缺失

由于记忆仅存在于进程内存中,Agent 重启后状态完全丢失。对于需要状态恢复或长期运行的任务,需要自行实现外部存储层,或在每次请求时重新初始化 Agent 并从外部数据源加载上下文。

3. 多智能体与沙箱的兼容性

沙箱化执行目前不支持多智能体系统,因为 Agent 之间需要传递可执行代码,而远程沙箱环境难以处理这种交互。架构设计时,应将不可信输入的处理隔离在独立的子 Agent 中,这些子 Agent 不与其他 Agent 共享可执行代码边界。

4. 成本与延迟优化

  • 模型选择:根据任务复杂度选择合适的模型规模,专业子 Agent 可使用成本更低的小模型
  • 并发控制:在 GAIA 评估脚本中,通过 ThreadPoolExecutor 实现高并发处理,默认并发数为 8
  • Token 追踪:使用 agent.monitor.get_total_token_counts() 聚合管理 Agent 和所有子 Agent 的成本

十三、smolagents 适合什么样的开发场景,不适合什么场景?

1. 适合的场景

  • 快速原型开发:核心代码约 1,000 行,可在一个下午内读完源码并理解 Agent 循环的完整实现
  • 研究实验:需要替换提示模板或规划策略时,无需与重型框架的抽象层对抗
  • 轻量级自动化:任务涉及多工具组合、数据处理或代码生成,但不需要复杂的状态机或人工审核流程
  • 学习 Agent 开发:代码透明度高,适合理解 ReAct 循环、工具调用和多 Agent 委托的底层机制
  • Hugging Face 生态集成:需要快速分享和复用工具或 Agent 配置时,Hub 集成提供了便利

2. 不适合的场景

  • 复杂工作流编排:需要精细的状态控制、分支逻辑、重试机制或人机协作检查点时,LangGraph 等基于图的框架更合适
  • 企业级观测与评估:需要内置的认证、仪表板、A2A 协议支持或完整的评估体系时,smolagents 的轻量设计意味着这些能力需要自行构建
  • 强流程管控:复杂审批、状态恢复或需要严格审计追踪的场景
  • 不了解代码执行风险的用户:CodeAgent 模式需要开发者理解沙箱和权限管理的基本概念

3. 与同类框架的定位差异

  • 与 LangChain/LangGraph 相比:smolagents 更轻量,LangChain 生态更完整,LangGraph 适合复杂有状态编排
  • 与 OpenAI Agents SDK 相比:两者都偏轻量,OpenAI SDK 更靠近 OpenAI 生态,smolagents 更贴近 Hugging Face 生态且支持代码执行范式
  • 与 CrewAI 相比:CrewAI 强调角色协作和团队剧本,smolagents 强调轻量执行和代码优先
相关文章
  • smolagents:一个用于构建代理的简单库
    1.6K
  • smolagents 真正强的地方是代码型行动,但第一步不是放权
    225
  • SmolAgents:超级简单!3行代码构建一个代理,通过实时生成代码并执行,Agent的定义,终于开始收敛了。
    1.7K
  • 深度对比流行开源智能体 Agent 框架:选择适合你的解决方案
    5.8K
  • 用 Gradio, 几行 Python 代码构建 MCP 服务器!
    1K
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
领券