在这里,我们将看到高级工具的使用。
如果您是建立代理的新手,请务必首先阅读 代理入门 和 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.")为了加快启动速度,只有在代理调用时才会加载工具。
