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

smolagents:一个用于构建代理的简单库

HF推出 smolagents,一个非常简单的库,它能够解锁语言模型的代理功能。以下是它的简要介绍:

from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModelagent = CodeAgent(tools=[DuckDuckGoSearchTool()], model=HfApiModel())agent.run("How many seconds would it take for a leopard at full speed to run through Pont des Arts?")

目录

  • 🤔 什么是代理?
  • ✅ 何时使用代理 / ⛔ 何时避免使用代理
  • 代码代理
  • 介绍 smolagents:让代理变得简单 🥳
  • 建立代理
  • 开放模型对于代理工作流程有多强大?
  • 下一步

🤔 什么是代理?

任何使用人工智能的有效系统都需要为 LLM 提供某种形式的现实世界访问权限:例如,调用搜索工具获取外部信息,或执行某些程序以解决任务的可能性。换句话说,LLM 应该具有代理权。代理程序是 LLM 通往外部世界的门户。

AI 代理是 LLM 输出控制工作流程的程序。

任何利用 LLM 的系统都会将 LLM 输出集成到代码中。LLM 的输入对代码工作流程的影响是系统中 LLM 的代理级别。

请注意,根据此定义,“代理”不是一个离散的、0 或 1 的定义:相反,“代理”会在连续的范围内发展,因为您在工作流程中为 LLM 赋予或多或少的权力。

下表说明了代理在不同系统之间的差异:

机构级别描述怎么称呼示例模式
☆☆☆LLM 输出对程序流程没有影响简单处理器process_llm_output(llm_response)
★☆☆LLM 输出决定基本控制流路由器if llm_decision(): path_a() else: path_b()
★★☆LLM 输出决定函数执行工具调用run_function(llm_chosen_tool, llm_chosen_args)
★★★LLM 输出控制迭代和程序延续多步代理while llm_should_continue(): execute_next_step()
★★★一个代理工作流可以启动另一个代理工作流多代理if llm_trigger(): execute_agent()

多步骤代理具有以下代码结构:

memory = [user_defined_task]
while llm_should_continue(memory): # this loop is the multi-step partaction = llm_get_next_action(memory) # this is the tool-calling partobservations = execute_action(action)memory += [action, observations]

因此,该系统循环运行,在每个步骤执行新操作(该操作可能涉及调用一些预先确定的工具,这些工具只是函数),直到其观察结果表明已达到令人满意的状态以解决给定的任务。

✅ 何时使用代理 / ⛔ 何时避免使用代理

当你需要 LLM 来确定应用程序的工作流程时,代理很有用。但它们往往是多余的。问题是:我真的需要工作流程中的灵活性来有效地解决手头的任务吗?如果预先确定的工作流程经常失败,这意味着你需要更多的灵活性。

例如,假设你正在制作一个处理冲浪旅行网站上客户请求的应用程序。你可以提前知道请求将属于两个存储桶中的任一个(基于用户选择),并且你为这两个情况中的每一个都有一个预定义的工作流程。

  • 想要了解一些旅行知识?⇒ 让他们访问搜索栏来搜索你的知识库
  • 想与销售人员谈谈?⇒ 让他们输入联系表格。

如果确定性工作流程适合所有查询,那么就一定要编写所有内容!这将为您提供一个 100% 可靠的系统,并且不会因让不可预测的 LLM 干扰您的工作流程而引入错误的风险。为了简单和稳健,建议规范化为不使用任何代理行为。

但如果无法提前确定工作流程该怎么办?

例如,用户想要问:“I can come on Monday, but I forgot my passport so risk being delayed to Wednesday, is it possible to take me and my stuff to surf on Tuesday morning, with a cancellation insurance?” 这个问题取决于许多因素,并且上述预定的标准可能都不能满足这个请求。

如果预先确定的工作流程经常出现不足,则意味着您需要更大的灵活性。这正是代理设置能提供帮助的地方。

在上面的例子中,您可以创建一个多步骤代理,该代理可以访问天气 API 来获取天气预报、Google Maps API 来计算旅行距离、员工可用性仪表板以及知识库中的 RAG 系统。

直到最近,计算机程序还局限于预先确定的工作流程,试图通过堆积 if/else 开关来处理复杂性。它们专注于极其狭窄的任务,例如“计算这些数字的总和”或“在此图中查找最短路径”。但实际上,大多数现实生活中的任务,比如我们上面的旅行示例,并不适合预先确定的工作流程。代理系统为程序打开了广阔的现实世界任务世界!

代码代理

在多步骤代理中,LLM 可以在每一步中以调用外部工具的形式编写操作。编写这些操作的常见格式(由 Anthropic、OpenAI 和许多其他公司使用)通常是“将操作编写为包含工具名称和要使用的参数的 JSON,然后对其进行解析以了解要执行哪个工具以及使用哪些参数”的不同版本。

多篇研究论文表明,使用代码调用 LLM 的工具效果要好得多。

原因很简单,我们精心设计了代码语言,以便以最佳方式表达计算机执行的操作。如果 JSON 代码片段是一种更好的表达方式,那么 JSON 将成为顶级编程语言,而编程将成为人间地狱。

下图取自《可执行代码操作引出更好的 LLM 代理》,说明了用代码编写操作的一些优点:

用代码而不是类似 JSON 的代码片段来编写操作可以提供更好的效果:

  • 可组合性:您是否可以将 JSON 操作嵌套在一起,或者定义一组 JSON 操作以供以后重复使用,就像定义一个 Python 函数一样?
  • 对象管理:如何 generate_image 以 JSON 格式存储操作的输出?
  • 通用性:代码是为了简单表达计算机可以做的任何事情而构建的。
  • LLM 训练数据中的表示:LLM 的训练数据中已经包含大量高质量的代码操作,这意味着它们已经接受过这方面的训练!

介绍 smolagents:让代理变得简单 🥳

我们的建设 smolagents 目标是:

  • ✨简单:代理逻辑只需几千行代码(参见此文件)。我们将抽象保持在原始代码之上的最小形状!
  • 🧑‍💻一流支持代码代理,即以代码编写其操作的代理(而不是“用于编写代码的代理”)。为了确保安全,我们支持通过 E2B 在沙盒环境中执行。
  • 🤗 Hub 集成:您可以与 Hub 共享工具并加载工具,未来还将有更多功能!
  • 🌐支持任何 LLM:它支持在其版本中或通过我们的推理 API 加载的 Hub 上托管的模型 transformers,但也通过我们的 LiteLLM 集成支持来自 OpenAI、Anthropic 和许多其他的模型。

smolagentstransformers.agents 的后继者,并将在 transformers.agents 将来被弃用时替代它。

建立代理

要构建代理,至少需要两个元素:

  • tools:代理有权访问的列表
  • model:LLM 将成为您的代理人的引擎。

对于 model,您可以使用任何 LLM,要么使用 HfApiModel 上面豹子示例中显示的类打开模型,利用 Hugging Face 的免费推理 API,要么利用 LiteLLMModel litellm 从 100 多个不同的 LLM 列表中进行选择。

对于该工具,您可以创建一个函数,在输入和输出上使用类型提示,并使用文档字符串为输入提供描述,然后使用 @tool 装饰器使其成为一个工具。

下面介绍了如何制作一个自定义工具来获取 Google 地图的旅行时间,并将其用于旅行计划代理:

from typing import Optional
from smolagents import CodeAgent, HfApiModel, tool@tool
def get_travel_duration(start_location: str, destination_location: str, departure_time: Optional[int] = None) -> str:"""Gets the travel time in car between two places.Args:start_location: the place from which you start your ridedestination_location: the place of arrivaldeparture_time: the departure time, provide only a `datetime.datetime` if you want to specify this"""import googlemaps # All imports are placed within the function, to allow for sharing to Hub.import osgmaps = googlemaps.Client(os.getenv("GMAPS_API_KEY"))if departure_time is None:from datetime import datetimemonday = datetime(2025, 1, 6, 11, 0)directions_result = gmaps.directions(start_location,destination_location,mode="transit",departure_time=departure_time)return directions_result[0]["legs"][0]["duration"]["text"]agent = CodeAgent(tools=[get_travel_duration], model=HfApiModel(), additional_authorized_imports=["datetime"])agent.run("Can you give me a nice one-day trip around Paris with a few locations and the times? Could be in the city or outside, but should fit in one day. I'm travelling only via public transportation.")

经过收集旅行时间和运行计算的几个步骤后,代理返回了最终建议:

Out - Final answer: Here's a suggested one-day itinerary for Paris:
Visit Eiffel Tower at 9:00 AM - 10:30 AM
Visit Louvre Museum at 11:00 AM - 12:30 PM
Visit Notre-Dame Cathedral at 1:00 PM - 2:30 PM
Visit Palace of Versailles at 3:30 PM - 5:00 PM
Note: The travel time to the Palace of Versailles is approximately 59
minutes from Notre-Dame Cathedral, so be sure to plan your day accordingly.

构建工具后,将其分享到 Hub 非常简单:

get_travel_duration.push_to_hub("{your_username}/get-travel-duration-tool")

您可以在此空间下看到结果。您可以在空间中的文件 tool.py 下检查该工具的逻辑。如您所见,该工具实际上被导出到从 class 继承的类 Tool,这是我们所有工具的底层结构。

开放模型对于代理工作流程有多强大?

我们 CodeAgent 用一些领先的模型创建了实例,并在这个基准上对它们进行了比较,该基准收集了来自几个不同基准的问题,以提出各种各样的挑战。

在此处找到基准,了解所使用的代理设置的更多详细信息,并查看代码代理与工具调用代理的比较(剧透:代码效果更好)。

通过这一比较可以看出,开源模型现在可以与最好的封闭模型相媲美了!

下一步

  • 从导游开始,熟悉图书馆。
  • 学习更深入的教程以了解更多有关工具或一般最佳实践的知识。
  • 深入研究示例来设置特定系统:文本到 SQL、代理 RAG 或多代理编排。
  • 了解有关代理的更多信息:
    • Anthropic 的这篇精彩博客文章提供了扎实的常识。
    • 本合集汇集了有关代理商的最具影响力的研究论文。

# 参考资料- https://huggingface.co/blog/smolagents

相关文章:

smolagents:一个用于构建代理的简单库

HF推出 smolagents,一个非常简单的库,它能够解锁语言模型的代理功能。以下是它的简要介绍: from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModelagent CodeAgent(tools[DuckDuckGoSearchTool()], modelHfApiModel())agent…...

通过Dockerfile来实现项目可以指定读取不同环境的yml包

通过Dockerfile来实现项目可以指定读取不同环境的yml包 1. 挂载目录2. DockerFile3. 运行脚本deploy.sh4. 运行查看日志进入容器 5. 接口测试修改application-dev.yml 6. 优化Dockerfile7. 部分参数解释8. 优化不同环境下的日志也不同调整 Dockerfile修改部署脚本 deploy.sh重新…...

云手机 —— 手机矩阵的 “超级外挂

如何打造手机矩阵 打造手机矩阵主要包括以下几个步骤: 1.确定目标与需求:首先,明确打造手机矩阵的目的和需求,是为了进行电商运营、自媒体推广、任务管理还是其他目的。这将决定后续的手机数量、操作系统选择以及应用安装等。 2.选择手机与操作系统:根据…...

OpenCV的TickMeter计时类

OpenCV的TickMeter计时类 1. TickMeter是一个计时的类1.1 计算耗时1.2 计算循环的平均耗时和FPS1.3 function 2. 案例 1. TickMeter是一个计时的类 https://docs.opencv.org/4.x/d9/d6f/classcv_1_1TickMeter.html#details 1.1 计算耗时 TickMeter tm;tm.start();// do some…...

蓝桥杯JAVA刷题--001

文章目录 题目需求2.代码3.总结 题目需求 2.代码 class Solution {public String convertDateToBinary(String date) {if (date null || date.length() ! 10 || date.charAt(4) ! - || date.charAt(7) ! -) {throw new IllegalArgumentException("输入的日期格式不正确&…...

免费又开源:企业级物联网平台的新选择 ThingsPanel

在开源领域,选择合适的开源协议是开发者和企业能否充分利用平台的关键。ThingsPanel,作为一个专注于物联网的开源平台,近日将协议从 AGPLv3 改为更开放的 Apache 2.0。这一改变对开发者和用户意味着什么? 为什么协议要从 AGPLv3 转…...

鸿蒙开发:文本合成语音

前言 Android开发的同学都知道,在Android当中,实现一段文字合成语音播放,可以使用系统提供的对象TextToSpeech来很快的实现,如果不用系统自带的,也可以使用三方提供的,比如讯飞的语音合成等等,总…...

雷军:科技传奇的逐梦之旅

亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...

LeetCode - 初级算法 数组(删除排序数组中的重复项)

免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 删除排序数组中的重复项 这篇文章讨论如何从一个非严格递增的数组 nums 中删除重复的元素,使每个元素只出现一次,并返回新数组的长度。因为数组是排序的,只要是相同的肯定是挨着的,所以我们需要遍历所有数组,然…...

2024年度培训运维总结

目前带的弟子跟我实战训练运维的总就业率基本可以稳定在 100% 左右(因为我不带小白和没学历和大龄,悟性低都筛掉了还能找我说明条件够了) 以下是弟子私教训练营的最新就业数据(2024年12月25日): 面试辅导…...

java重装小结

一、Java安装 安装路径 https://www.oracle.com/java/technologies/javase/javas e8-archive-downloads.html 具体类型可参考: Java安装配置-CSDN博客 我在这一步主要碰到的问题就是访问官网报404错误,可参考: 在oracle官网下载资源显示…...

ubuntu20.04 中文输入法安装

中文输入法安装指南 在 Ubuntu 20.04 上安装中文输入法,您可以按照以下步骤操作: 打开终端。安装 fcitx 输入法框架和中文输入法模块:sudo apt update sudo apt install fcitx fcitx-pinyin安装中文语言支持:sudo apt install l…...

SQL常用语句(基础)大全

SQL语句的类型 1.DDL 1.库2.表 2.DML 1.插入数据 insert inot2.删除数据 delete / truncate3.修改数据 update set 3.DQL 1.无条件查询2.查询 什么开始 到什么结束3.指定条件查询 1.单个条件 ro in2.多个条件 and4.查询不为NULL值 is not null ,为NULL值 is null5.模糊查询 li…...

计算和可视化相对湿度结果

了解如何确定 CFD 模型中的相对湿度。 了解相对湿度 大气是干燥空气和水蒸气的混合物,每一种的压力之和等于蒸气压。相对湿度是指空气中的水分量与空气在特定温度下可以容纳的最大水分量之比。它通常以百分比表示。它的范围从 0(干燥空气)到…...

uniapp-vue3(下)

关联链接:uniapp-vue3(上) 文章目录 七、咸虾米壁纸项目实战7.1.咸虾米壁纸项目概述7.2.项目初始化公共目录和设计稿尺寸测量工具7.3.banner海报swiper轮播器7.4.使用swiper的纵向轮播做公告区域7.5.每日推荐滑动scroll-view布局7.6.组件具名…...

一起学习Firtran: Fortran中的流程控制与操作符

流程控制语句 在计算机编程中,控制程序流程是算法设计中的一个核心概念,它使得程序能够根据特定条件执行不同的操作或重复执行某段代码。这显著增强了计算机算法相对于简单数学公式的功能和灵活性。 if语句 在单个 if 语句中只有当测试表达式&#xff0…...

Sonic:开源Go语言开发的高性能博客平台

Sonic:一个用Go语言开发的高性能博客平台 简介 Sonic,一个以其速度如声速般快速而命名的博客平台,是一个用Go语言开发的高性能博客系统。正如其名字所暗示的,Sonic旨在提供一个简单而强大的博客解决方案。这个项目受到了Halo项目…...

SpringBoot教程(十四) SpringBoot之集成Redis

SpringBoot教程(十四) | SpringBoot之集成Redis 一、Redis集成简介二、集成步骤 2.1 添加依赖2.2 添加配置2.3 项目中使用之简单使用 (举例讲解)2.4 项目中使用之工具类封装 (正式用这个)2.5 序列化 &…...

RSI和CCI指标组合:如何评估需求供应区?昂首资本实战指南

在市场分析中,分笔成交点数量提供了一个有价值的视角,帮助我们识别需求和供应区。通过这些数据,我们可以假设供需区域的参数与主要振荡器中的区域参数类似。以RSI和CCI为例,这些指标不仅能够反映市场的超买和超卖情况,…...

PTPVT 插值说明

文章目录 PTPVT 插值说明 PTPVT 插值说明PVT Hermite插值PVT 三次多项式插值PT 插值Sin轨迹测试结果PVT Hermite插值结果PVT 三次多项式插值结果PT 插值结果 用户轨迹测试结果PVT Hermite插值结果PT 插值结果 PTPVT 插值说明 PT模式: 位置-时间路径插值算法。 PVT模…...

Spring MVC和servlet

1.Spring MVC是Spring框架的一个扩展 2.Spring MVC工作流程 1、用户发送请求至前端控制器DispatcherServlet。 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及…...

java下载文件流,不生成中间文件。

java下载文件流,不生成中间文件。 代码设计:代码实现 代码设计: 从前端获取的数据经过后端加工后,生成文件流,并返回前端,(不生成中间文件,注意内存,记得关闭流&#xf…...

计算机专业考研 408 学科学习方法

计算机专业考研 408 学科涵盖数据结构、计算机组成原理、操作系统和计算机网络四门核心课程,内容多且难度大。但只要掌握科学的学习方法,便能化繁为简,稳步提升。以下为大家详细介绍 408 学科的学习方法。 一、基础夯实阶段:全面…...

mapper文件的解释

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.ruoyi.system.mapper.Jianai…...

常见协议的高危软件漏洞信息

HTTP 协议 协议 | 软件 | 漏洞编号 | 漏洞描述 Apache Log4j CVE-2021-45105 | Apache Log4j拒绝服务攻击漏洞 XWiki Platform CVE-2023-26477 | XWiki Platform存在安全漏洞&#xff0c;该漏洞源于可以通过URL请求参数结合其他参数注入任意脚本宏 Microsoft Windows CVE-20…...

Mediatek Android13 ROM定制

目录 1、系统签名 2、默认关闭WIFI 3、默认关闭Bluetooth 4、默认关闭NFC 5、移除物理键盘支持 6、禁止 ANR、崩溃等的对话框显示 7、修改默认壁纸 8、取消USB PTP MTP MIDI等支持 9、设置Screen Lock默认为None 10、设置Data&time自动 11、设置特定时区 12、设…...

RedisInsight:企业级 Redis 管理与分析工具

1 介绍 RedisInsight 是一款专为企业级用户设计的 Redis 管理与分析工具,旨在简化 Redis 数据库的管理和优化操作。通过直观的图形化界面和强大的功能集,RedisInsight 提供了全面的监控、诊断、性能优化以及数据管理能力,帮助企业和开发团队更高效地管理和运维 Redis 实例。…...

c# 快捷键模块

文章目录 命名空间和类类成员静态成员 静态方法GenerateHotkeyIdWndProcGetWindowHandleAndSourceRegisterUnregister 静态方法&#xff08;外部调用&#xff09;RegisterHotKey 和 UnRegisterHotKey 委托HotKeyCallbackHandler 枚举HotkeyModifiers 应用示例 using System; us…...

【笔记】增值税计算笔记

增值税计算笔记 设 进价为 α \alpha α元 出价为 α τ \alpha\tau ατ元 增值税率为 r r r ∵ { 进 项 税 α 1 r r 销 项 税 α τ 1 r r 增 值 税 销 项 税 − 进 项 税 ∴ 增 值 税 α ( τ − 1 ) r 1 r \because \left\{ \begin{aligned}进项税 &\frac{…...

请解释 JavaScript 中的闭包,以及它的优缺点和常见使用场景?

闭包&#xff08;Closure&#xff09;是什么&#xff1f; 闭包是JavaScript中的一个重要概念&#xff0c;指的是一个函数能够记住并访问它的词法作用域&#xff0c;即使这个函数在其词法作用域之外执行。 换句话说&#xff0c;闭包使得函数可以“记住”它被创建时的环境。 闭…...