Как Guidance выводит ИИ на новый уровень: инструмент для эффективного управления моделями

Введение

В последнее время наблюдается стремительный прогресс в сфере обработки естественного языка. Появление мощных языковых моделей вроде GPT и Bard действительно открыло новые возможности для создания интеллектуальных приложений. Однако вместе с тем мы столкнулись с необходимостью более совершенных инструментов для эффективной интеграции и управления такими моделями.

И вот недавно компания Microsoft представила Guidance — язык управления, предназначенный для контроля над большими языковыми моделями. По нашему мнению, этот инструмент может существенно изменить процесс разработки приложений на основе возможностей AI. 

d3b6a00c8f48f9589026fc94a5f8739d.png

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

Приглашаем к прочтению!  

Сразу к сути

Когда в нашей компании мы начали тестировать Guidance, это был действительно положительный опыт. 

Во-первых, нам понравился специальный синтаксис Guidance, основанный на handlebars, для пошагового описания обработки данных языковой моделью.

Благодаря этому код Guidance выполняется последовательно, отражая порядок анализа входного текста моделью. Это дало нам возможность точно контролировать процесс генерации текста.

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

Кроме того, генерация за один проход в Guidance экономит вычислительные ресурсы по сравнению с многократным обращением к модели. Он может быть легко интегрирован с такими провайдерами, как модели Hugging Face, и включает в себя интеллектуальную систему кэширования генерации на основе семплов и систему token healing, которая оптимизирует границы подсказок и устраняет смещение при токенизации. Включение направляющих шаблонов regex дополнительно обеспечивает соблюдение форматов, позволяя естественным образом завершать подсказки.

1a892e272c917a9097e54c456ae79620.png

Еще одна полезная особенность Guidance — это поддержка конструкций выбора при генерации текста. Это позволило нам описывать разветвленную логику работы приложения. Например, можно представить возможность выбора из нескольких вариантов, как в примере:

{{#select "answer"}}

Yes

{{or}}

No

{{/select}}

Благодаря таким конструкциям выбора, в Guidance можно гибко настраивать генерацию нужного текста или данных в зависимости от ситуации — будь то формирование отчётов, документации, реализация пошаговой обработки или пайпинг.

Кроме того, большим плюсом Guidance является возможность подключения разных языковых моделей, а не только конкретных решений вроде GPT-3 или Codex. Подключение происходит не через API, а с помощью встроенных трансформеров, как в примере для self-hosted модели Facebook LLaMA:

llm = guidance.llms.Transformers("your_local_path/llama-7b", device=0)

Это даёт нам гибкость в выборе оптимальной модели под задачу и возможность легко менять её при необходимости, не ограничиваясь только популярными облачными решениями.

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

А что такого в Guidance?

Когда наша команда разработчиков приступила к изучению Guidance, мы были приятно удивлены обилием полезных и интересных фишек.

Про token healing мы уже упоминали выше, но хочется остановиться на этом подробнее.
В процессе создания языковых моделей часто используются стандартные «жадные» токенизаторы. К сожалению, они вносят скрытое, но достаточно сильное искажение, которое может приводить к непредсказуемому поведению LLM.

Давайте разберёмся на конкретном примере из документации на GitHub. Представим, что мы пытаемся сгенерировать URL-строку:

# Мы используем StableLM как открытый пример, но эти проблемы затрагивают все модели в той или иной степени

guidance.llm = guidance.llms.Transformers("stabilityai/stablelm-base-alpha-3b", device=0)

 # Мы отключаем token healing, чтобы guidance вела себя как обычная библиотека подсказок

program = guidance('''Ссылка:

В Guidance это решается с помощью token healing. Эта техника откатывает модель на шаг назад, а затем разрешает модели двигаться вперёд, ограничивая её генерацией только тех токенов, префикс которых совпадает с последним токеном. Это исключает искажение токенизатора и позволяет завершить промпт естественным образом.

prompt = 'Ссылка:


По нашему мнению, Guidance может заинтересовать многие IT-компании и стартапы благодаря такой доступности технологии. Уверены, на его основе вскоре появится немало инновационных продуктов.

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

© Habrahabr.ru