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
Результаты:
Результаты показывают, что агент объясняет некоторые из своих действий. Например, он использует инструмент image_generator
для создания картинки, о которой мы просили.
Напомню, что агент является LLM и выходные данные генерируются случайным образом, а значит, должны измениться при повторном запуске модели. Посмотрим, что получится, если запустить ту же задачу в другой раз.
picture_ocean = agent_starcoder.run(task)
picture_ocean
Результаты:
Как и ожидалось, картинки отличаются друг от друга. Но что, если нужно внести изменения в полученную картинку? Например, добавить корабль. Попросим агента добавить корабль к той же самой картинке.
picture_ocean_updated = agent.run("Transform the image in `picture_ocean` to add a ship to it.", picture=picture_ocean)
picture_ocean_updated
Результаты:
На этот раз агент использовал другой инструмент 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
Результаты:
Как и ожидалось, это сработало. Иными словами, нам больше не нужно ожидать, что агент создаст этот код для нас, — можно сразу использовать инструмент 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")
Результаты:
Сохраним его на локальном диске и прочитаем его с помощью библиотеки 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)
Результаты:
Мы видим, что агент сначала вернул ответ на английском языке, а затем перевел его на французский, как мы и просили.
Заключение
Агенты и инструменты — это мощная комбинация. Очевидно, что агенты могут быть полезны как техническим пользователям (т. е. специалистам в области машинного обучения и ИИ), так и нетехническим. Польза агентов для технических пользователей заключается в ускорении процесса: агенты способны выбрать один из множества инструментов и вернуть код техническому пользователю для модификации в соответствии с его потребностями. С другой стороны, нетехнические пользователи, не знакомые с машинным обучением, могут просто задать вопрос о чем-угодно на английском языке, и агент позаботится обо всем остальном.
Читайте также:
- Генерирование синтетических обучающих данных с поддержкой масштабирования для задач NLP с помощью T0PP
- Пошаговое руководство по NLP: конструирование признаков текстовых данных
- Создаем краткое содержание текста с помощью Python без NLP
Читайте нас в Telegram, VK и Дзен
Перевод статьи Farzad Mahmoodinobar: How To Use Hugging Face Agents For NLP Tasks