Как использовать агенты Hugging Face для решения задач NLP

Hugging Face  —  ИИ-сообщество с открытым исходным кодом для практиков машинного обучения  —  недавно интегрировало концепцию инструментов и агентов в свою популярную библиотеку Transformers. Если вы уже использовали Hugging Face для решения задач обработки естественного языка (NLP), компьютерного зрения и работой над аудио/речью, вам будет интересно узнать о дополнительных возможностях Transformers. 

Агенты значительно улучшают пользовательский опыт. Допустим, вы хотите использовать модель из Hugging Face Hub для создания переводов с английского на французский. В этом случае вам пришлось бы провести исследование, чтобы найти хорошую модель, затем выяснить, как именно ее использовать, и после написать для нее код и создать перевод. 

Но что, если в вашем распоряжении был бы эксперт на платформе Hugging Face, который уже освоил все это? Вы бы просто сказали эксперту, что хотите перевести предложение с английского на французский, а он позаботился бы о том, чтобы найти хорошую модель, написать код задачи и выдать результат  —  и сделал бы все гораздо быстрее, чем мы с вами.

Именно для этого и предназначены агенты. Вы описываете агенту задачу на простом английском языке, а агент изучает имеющиеся в его арсенале инструменты и выполняет вашу задачу. Это очень похоже на то, как если бы вы попросили ChatGPT перевести предложение, а ChatGPT позаботился бы обо всем остальном. Но вместо того чтобы ограничиваться несколькими моделями, которые использует ChatGPT (т. е. моделями Open AI, такими как GPT 3.5 и GPT-4), агенты имеют доступ ко многим моделям, доступным на Hugging Face.

Теперь, разобравшись с тем, как работают агенты и инструменты, посмотрим, как реализовать их возможности.


Агент Transformers: реализация

В этом разделе я использовал документацию Hugging Face об агентах и реализовал их на собственных примерах.

Шаг 1. Требования

Начнем с импорта нескольких библиотек, которые будем использовать. Обратите внимание: я включил версии этих библиотек в результаты, чтобы вы могли создать идентичную среду.

import transformers, huggingface_hub, diffusers, torch
from platform import python_version
print(f'python: {python_version()}')
print(f'transformers: {transformers.__version__}')
print(f'huggingface_hub: {huggingface_hub.__version__}')
print(f'diffusers: {diffusers.__version__}')
print(f'torch: {torch.__version__}')

Результаты:

Если в вашей среде нет одной или нескольких из этих библиотек, вы можете получить ошибку в приведенном выше блоке кода. В этом случае запустите блок кода, приведенный ниже, чтобы установить библиотеки. Предполагаю, что если вы читаете эту статью, то в вашей среде есть Python, поэтому я не включил его в этот блок.

Совет: если нужно выполнить одну строку команды, например установить transformers в ноутбук Jupyter или подобную программу, вы можете использовать !pip install transformers==4.29.0. Вместо добавления ! в начало каждой командной строки в приведенном ниже блоке кода я использовал %%sh, который является магической командой, указывающей на то, что все содержимое этого блока должно выполняться как команды.

%%sh

pip install transformers==4.29.0

pip install huggingface_hub==0.14.1

pip install diffusers==0.16.1

pip install --upgrade torch torchvision

pip install openai==0.27.6

Шаг 2. Вход в систему Hugging Face

Теперь, когда среда готова, нужно войти в Hugging Face, чтобы получить доступ к API выводов. Этот шаг требует наличия бесплатного токена Hugging Face. Если у вас его нет, вы можете следовать инструкциям по этой ссылке (у меня это заняло менее 5 минут), чтобы создать его.

Войдем в систему.

import huggingface_hub
from huggingface_hub import login

my_hf_token = 'ADD_YOUR_TOKEN_HERE'

login(my_hf_token)

Результаты:

Результаты показывают, что вход в систему был успешным.

На следующем этапе инстанцируем агента. Обратите внимание: Hugging Face поддерживает различных агентов (которые являются большими языковыми моделями или LLM). Одни из них, например агенты от Open AI, являются платными. Другие, например агенты от BigCode и OpenAssistant,  —  с открытым исходным кодом. Для нашей реализации выберем один из бесплатных вариантов с открытым исходным кодом от BigCode под названием Starcoder. Он будет более удобен для тех, кто начинает экспериментировать с LLM. Если вы заинтересованы в использовании других агентов, воспользуйтесь туториалом Hugging Face.

Перейдем к следующему шагу.


Шаг 3. Инстанцирование агента

Приведенный ниже блок кода инстанцирует агента Starcoder от BigCode.

import transformers
from transformers import HfAgent

# Starcoder
agent_starcoder = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder")

Теперь посмотрим, что агент может делать.


Шаг 4. Выполнение заданий

В качестве первого задания попросим модель сгенерировать картинку. Сообщим агенту то, что хотим, и агент выполнит наше указание. Рассмотрим пример.

task = "Draw me a picture of the ocean"

picture_ocean = agent_starcoder.run(task)

picture_ocean

Результаты:

Изображение океана, созданное агентом Hugging Face

Результаты показывают, что агент объясняет некоторые из своих действий. Например, он использует инструмент image_generator для создания картинки, о которой мы просили.

Напомню, что агент является LLM и выходные данные генерируются случайным образом, а значит, должны измениться при повторном запуске модели. Посмотрим, что получится, если запустить ту же задачу в другой раз.

picture_ocean = agent_starcoder.run(task)

picture_ocean

Результаты:

Изображение океана, созданное агентом Hugging Face

Как и ожидалось, картинки отличаются друг от друга. Но что, если нужно внести изменения в полученную картинку? Например, добавить корабль. Попросим агента добавить корабль к той же самой картинке.

picture_ocean_updated = agent.run("Transform the image in `picture_ocean` to add a ship to it.", picture=picture_ocean)

picture_ocean_updated

Результаты:

Изображение океана и корабля, созданное агентом Hugging Face

На этот раз агент использовал другой инструмент image_transform. Поскольку ему больше не нужно генерировать целое изображение, он преобразует ранее предоставленную картинку, добавляя к ней корабль. Теперь в левом верхнем квадранте изображения можно увидеть маленький корабль.

На этом этапе у вас может возникнуть вопрос: что именно делает агент? Ответ на этот вопрос читайте ниже.


Шаг 5. Что именно делают агенты?

Как мы выяснили, агенты  —  это LLM, которые выполняют задания по промптам. Другими словами, агенты получают промпты, после чего, основываясь на том, о чем их просят, собирают инструменты, которые, по их мнению, будут полезны, а затем запускают определенный код. Hugging Face предоставляет возможность посмотреть код агентов, добавив return_code=True к команде run. То есть мы можем попросить агента вернуть блок кода, чтобы изменить и/или запустить этот код самим.

Выполним снова команду следующим образом и посмотрим результаты:

task = "Draw me a picture of the ocean"

agent_starcoder.run(task, return_code=True)

Результаты:

Я очистил и переписал то, что вернул агент, следующим образом:

from transformers import load_tool
image_generator = load_tool("huggingface-tools/text-to-image")
image = image_generator(prompt="ocean")

Запустим этот код и посмотрим результаты.

from transformers import load_tool

image_generator = load_tool("huggingface-tools/text-to-image")

image = image_generator(prompt="ocean")

image

Результаты:

Изображение океана, созданное агентом Hugging Face

Как и ожидалось, это сработало. Иными словами, нам больше не нужно ожидать, что агент создаст этот код для нас,  —  можно сразу использовать инструмент huggingface-tools/text-to-image для генерации изображений.

Теперь рассмотрим дополнительный инструментарий.


Шаг 6. Дополнительные инструменты

В этом разделе рассмотрим другие инструменты, которые могут использовать агенты:

  • создание подписей к изображениям;
  • ответ на вопрос;
  • перевод;
  • смешанные запросы.

6.1. Создание подписей к изображениям

Сначала воспользуемся инструментом text-to-image, чтобы создать картинку игрушечной машинки. Затем сохраним это изображение и попросим агента сделать к нему подпись.

Начнем с создания изображения игрушечной машинки.

from transformers import load_tool

image_generator = load_tool("huggingface-tools/text-to-image")

image_generator(prompt="toy car")

Результаты:

Изображение игрушечной машинки, созданное агентом Hugging Face

Сохраним его на локальном диске и прочитаем его с помощью библиотеки Python Imaging Library (PIL). Затем попросим агента (с помощью промпта) создать подпись к этому изображению.

Ниже приведен блок кода:

from PIL import Image

task = 'Caption the following image'

image = Image.open('/content/picture.png')

agent_starcoder.run(task, image=image)

Результаты:

Обратите внимание на самое последнее предложение  —  это удачная подпись! Агент довольно точно описывает автомобиль. Попросим его вернуть код, чтобы узнать, какие инструменты он использовал и каким образом:

agent_starcoder.run(task, image=image, return_code=True)

Результаты:

Очистим блок кода следующим образом:

from transformers import load_tool
image_captioner = load_tool("image-captioning")
caption = image_captioner(image)

Агент загрузил инструмент image-captioning, а затем создал подпись к предоставленному изображению. Перейдем к следующему примеру.


6.2. Ответы на вопросы

Ответы на вопросы не требуют пояснений, но сделаем это задание более интересным. Вместо того чтобы предоставить агенту информацию в виде абзаца текста и задавать по ней вопросы, дадим ему изображение текста и спросим о его содержании.

Я написал несколько строк в документе Word, а затем сохранил его как изображение *.jpg в локальной сети. Сначала воспользуемся PIL для просмотра изображения следующим образом:

from PIL import Image
image = Image.open('/content/jack.jpg')
image.show()

Результаты:

Как видите, на изображении есть несколько предложений о моем воображаемом друге из Сиэтла по имени Джек. Теперь зададим вопрос агенту и посмотрим, как он ответит. Спросим агента о любимом цвете Джека следующим образом:

task = "in the following 'document', what is Jack's favorite color?"

agent_starcoder.run(task, document=image)

Результаты:

Еще раз посмотрим на последнее предложение в самом низу  —  довольно хорошо! Мы видим, что извлечение текста не идеально, например “Tesla” преобразовано в “tesia”, но все же агент вернул часть изображения, которая содержит ответ на заданный вопрос.

Посмотрим, какие именно инструменты использовал агент:

task = "in the following 'document', what is Jack's favorite color?"

agent_starcoder.run(task, document=image, return_code=True)

Результаты:

Очистим код следующим образом:

from transformers import load_tool

document_qa = load_tool("document-question-answering")

answer = document_qa(document, question="What is Jack's favorite color?")
print(f"The answer is {answer}.")

Мы видим, что агент использовал инструмент document-question-answering, а затем задал вопрос в форме вопросно-ответного задания.

Далее посмотрим, может ли агент выполнять перевод.


6.3. Перевод

Эта задача довольно проста. Попросим агента перевести предложение, а затем посмотрим, какие инструменты он использует.

text = 'this is a sentence in English'

task = "translate the following 'document' to French"

agent_starcoder.run(task, document=text)

Результаты:

Мы видим результат, который является переводом предоставленного предложения на французский язык. Посмотрим, что использовал агент:

agent_starcoder.run(task, document=text, return_code=True)

Результаты:

Сначала очистим код:

from transformers import load_tool
translator = load_tool("translation")
translated_document = translator(document, src_lang="English", tgt_lang="French")

Выглядит довольно просто. Агент использовал инструмент translation и правильно распознал исходный (src_lang) и целевой язык (tgt_lang), основываясь на том, о чем мы его попросили.

На этом этапе мне стало интересно, сможет ли агент справиться с более сложными задачами. Рассмотрим это далее.


6.4. Смешанные запросы

Что если объединить ответ на вопрос с переводом? Спросим агента, какой любимый цвет у Джека, и одновременно попросим, чтобы ответ был дан на французском языке.

task = "in the following 'document', what is Jack's favorite color? After you answer the question, translate the answer to French"

agent_starcoder.run(task, document=image)

Результаты:

Мы видим, что агент сначала вернул ответ на английском языке, а затем перевел его на французский, как мы и просили.


Заключение

Агенты и инструменты  —  это мощная комбинация. Очевидно, что агенты могут быть полезны как техническим пользователям (т. е. специалистам в области машинного обучения и ИИ), так и нетехническим. Польза агентов для технических пользователей заключается в ускорении процесса: агенты способны выбрать один из множества инструментов и вернуть код техническому пользователю для модификации в соответствии с его потребностями. С другой стороны, нетехнические пользователи, не знакомые с машинным обучением, могут просто задать вопрос о чем-угодно на английском языке, и агент позаботится обо всем остальном.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Farzad Mahmoodinobar: How To Use Hugging Face Agents For NLP Tasks

Предыдущая статьяПринципы SOLID в инженерии данных. Часть 3
Следующая статья10 конструкторов сайтов с ИИ, которые стоит попробовать каждому UI/UX-дизайнеру