Здесь мы рассмотрим использование расширенных инструментов.
Если вы новичок в создании агентов, обязательно прочитайте знакомство с агентами и экскурсия по 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("Пожалуйста, нарисуйте мне картинку с реками и озерами").
Чтобы ускорить запуск, инструменты загружаются только в том случае, если их вызывает агент.