Здесь мы рассмотрим использование расширенных инструментов.
Если вы новичок в создании агентов, обязательно прочитайте знакомство с агентами и экскурсия по smolagents.
Что такое инструмент и как его создать? #
Инструмент - это в основном функция, которую LLM может использовать в агентной системе.
Но чтобы использовать его, LLM необходимо предоставить API: название, описание инструмента, типы и описания входов, тип выхода.
Поэтому она не может быть только функцией. Это должен быть класс.
Итак, по сути, инструмент - это класс, который оборачивает функцию метаданными, помогающими LLM понять, как ее использовать.
Вот как это выглядит:
Скопировано
из smolagents import Tool
class HFModelDownloadsTool(Tool):
name = "model_download_counter"
description = """
Это инструмент, который возвращает наиболее загруженную модель заданного задания на Hugging Face Hub.
Он возвращает название контрольной точки."""
inputs = {
"task": {
"type": "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()Подклассы пользовательских инструментов Инструмент чтобы унаследовать полезные методы. Дочерний класс также определяет:
- Атрибут
имя, что соответствует имени самого инструмента. Имя обычно описывает, что делает инструмент. Поскольку код возвращает модель с наибольшим количеством загрузок для задачи, назовем егомодель_загрузки_счетчика. - Атрибут
описаниеиспользуется для заполнения системной подсказки агента. - An
входыатрибут, который представляет собой словарь с ключами"тип"и"описание". Он содержит информацию, которая помогает интерпретатору Python сделать правильный выбор при вводе данных. - An
тип выводаатрибут, задающий тип вывода. Типы для обоихвходыитип выводадолжен быть Пидантичные форматыОни могут быть любыми из этих:~AUTHORIZED_TYPES(). - A
впередметод, который содержит код вывода, подлежащий выполнению.
И это все, что нужно для использования в агенте!
Есть и другой способ создания инструмента. В экскурсия_tourМы создали инструмент, использующий @tool декоратор. Сайт tool() Декоратор - это рекомендуемый способ определения простых инструментов, но иногда требуется нечто большее: использование нескольких методов в классе для большей ясности или использование дополнительных атрибутов класса.
В этом случае вы можете создать свой инструмент, создав подкласс Инструмент как описано выше.
Поделитесь своим инструментом с хабом #
Вы можете передать свой пользовательский инструмент в концентратор, вызвав push_to_hub() на инструменте. Убедитесь, что вы создали для него репозиторий на хабе и используете токен с доступом для чтения.
Скопировано
model_downloads_tool.push_to_hub("{your_username}/hf-model-downloads", token="")Чтобы push to Hub работал, ваш инструмент должен соблюдать некоторые правила:
- Все методы самодостаточны, например, используют переменные, которые приходят либо из их args.
- В соответствии с вышеуказанным пунктом, все импорты должны быть определены непосредственно в функциях инструментаиначе вы получите ошибку при попытке вызвать сохранить() или push_to_hub() с помощью вашего пользовательского инструмента.
- Если вы подклассифицируете
__init__метод, вы не можете дать ему никакого другого аргумента, кромесебя. Это связано с тем, что аргументы, заданные при инициализации конкретного экземпляра инструмента, сложно отследить, что мешает правильно передать их в хаб. В любом случае, идея создания конкретного класса заключается в том, что вы уже можете задать атрибуты класса для всего, что вам нужно жестко закодировать (просто задайтеyour_variable=(...)непосредственно подкласс YourTool(Tool):строка). И, конечно, вы все еще можете создать атрибут класса в любом месте вашего кода, присвоив материал вself.your_variable.
Как только ваш инструмент будет размещен в Hub, вы сможете его визуализировать. Здесь это model_downloads_tool которые я пробовал. У него приятный интерфейс gradio.
Погрузившись в файлы инструмента, можно обнаружить, что вся логика инструмента находится под tool.py. Здесь вы можете проверить инструмент, которым поделился кто-то другой.
Затем вы можете загрузить инструмент с помощью load_tool() или создать его с помощью from_hub() и передайте его в инструменты параметр в вашем агенте. Поскольку запуск инструментов означает запуск пользовательского кода, вам необходимо убедиться, что вы доверяете репозиторию, поэтому мы должны передать trust_remote_code=True чтобы загрузить инструмент из концентратора.
Скопировано
из smolagents import load_tool, CodeAgent
model_download_tool = load_tool(
"{ваше_имя_пользователя}/hf-model-downloads",
trust_remote_code=True
)Импорт пространства в качестве инструмента #
Вы можете напрямую импортировать пространство из концентратора в качестве инструмента, используя Tool.from_space() метод!
Вам нужно только указать идентификатор пространства на хабе, его название и описание, которое поможет агенту понять, что делает инструмент. Под капотом будет использоваться gradio-client библиотека для вызова Space.
Например, давайте импортируем FLUX.1-dev Space из концентратора и используйте его для создания изображения.
Скопировано
image_generation_tool = Tool.from_space(
"black-forest-labs/FLUX.1-schnell",
name="image_generator",
description="Сгенерировать изображение из подсказки"
)
image_generation_tool("Солнечный пляж")И вуаля, вот ваше изображение! 🏖️

Затем вы можете использовать этот инструмент так же, как и любой другой. Например, давайте улучшим подсказку кролик в космическом скафандре и создайте его изображение.
Скопировано
из smolagents import CodeAgent, HfApiModel
model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct")
агент = CodeAgent(tools=[image_generation_tool], model=model)
agent.run(
"Улучшите эту подсказку, затем сгенерируйте ее изображение.", prompt='Кролик в скафандре'
)Скопировано
=== Мысли агента: improved_prompt может быть "Ярко-синий кролик в скафандре, на поверхности Луны, под ярко-оранжевым закатом, с Землей, видимой на заднем плане". Теперь, когда я улучшил подсказку, я могу использовать инструмент генератора изображений, чтобы сгенерировать изображение на основе этой подсказки. >>> Агент выполняет приведенный ниже код: image = image_generator(prompt="Ярко-голубой кролик в скафандре на поверхности Луны, под ярко-оранжевым закатом, на фоне которого видна Земля") final_answer(image)

Как это круто? 🤩
Используйте инструменты LangChain #
Мы любим Langchain и считаем, что у него очень интересный набор инструментов. Чтобы импортировать инструмент из LangChain, используйте from_langchain() метод.
Вот как с его помощью можно воссоздать результат поиска по интро с помощью инструмента веб-поиска LangChain. Для этого инструмента понадобятся pip install langchain google-search-results -q чтобы работать правильно.
Скопировано
из langchain.agents import load_tools
search_tool = Tool.from_langchain(load_tools(["serpapi"])[0])
агент = CodeAgent(tools=[search_tool], model=model)
agent.run("На сколько больше блоков (также обозначаемых как слои) в базовом кодере BERT по сравнению с кодером с архитектурой, предложенной в статье Attention is All You Need?")Управляйте инструментарием вашего агента #
Вы можете управлять набором инструментов агента, добавляя или заменяя инструмент в атрибуте агент.инструментыпоскольку это стандартный словарь.
Давайте добавим модель_загрузки_инструмента к существующему агенту, инициализированному только с набором инструментов по умолчанию.
Скопировано
из smolagents import HfApiModel
модель = 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(
"Можете ли вы дать мне имя модели, которая имеет наибольшее количество загрузок в задании "текст в видео" на Hugging Face Hub, но меняет местами буквы?"
)Следите за тем, чтобы не добавить слишком много инструментов к агенту: это может перегрузить слабые LLM-движки.
Используйте коллекцию инструментов #
Вы можете использовать коллекции инструментов, используя объект ToolCollection с меткой коллекции, которую вы хотите использовать. Затем передайте их в виде списка для инициализации агента и начинайте их использовать!
Скопировано
из 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("Пожалуйста, нарисуйте мне картинку с реками и озерами").Чтобы ускорить запуск, инструменты загружаются только в том случае, если их вызывает агент.
