Введение

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

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

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

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

Сразу к сути

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

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

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

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

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

Еще одна полезная особенность 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('''Ссылка: <a href="http:{{gen max_tokens=10 token_healing=False}}''')

program()

Заметим странность: вместо ожидаемого http:// модель возвращает что-то вроде http: /. Причина в том, что токенизатор разбивает строку :// на отдельные символы. Увидев :, модель решает, что // тут быть не может, иначе использовался бы целый токен ://.

Это не ограничивается только двоеточием, такая ситуация встречается практически повсеместно. Более 70% распространённых токенов являются префиксами более длинных токенов. Это приводит к ошибкам на границах токенов.

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

prompt = 'Ссылка: <a href="http:{{gen token_healing=True}}'

output = model(prompt)  

# теперь корректно сгенерирует http://

Еще один большой плюс для нас как разработчиков - удобные средства отладки кода. Особенно нам пригодилась реализованная в Guidance функция "пошагового выполнения". Она позволила детально анализировать выполнение каждой строки и оптимизировать логику приложения.

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

А что еще?

По мере изучения Guidance, мы все больше осознавали полезность возможностей этого инструмента.

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

Еще одна крутая штука - это вызов функций. Можно вызывать любые функции Python, используя сгенерированные переменные в качестве аргументов. Функция будет вызвана при выполнении подсказки:

```python

def aggregate(best):

  return '\n'.join(['- ' + x for x in best])

prompt = guidance('''Лучшее на пляже - это {{~gen 'best' n=3 temperature=0.7 max_tokens=7 hidden=True}}  

{{aggregate best}}''')

prompt = prompt(aggregate=aggregate)

print(prompt)

```

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

Кроме текстов, Guidance позволяет удобно работать с самыми разными данными - создавать таблицы, генерировать отчёты в нужном формате. При этом выходные данные всегда получаются валидными. Например, JSON-данные корректно отформатируются даже при использовании сложных вложенных структур. То же самое касается XML, CSV и других форматов.

Итоги

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

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

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



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

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

Комментарии (1)


  1. george3
    20.10.2023 07:56

    его альтернатива - https://github.com/outlines-dev/outlines