当前位置: 首页 > news >正文

smolagents学习笔记系列(五)Tools-in-depth-guide

这篇文章锁定官网教程中的 Tools-in-depth-guide 章节,主要介绍了如何详细构造自己的Tools,在之前的博文 smolagents学习笔记系列(二)Agents - Guided tour 中我初步介绍了下如何将一个函数或一个类声明成 smolagents 的工具,那么这篇文章将对这部分内容进一步深入。

  • 官网链接:https://huggingface.co/docs/smolagents/v1.9.2/en/tutorials/tools

What is a tool, and how to build one?

Tool是Agent系统在LLM中使用最广泛的东西,根据smolagents框架的要求,想要使用tool必须对以下内容进行定义:

  • name:工具名,最好是能直接表述工具功能的名字;
  • description:功能描述,对这个工具功能的详细表述;
  • input types and descriptions:输入类型与描述;
  • output type:输出类型;

官网提供了一个将类包装成工具的示例,如果是想通过类的方式定义工具的话需要继承smolagents Tool,并且要重写 forward 这个函数,目前可以粗略地认为这个函数就是最终执行的函数。该工具的作用是找到 HuggingFace 仓库中以 downloads 为分类指定 task 功能的模型,返回最受欢迎的模型信息。

但是直接运行看不到任何结果,需要在后面加一句输出内容,这里我让这个工具对象执行了 text-classification

from smolagents import Toolclass HFModelDOwnloadsTool(Tool):name = "model_download_counter"description = """This is a tool that returns the most downloaded model of a given task on the Hugging Face Hub.It returns the name of the checkpoint."""inputs = {"task": {"type": "string","description": "the task category (such as text-classification, depth-estimation, etc)",}}output_type = "string"def forward(self, task:str):from huggingface_hub import list_modelsmodel = next(iter(list_models(filter=task, sort="downloads", direction=-1)))return model.idmodel_download_tool = HFModelDOwnloadsTool()print(model_download_tool.forward("text-classification"))

运行:

$ (LLM) ~/Desktop/LLM $ python demo.py 
cross-encoder/ms-marco-MiniLM-L-6-v2

如果你在运行时报错下面的错:

huggingface_hub.errors.HfHubHTTPError: 401 Client Error: Unauthorized for url: https://huggingface.co/api/models?filter=text-classification&sort=downloads&direction=-1

需要在bash中设置环境变量:

$ export HF_TOKEN="你之前的token码"

Import a Space as a tool

smolagents提供了另一种方式允许你通过 Tool.from_space 这个函数从HuggingFace Hub中直接导入开源的工具,官网的示例用了 FLUX.1-dev 作为示例,如果你直接运行仍然是无法运行的,这个时候需要通过你的 HuggingFace 账户登录 FLUX.1-dev 的仓库:https://huggingface.co/black-forest-labs/FLUX.1-dev

【注意】:如果你没有登录账号,下图中红框是不会出现的。

登录之后会有这么一个页面,点击 Agree and access repository 按钮授权使用。
在这里插入图片描述

对示例代码进行修改以显示生成的图像,并且需要将 FLUX.1-schnell 改为 FLUX.1-dev

from smolagents import Tool
from PIL import Image
import numpy as np
import cv2image_generation_tool = Tool.from_space("black-forest-labs/FLUX.1-dev",name="image_generator",description="Generate an image from a prompt",api_name="/infer"
)response = image_generation_tool("A sunny beach")
print(response)image = Image.open(response)
image = np.array(image)
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)  # PIL 是 RGB,OpenCV 需要 BGRcv2.imshow("Generated Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

上面代码中的 response 返回的是你 本地计算机的一个路径,比如我的是下面内容从 /private/var 开始的一长串内容。

运行:

$ python demo
Loaded as API: https://black-forest-labs-flux-1-dev.hf.space ✔
/private/var/folders/zk/vtzyjvmx7f16zrstmmd3t27w0000gn/T/gradio/9026dfa2d826f1dd7a9c5089e051f2bf775bd3e972b298c9d1801a57f2b68981/image.webp

在这里插入图片描述

【注意】:这个可能需要多运行几次,因为涉及到远程GPU资源,如果申请GPU超时了就会返回错误,但是如果你运行次数太多则会报下面的错误提示你GPU使用次数超限,需要你升级到Pro账户。

gradio_client.exceptions.AppError: The upstream Gradio app has raised an exception: You have exceeded your free GPU quota (75s requested vs. 73s left). <a style="white-space: nowrap;text-underline-offset: 2px;color: var(--body-text-color)" href="https://huggingface.co/settings/billing/subscription">Subscribe to Pro</a> to get 5x more daily usage quota.

【Tips】:如果你想直接使用这个图像生成工具,可以在浏览器中直接访问网站:https://black-forest-labs-flux-1-dev.hf.space,这个是 FLUX.1 提供的一个网页,在输入你的prompt后点击 run 即可根据你的提示词生成图像,这个过程是逐步得到的,因此刚开始你会看到一篇马赛克,稍微等待一小会儿即可得到最终结果。

在这里插入图片描述

之后官网提到了可以将这个工具作为Agent的输入,先让 Qwen2.5-Coder 对提示词进行改进,然后再调用 FLUX.1 生成图像。

from smolagents import CodeAgent, HfApiModel
from smolagents import Toolimage_generation_tool = Tool.from_space("black-forest-labs/FLUX.1-schnell",name="image_generator",description="Generate an image from a prompt"
)model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct")
agent = CodeAgent(tools=[image_generation_tool], model=model)response = agent.run("Improve this prompt, then generate an image of it.", additional_args={'user_prompt': 'A rabbit wearing a space suit'}
)print(response)

【注】因为我当天的GPU资源用完了,后续恢复后我会补上相应的内容。


Use LangChain tools

在使用 LangChain 这个工具之前需要安装一些依赖:

$ pip install -U langchain-community
$ pip install langchain google-search-results -q

但是很遗憾 ,官网的demo仍然无法直接运行,因为你需要申请一个 Serp API Key

  1. 登录Serp官网:https://serpapi.com/users/welcome;
  2. 绑定/注册账号、在邮箱中验证、绑定中国区手机号并获得验证码;
  3. 白嫖一个免费的API

在这里插入图片描述
在这里插入图片描述

在获得 Serp API Key 之后需要在环境变量中注册这个Key值:

$ export SERPAPI_API_KEY="你的Serp API Key"

对示例代码进行稍微修改,添加model对象后运行代码:

from smolagents import Tool, CodeAgent, HfApiModel
from langchain.agents import load_toolsmodel = HfApiModel()search_tool = Tool.from_langchain(load_tools(["serpapi"])[0])agent = CodeAgent(tools=[search_tool], model=model)agent.run("How many more blocks (also denoted as layers) are in BERT base encoder compared to the encoder from the architecture proposed in Attention is All You Need?")

运行结果,和之前文章中提到的一样,在默认状态下调用的是 Qwen/Qwen2.5-Coder-32B-Instruct 模型:
在这里插入图片描述


Manage your agent’s toolbox

官方提供了一个基于 HuggingFace Hub 的工具箱管理管理功能,但这个功能需要在你已经将工具上传到 Hub 的 Spaces 前提下使用,对于大多数人而言不需要将自己写的工具上传上去,因此这里就放上示例,我也没有运行测试:

from smolagents import HfApiModel
from smolagents import CodeAgent, Tool, load_toolmodel_download_tool = load_tool("{your_username}/hf-model-downloads",trust_remote_code=True
)model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct")agent = CodeAgent(tools=[], model=model, add_base_tools=True)
agent.tools[model_download_tool.name] = model_download_tool

如果你对大家开源的 Tools 感兴趣,可以进入 Spaces 网页: https://huggingface.co/spaces 去查看有哪些可用的工具,网页向下拉就可以看到上面我们使用的 FLUX.1-dev 这个工具,不同的工具有不同的授权和使用方式,需要自己去阅读感兴趣的工具如何使用。
在这里插入图片描述


官方demo中其实还介绍了使用 slugmcp 的方式调用工具,但这两种方式我没有用过,如果后续需要的话我会进行补充。

相关文章:

smolagents学习笔记系列(五)Tools-in-depth-guide

这篇文章锁定官网教程中的 Tools-in-depth-guide 章节&#xff0c;主要介绍了如何详细构造自己的Tools&#xff0c;在之前的博文 smolagents学习笔记系列&#xff08;二&#xff09;Agents - Guided tour 中我初步介绍了下如何将一个函数或一个类声明成 smolagents 的工具&…...

前端面试真题 2025最新版

文章目录 写在前文CSS怪异盒模型JS闭包闭包的形成闭包注意点 CSS选择器及优先级优先级 说说flex布局及相关属性Flex 容器相关属性&#xff1a;Flex 项目相关属性 响应式布局如何实现是否用过tailwindcss&#xff0c;有哪些好处好处缺点 说说对象的 prototype属性及原型说说 pro…...

面试八股文--数据库基础知识总结(1)

1、数据库的定义 数据库&#xff08;DataBase&#xff0c;DB&#xff09;简单来说就是数据的集合数据库管理系统&#xff08;Database Management System&#xff0c;DBMS&#xff09;是一种操纵和管理数据库的大型软件&#xff0c;通常用于建立、使用和维护数据库。数据库系统…...

10. docker nginx官方镜像使用方法

本文介绍docker nginx官方镜像使用方法&#xff0c;因为第一次用&#xff0c;在加上对docker也不是很熟&#xff0c;中间踩了一些坑&#xff0c;为了避免下一次用又踩坑&#xff0c;因此记录如下&#xff0c;也希望能够帮到其它小伙伴。 官方镜像页面&#xff1a;https://hub.d…...

[Web 安全] PHP 反序列化漏洞 —— PHP 反序列化漏洞演示案例

关注这个专栏的其他相关笔记&#xff1a;[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 PHP 反序列化漏洞产生原因 PHP 反序列化漏洞产生的原因就是因为在反序列化过程中&#xff0c;unserialize() 接收的值可控。 0x01&#xff1a;环境搭建 这里笔者是使用 PhpStudy 搭建的环…...

es-head(es库-谷歌浏览器插件)

1.下载es-head插件压缩包&#xff0c;并解压缩 2.谷歌浏览器添加插件 3.使用...

第二十:【路由的props配置】

作用&#xff1a;让路由组件更方便的收到参数&#xff08;可以将路由参数作为props传给组件&#xff09; {name:xiang,path:detail/:id/:title/:content,component:Detail, ​ 第一种方法&#xff1a;// props的对象写法&#xff0c;作用&#xff1a;把对象中的每一组key-valu…...

Vue 2全屏滚动动画实战:结合fullpage-vue与animate.css打造炫酷H5页面

引言 在移动端H5开发中&#xff0c;全屏滚动效果因其沉浸式体验而广受欢迎。如何快速实现带有动态加载动画的全屏滚动页面&#xff1f;本文将手把手教你使用 Vue 2、全屏滚动插件 fullpage-vue 和动画库 animate.css 3.5.1&#xff0c;打造一个高效且视觉冲击力强的H5页面。通…...

AF3 DataPipeline类process_pdb 方法解读

DataPipeline 类中的 process_pdb 方法用于从 PDB 文件中生成特定蛋白质链的特征,作为 AlphaFold3 预测的输入。它的流程与 process_mmcif 类似,但输入来源是 PDB 文件而非 MmcifObject。 源代码: def process_pdb(self,pdb_path: str,alignment_dir: str,is_distillation:…...

抓包工具 wireshark

1.什么是抓包工具 抓包工具是什么&#xff1f;-CSDN博客 2.wireshark的安装 【抓包工具】win 10 / win 11&#xff1a;WireShark 下载、安装、使用_windows抓包工具-CSDN博客 3.wireshark的基础操作 Wireshark零基础使用教程&#xff08;超详细&#xff09; - 元宇宙-Meta…...

OpenBMC:BmcWeb app获取socket

OpenBMC:BmcWeb app.run-CSDN博客 app对象在run函数中调用了setupSocket() static std::vector<Acceptor> setupSocket() {std::vector<Acceptor> acceptors;char** names = nullptr;int listenFdCount = sd_listen_fds_with_names(0, &names);BMCWEB_LOG_DE…...

《深度学习实战》第2集-补充:卷积神经网络(CNN)与图像分类 实战代码解析和改进

以下是对《深度学习实战》第2集中 CIFAR-10 数据集 使用卷积神经网络进行图像分类实战 代码的详细分析&#xff0c;并增加数据探索环节&#xff0c;同时对数据探索、模型训练和评估的过程进行具体说明。所有代码都附上了运行结果配图&#xff0c;方便对比。 《深度学习实战》第…...

nodejs:express + js-mdict 作为后端,vue 3 + vite 作为前端,在线查询英汉词典

向 doubao.com/chat/ 提问&#xff1a; node.js js-mdict 作为后端&#xff0c;vue 3 vite 作为前端&#xff0c;编写在线查询英汉词典 后端部分&#xff08;express js-mdict &#xff09; 1. 项目结构 首先&#xff0c;创建一个项目目录&#xff0c;结构如下&#xff1…...

《深度剖析Linux 系统 Shell 核心用法与原理_666》

1. 管道符的用法 查找当前目录下所有txt文件并统计行数 # 使用管道符将ls命令的结果传递给wc命令进行行数统计 ls *.txt | wc -l 在/etc目录下查找包含"network"的文件并统计数量 # 使用find命令查找文件&#xff0c;并通过grep查找包含特定字符串的文件&#xf…...

索提诺比率(Sortino Ratio):更精准的风险调整收益指标(中英双语)

索提诺比率&#xff08;Sortino Ratio&#xff09;&#xff1a;更精准的风险调整收益指标 &#x1f4c9;&#x1f4ca; &#x1f4cc; 什么是索提诺比率&#xff1f; 在投资分析中&#xff0c;我们通常使用 夏普比率&#xff08;Sharpe Ratio&#xff09; 来衡量风险调整后的…...

minio作为K8S后端存储

docker部署minio mkdir -p /minio/datadocker run -d \-p 9000:9000 \-p 9001:9001 \--name minio \-v /minio/data:/data \-e "MINIO_ROOT_USERjbk" \-e "MINIO_ROOT_PASSWORDjbjbjb123" \quay.io/minio/minio server /data --console-address ":90…...

一周学会Flask3 Python Web开发-Jinja2模板访问对象

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象&#xff0c;如果如何来访问呢&#xff1f; 我们看下下面示例&#xff1a; 定义一个Student类 cla…...

RAGS评测后的数据 如何利用influxdb和grafan 进行数据汇总查看

RAGS(通常指相关性、准确性、语法、流畅性)评测后的数据能借助 InfluxDB 存储,再利用 Grafana 进行可视化展示,实现从四个维度查看数据,并详细呈现每个问题对应的这四个指标情况。以下是详细步骤: 1. 环境准备 InfluxDB 安装与配置 依据自身操作系统,从 InfluxDB 官网下…...

第25周JavaSpringboot实战-电商项目 4.商品分类管理

商品分类模块开发笔记 模块功能概述 实现分类数据的 增删改查 功能核心难点&#xff1a; 分类的父子级目录结构递归实现多级分类查找列表展示顺序控制&#xff08;从父级向子级递归&#xff09; 接口说明 后台接口 1. 添加分类 请求地址: /admin/category/add 请求方法: …...

C语言--正序、逆序输出为奇数的位。

题目&#xff1a; 采用正序和逆序分别输出为奇数的位。例如输入12345&#xff0c;正序输出135&#xff0c;逆序输出531 代码&#xff1a; #include <stdio.h>void printOddDigits(int num) {int res 0;int divider 10;while (num / divider > 10) {divider * 10;…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...