在这里,我们将看到高级工具的使用。
如果您是建立代理的新手,请务必首先阅读 代理入门 和 smolagents 导游.
什么是工具,如何制作? #
工具主要是指 LLM 可以在代理系统中使用的功能。
但要使用它,就需要为 LLM 提供一个 API:名称、工具说明、输入类型和说明、输出类型。
因此,它不能只是一个函数。它应该是一个类。
因此,该工具的核心是一个类,用元数据包装一个函数,帮助 LLM 理解如何使用它。
看起来是这样的
复制的
从 smolagents 导入工具 class HFModelDownloadsTool(Tool): name = "model_download_counter" (模型下载计数器 description = """ 这是一个工具,用于返回 Hugging Face Hub 上给定任务中下载次数最多的模型。 它返回检查点的名称。""" 输入 = { "任务":{ "类型":"string"、 "description":"任务类别(如文本分类、深度估计等)"、 } } output_type = "string" (字符串) def forward(self, task: str): from huggingface_hub import list_models model = next(iter(list_models(filter=task, sort="downloads", direction=-1))) return model.id model_downloads_tool = HFModelDownloadsTool()
自定义工具子类 工具 来继承有用的方法。子类还定义了
- 属性
名字
,与工具本身的名称相对应。名称通常描述了工具的功能。由于代码会返回任务中下载次数最多的模型,所以我们将其命名为模型下载计数器
. - 属性
描述
用于填充代理的系统提示。 - 一个
投入
属性,它是一个字典,键为"类型"
和"描述"
.它包含的信息有助于 Python 解释器对输入做出明智的选择。 - 一个
输出类型
属性,该属性指定了输出类型。这两个投入
和输出类型
应是 Pydantic 格式它们可以是其中之一:~authorized_types()
. - A
转发
方法,其中包含要执行的推理代码。
这就是特工所需要的一切!
还有另一种制造工具的方法。在 导游我们使用 @ 工具
装饰者。装饰公司 工具() 装饰器是定义简单工具的推荐方法,但有时你需要的不止这些:在一个类中使用多个方法使其更清晰,或使用额外的类属性。
在这种情况下,您可以通过子类化 工具 如上所述。
将您的工具共享到中枢 #
您可以通过调用 push_too_hub() 工具上。确保在 Hub 上为其创建了存储库,并使用具有读取权限的令牌。
复制的
model_downloads_tool.push_to_hub("{your_username}/hf-model-downloads", token="")
要让 "推动枢纽 "发挥作用,您的工具需要遵守一些规则:
- 所有方法都是自包含的,例如,使用的变量可以是来自参数的变量,也可以是来自参数的变量。
- 如上所述、 所有导入都应直接在工具的功能中定义否则,在尝试调用 保存() 或 push_too_hub() 使用自定义工具。
- 如果您对
启动
方法,你可以给它的参数除了自我
.这是因为在特定工具实例的初始化过程中设置的参数很难跟踪,这就妨碍了将它们正确地共享给集线器。无论如何,制作一个特定类的想法是,你已经可以为任何需要硬编码的东西设置类属性(只需设置your_variable=(...)
直属类 YourTool(工具):
行)。当然,您也可以在代码的任何地方创建类属性,只需将内容赋值给self.your_variable
.
一旦将工具推送到 Hub,就可以将其可视化。 这里 是 模型下载工具
我推过的。它有一个漂亮的渐变界面。
在深入研究工具文件时,你会发现该工具的所有逻辑都在 tool.py.在这里,您可以检查别人共享的工具。
然后就可以用 load_tool() 或使用 from_hub() 并将其传递给 工具
参数。由于运行工具意味着运行自定义代码,你需要确保你信任版本库,因此我们需要通过 trust_remote_code=True
从中枢加载工具。
复制的
from smolagents import load_tool, CodeAgent model_download_tool = load_tool( "{your_username}/hf-model-downloads"、 trust_remote_code=True )
导入空间作为工具 #
您可以直接从中枢导入空间作为工具,使用 Tool.from_space() 方法!
您只需提供 Hub 上空间的 id、名称以及有助于代理了解该工具作用的描述。在引擎盖下,这将使用 gradio-client
库来调用 Space。
例如,让我们导入 FLUX.1-dev 空间,并用它来生成图像。
复制的
image_generation_tool = Tool.from_space( "black-forest-labs/FLUX.1-schnell"、 name="image_generator"、 description="根据提示生成图像" ) image_generation_tool("A sunny beach")
瞧,这就是你的图片!🏖️

然后,你就可以像使用其他工具一样使用这个工具了。例如,让我们改进一下提示 穿太空服的兔子
并生成其图像。
复制的
from smolagents import CodeAgent, HfApiModel model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct") agent = CodeAgent(tools=[image_generation_tool], model=model) agent.run( "改进此提示,然后生成其图像。", prompt='A rabbit wearing a space suit' (一只穿着太空服的兔子) )
复制的
=== Agent thoughts: improved_prompt 可以是 "一只穿着亮蓝色太空服的兔子,在月球表面,在明亮的橙色夕阳下,背景是清晰可见的地球" 现在,我已经改进了提示,可以使用图像生成器工具根据此提示生成图像。 >>> Agent 正在执行下面的代码: image = image_generator(prompt="A bright blue space suit wearing rabbit, on the surface of the moon, under a bright orange sunset, with the Earth visible in the background") final_answer(image)

这有多酷?🤩
使用语言链工具 #
我们很喜欢 Langchain,认为它有一套非常引人注目的工具。要从 LangChain 导入工具,请使用 from_langchain()
方法。
下面介绍如何使用 LangChain 网络搜索工具来重现介绍中的搜索结果。该工具需要 pip install langchain google-search-results -q
才能正常工作。
复制的
从 langchain.agents 导入 load_tools search_tool = Tool.from_langchain(load_tools(["serpapi"])[0]) agent = CodeAgent(tools=[search_tool], model=model) agent.run("与 Attention is All You Need 中提出的架构中的编码器相比,BERT 基本编码器中多了多少块(也称为层)?
管理特工工具箱 #
您可以通过添加或替换属性中的工具来管理特工的工具箱。 代理工具
因为它是标准字典。
让我们添加 模型下载工具
到仅使用默认工具箱初始化的现有代理。
复制的
从 smolagents 导入 HfApiModel 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
现在,我们可以利用这个新工具了:
复制的
agent.run( "你能告诉我在拥抱脸枢纽的'文字到视频'任务中下载次数最多但字母颠倒的模型名称吗? )
注意不要为代理添加过多工具:这会让较弱的 LLM 引擎不堪重负。
使用一系列工具 #
您可以通过使用工具集合对象(ToolCollection object)来利用工具集合,其中包含您要使用的集合的标题。然后将它们作为一个列表传入,初始化你的代理,并开始使用它们!
复制的
from smolagents import ToolCollection, CodeAgent image_tool_collection = ToolCollection( collection_slug="huggingface-tools/diffusion-tools-6630bb19a942c2306a2cdb6f", token="" ) agent = CodeAgent(tools=[*image_tool_collection.tools], model=model, add_base_tools=True) agent.run("Please draw me a picture of rivers and lakes.")
为了加快启动速度,只有在代理调用时才会加载工具。