В ходе этой экскурсии вы узнаете, как создать агента, как его запустить и как настроить, чтобы он лучше работал в вашем случае.
Создайте своего агента #
Для инициализации минимального агента вам понадобятся как минимум эти два аргумента:
модель
Модель генерации текста для вашего агента - потому что агент отличается от простого LLM, это система, которая использует LLM в качестве движка. Вы можете использовать любой из этих вариантов:- ТрансформерыМодель принимает предварительно инициализированный
трансформаторы
конвейер для выполнения выводов на локальной машине с помощьютрансформаторы
. - HfApiModel использует
huggingface_hub.InferenceClient
под капотом. - LiteLLMModel позволяет вызывать 100+ различных моделей через LiteLLM!
- ТрансформерыМодель принимает предварительно инициализированный
инструменты
, СписокИнструменты
которые агент может использовать для решения задачи. Это может быть пустой список. Вы также можете добавить набор инструментов по умолчанию поверх вашегоинструменты
список, определив необязательный аргументadd_base_tools=True
.
Как только вы получите эти два аргумента, инструменты
и модель
Вы можете создать агента и запустить его. Вы можете использовать любой LLM, который вам нравится, либо через API "Обнимая лицо, трансформаторы, оллама, или LiteLLM.
API "Обнимая лицо
Модель локальных трансформаторов
OpenAI или антропный API
Оллама
Hugging Face API можно использовать бесплатно без токена, но тогда он будет иметь ограничение по скорости.
Чтобы получить доступ к закрытым моделям или увеличить тарифные лимиты с учетной записью PRO, необходимо установить переменную окружения HF_TOKEN
или пройти жетон
переменная при инициализации HfApiModel
.
Скопировано
из smolagents import CodeAgent, HfApiModel model_id = "meta-llama/Llama-3.3-70B-Instruct" модель = HfApiModel(model_id=model_id, token="") агент = CodeAgent(tools=[], model=model, add_base_tools=True) agent.run( "Не могли бы вы назвать мне 118-е число в последовательности Фибоначчи?", )
CodeAgent и ToolCallingAgent #
Сайт CodeAgent это наш агент по умолчанию. Он будет писать и выполнять фрагменты кода python на каждом шаге.
По умолчанию выполнение происходит в вашем локальном окружении. Это должно быть безопасно, потому что единственными функциями, которые могут быть вызваны, являются предоставленные вами инструменты (особенно если это только инструменты Hugging Face) и набор предопределенных безопасных функций, таких как печать
или функции из математика
модуль, так что вы уже ограничены в возможностях выполнения.
Интерпретатор Python также не разрешает импорт по умолчанию вне безопасного списка, поэтому все наиболее очевидные атаки не должны быть проблемой. Вы можете разрешить дополнительный импорт, передав разрешенные модули в виде списка строк в аргументе дополнительные_авторизованные_импорты
при инициализации вашего CodeAgent:
Скопировано
model = HfApiModel() agent = CodeAgent(tools=[], model=model, additional_authorized_imports=['requests', 'bs4']) agent.run("Не могли бы вы получить заголовок страницы по адресу url 'https://huggingface.co/blog'?")
LLM может сгенерировать произвольный код, который затем будет выполнен: не добавляйте небезопасные импорты!
Выполнение остановится на любом коде, пытающемся выполнить недопустимую операцию, или при наличии обычной ошибки Python в коде, сгенерированном агентом.
Вы также можете использовать Исполнитель кода E2B вместо локального интерпретатора Python, сначала установка E2B_API_KEY
переменная окружения и затем передать use_e2b_executor=True
при инициализации агента.
Узнайте больше о выполнении кода в этом учебнике.
Мы также поддерживаем широко распространенный способ записи действий в виде JSON-подобных блобов: это ToolCallingAgentОн работает точно так же, как и CodeAgentКонечно, без дополнительные_авторизованные_импорты
поскольку он не выполняет код:
Скопировано
из smolagents import ToolCallingAgent agent = ToolCallingAgent(tools=[], model=model) agent.run("Не могли бы вы получить заголовок страницы по адресу url 'https://huggingface.co/blog'?")
Проверка выполнения агента #
Вот несколько полезных атрибутов для проверки того, что произошло после пробежки:
agent.logs
хранит подробные журналы агента. На каждом этапе работы агента все сохраняется в словаре, который затем добавляется вagent.logs
.- Бег
agent.write_inner_memory_from_logs()
создает внутреннюю память журналов агента для просмотра LLM в виде списка сообщений чата. Этот метод просматривает каждый шаг журнала и сохраняет в виде сообщения только то, что его интересует: например, он сохранит системный запрос и задачу в отдельных сообщениях, затем для каждого шага сохранит вывод LLM в виде сообщения, а вывод вызова инструмента - в виде другого сообщения. Используйте этот способ, если вам нужно получить представление о том, что произошло, на более высоком уровне - но не каждый журнал будет расшифрован этим способом.
Инструменты #
Инструмент - это атомарная функция для использования агентом. Для использования LLM ему также необходимо несколько атрибутов, которые составляют его API и будут использоваться для описания LLM, как вызывать этот инструмент:
- Имя
- Описание
- Типы ввода и их описание
- Тип вывода
Например, вы можете проверить PythonInterpreterTool: у него есть имя, описание, входные описания, выходной тип и вперед
метод для выполнения действия.
Когда агент инициализируется, атрибуты инструмента используются для создания описания инструмента, которое встраивается в системную подсказку агента. Это позволяет агенту узнать, какие инструменты он может использовать и почему.
Панель инструментов по умолчанию #
Transformers поставляется с набором инструментов по умолчанию для расширения возможностей агентов, которые вы можете добавить к своему агенту при инициализации с помощью аргумента add_base_tools = True
:
- Веб-поиск DuckDuckGo*: выполняет поиск в Интернете с помощью браузера DuckDuckGo.
- Интерпретатор кода Python: запускает ваш сгенерированный LLM Python-код в безопасной среде. Этот инструмент будет добавлен только в ToolCallingAgent если вы инициализируете его с помощью
add_base_tools=True
поскольку агент, основанный на коде, уже может выполнять код на Python. - Транскриптор: конвейер преобразования речи в текст, построенный на базе Whisper-Turbo, который транскрибирует аудио в текст.
Вы можете использовать инструмент вручную, вызвав его с помощью аргументов.
Скопировано
из smolagents import DuckDuckGoSearchTool search_tool = DuckDuckGoSearchTool() print(search_tool("Кто является действующим президентом России?"))
Создайте новый инструмент #
Вы можете создать свой собственный инструмент для случаев использования, не охваченных стандартными инструментами Hugging Face. Например, давайте создадим инструмент, который возвращает наиболее загруженную модель для данной задачи из Hub.
Начните с приведенного ниже кода.
Скопировано
из huggingface_hub import list_models задача = "классификация текстов" most_downloaded_model = next(iter(list_models(filter=task, sort="downloads", direction=-1))) print(most_downloaded_model.id)
Этот код можно быстро превратить в инструмент, просто обернув его в функцию и добавив инструмент
декоратор: Это не единственный способ создания инструмента: вы можете напрямую определить его как подкласс Инструмент, что дает вам больше гибкости, например, возможность инициализировать тяжелые атрибуты класса.
Давайте посмотрим, как это работает для обоих вариантов:
Украсьте функцию с помощью @tool
Инструмент подкласса
Скопировано
из smolagents импортировать инструмент @tool def model_download_tool(task: str) -> str: """ Это инструмент, который возвращает самую загруженную модель заданной задачи на Hugging Face Hub. Он возвращает имя контрольной точки. Args: task: Задача, для которой нужно получить количество загрузок. """ most_downloaded_model = next(iter(list_models(filter=task, sort="downloads", direction=-1))) return most_downloaded_model.id
Функция требует:
- Понятное название. Название должно быть достаточно описательным, чтобы понять, что делает этот инструмент, и помочь LLM, работающему с агентом. Поскольку этот инструмент возвращает модель с наибольшим количеством загрузок для задачи, давайте назовем его
модель_загрузки_инструмента
. - Подсказки типа на входе и выходе
- Описание, включающее часть 'Args:', в которой описывается каждый аргумент (на этот раз без указания типа, он будет взят из подсказки типа). Как и в случае с названием инструмента, это описание является инструкцией по эксплуатации LLM, на котором работает ваш агент, поэтому не пренебрегайте им. Все эти элементы будут автоматически встраиваться в системную подсказку агента при инициализации, поэтому постарайтесь сделать их как можно более понятными!
Этот формат определений такой же, как и схемы инструментов, используемые в apply_chat_template
Единственное отличие заключается в добавлении инструмент
декоратор: читайте подробнее об API использования нашего инструмента здесь.
Затем вы можете напрямую инициализировать своего агента:
Скопировано
из smolagents import CodeAgent, HfApiModel агент = CodeAgent(tools=[model_download_tool], model=HfApiModel()) agent.run( "Можете ли вы дать мне имя модели, которая имеет наибольшее количество загрузок в задании "текст в видео" на Hugging Face Hub?" )
Вы получите следующие журналы:
Скопировано
╭──────────────────────────────────────── Новый запуск ─────────────────────────────────────────╮ │ │ │ Подскажите, пожалуйста, имя модели, у которой больше всего скачиваний в задании "текст в видео" │ │ задании на Hugging Face Hub? │ │ │ ╰─ HfApiModel - Qwen/Qwen2.5-Coder-32B-Instruct ───────────────────────────────────────────╯ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Шаг 0 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ╭─ Выполнение этого кода: ───────────────────────────────────────────────────────────────────╮ │ 1 model_name = model_download_tool(task="text-to-video") │ │ 2 print(model_name) │ ╰──────────────────────────────────────────────────────────────────────────────────────────╯ Журналы выполнения: ByteDance/AnimateDiff-Lightning Выход: None [Шаг 0: Продолжительность 0.27 секунд| Входные токены: 2,069 | Выходные токены: 60] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Шаг 1 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ╭─ Выполнение этого кода: ───────────────────────────────────────────────────────────────────╮ │ 1 final_answer("ByteDance/AnimateDiff-Lightning") │ ╰──────────────────────────────────────────────────────────────────────────────────────────╯ Выход - Окончательный ответ: ByteDance/AnimateDiff-Lightning [Шаг 1: Продолжительность 0.10 секунд| Входные лексемы: 4,288 | Выходные лексемы: 148] Out[20]: 'ByteDance/AnimateDiff-Lightning'
Подробнее об инструментах читайте в разделе специализированный учебник.
Мультиагенты #
Мультиагентные системы были представлены с помощью фреймворка Microsoft Автogen.
В этом типе фреймворка над решением задачи работают сразу несколько агентов, а не один. Эмпирически это дает лучшую производительность в большинстве бенчмарков. Причина такой производительности концептуально проста: для многих задач вместо того, чтобы использовать систему "сделай все", вы предпочтете специализировать подразделения на подзадачах. Здесь наличие агентов с отдельными наборами инструментов и памяти позволяет добиться эффективной специализации. Например, зачем заполнять память агента, генерирующего код, всем содержимым веб-страниц, которые посещает агент веб-поиска? Лучше держать их отдельно.
Вы можете легко создавать иерархические мультиагентные системы с помощью smolagents
.
Для этого заключите агента в ManagedAgent объект. Этому объекту нужны аргументы агент
, имя
, и описание
который затем будет встроен в системную подсказку агента-менеджера, чтобы он знал, как вызвать этого управляемого агента, как мы делаем и для инструментов.
Вот пример создания агента, управляющего определенным агентом веб-поиска, с помощью нашего DuckDuckGoSearchTool:
Скопировано
из smolagents import CodeAgent, HfApiModel, DuckDuckGoSearchTool, ManagedAgent model = HfApiModel() web_agent = CodeAgent(tools=[DuckDuckGoSearchTool()], model=model) managed_web_agent = ManagedAgent( agent=web_agent, name="web_search", description="Выполняет за вас поиск в Интернете. Передайте ему ваш запрос в качестве аргумента." ) manager_agent = CodeAgent( tools=[], model=model, managed_agents=[managed_web_agent] ) manager_agent.run("Кто является генеральным директором компании Hugging Face?")
Подробный пример эффективной мультиагентной реализации см. как мы продвинули нашу мультиагентную систему на вершину таблицы лидеров GAIA.
Поговорите с вашим агентом и визуализируйте его мысли в крутом интерфейсе Gradio #
Вы можете использовать GradioUI
to interactively submit tasks to your agent and observe its thought and execution process, here is an example:
Скопировано
from smolagents import ( load_tool, CodeAgent, HfApiModel, GradioUI ) # Import tool from Hub image_generation_tool = load_tool("m-ric/text-to-image") model = HfApiModel(model_id) # Initialize the agent with the image generation tool agent = CodeAgent(tools=[image_generation_tool], model=model) GradioUI(agent).launch()
Under the hood, when the user types a new answer, the agent is launched with agent.run(user_request, reset=False)
. The reset=False
flag means the agent’s memory is not flushed before launching this new task, which lets the conversation go on.
You can also use this reset=False
argument to keep the conversation going in any other agentic application.
Next steps #
For more in-depth usage, you will then want to check out our tutorials: