Языковые модели и эволюционные алгоритмы для улучшения промптов

Мы уже неоднократно разбирали решения в области ИИ, которые вдохновлены в большей или меньшей степени конкретными биологическими механизмами. В основном речь идет о процессах, которые происходят у нас в мозгу: обработка зрительной информации, обращение к гиппокампу для использования памяти и все такое. Однако сам процесс эволюции тоже был позаимствован для создания группы алгоритмов, которая так и называется: «эволюционные алгоритмы».
Вкратце идея эволюционных алгоритмов заключается в следующем:
1) создадим несколько разных моделей с разными параметрами и используем их для решения нашей задачи;
2) автоматически отберем несколько таких, которые справились лучше всего;
3) совместим их несколькими разными способами (используем разные комбинации параметров), чтобы получить новую группу моделей;
4) снова протестируем на нашей задаче и так далее.
В конце концов у нас получится очень хорошая модель, которая прекрасно умеет решать поставленную задачу. Такие алгоритмы часто используются в задачах оптимизации, когда нужно добиться наилучшего из возможных результата при наименьших из возможных затратах.
И, разумеется, такие алгоритмы можно использовать с большими языковыми моделями, куда же без них. Так что сегодня мы изучим статью «Connecting Large Language Models with Evolutionary Algorithms Yields Powerful Prompt Optimizers» («Совмещение больших языковых моделей с эволюционными алгоритмами создает мощные оптимизаторы промптов»). Эта статья была опубликована в сентябре 2023, затем в феврале 2024 была опубликована вторая версия. Я сразу буду использовать ее.

EvoPrompt

Результаты работы больших языковых моделей сильно зависят от качества и структуры промпта. Стоит немного изменить запрос, и ответ тоже меняется, но у нас не всегда есть возможность сидеть и тестировать по несколько вариантов одного и того же запроса, чтобы выбрать лучший. А эволюционные алгоритмы как раз этим занимаются: прогоняют множество вариантов, отбирают наилучшие. Так что попытка использовать их для отбора промптов – логичная и здравая мысль.
Кроме того, эволюционные алгоритмы – это не черный ящик. Можно визуализировать весь процесс отбора и посмотреть, что на каком этапе менялось в промптах, какие показали наиболее высокую эффективность. Это важно, потому что мы хотим контролировать процесс и не полагаться на инструменты, принципы работы которых не можем объяснить.
Авторы статьи предлагают новый фреймворк – EvoPrompt – для отбора промптов. Это проект с открытым исходным кодом, его можно установить и протестировать по инструкции, которая приводится в официальном репозитории.
EvoPrompt состоит из трех этапов:
1) формирование исходной популяции (набора промптов, часть из которых написана людьми, часть – языковой моделью);
2) эволюция (комбинирование промптов из популяции и создание новых);
3) отбор (исключение промптов с низкой эффективностью).
После отбора снова происходит эволюция и так до тех пор, пока число повторений «эволюция -> отбор» не достигнет заранее установленного значения. В этот момент в популяции остаются промпты с наиболее высокой эффективностью, из которых можно выбрать один или несколько вариантов.

Для осуществления эволюции авторы выбрали два типа алгоритмов: генетический (Genetic Algorithm, GA) и дифференциальный (Differential Evolution, DE). Варианты работы EvoPrompt, соответственно, называются EvoPrompt (GA) – с генетическим алгоритмом – и EvoPrompt (DE) – с дифференциальным.
Оба алгоритма основаны на двух ключевых понятиях, заимствованных из биологии: «мутация» и «кроссовер».
Кроссовер – это «пересечение» промптов, то есть, комбинирование его частей для получения нового промпта.
Мутация – это изменение компонентов промпта. Она происходит случайным образом.
Рассмотрим оба алгоритма подробнее.
Генетический алгоритм прост для понимания и включает в себя два шага: сначала кроссовер двух родительских промптов, потом мутация получившегося нового.

<i>Генетический алгоритм</i>
Генетический алгоритм

На картинке показан наглядный пример: из оранжевого и голубого промптов сначала составлен новый путем простой комбинации отдельных частей, а затем часть слов в новом промпте заменена на синонимы. Например, фраза «Твоя миссия – установить настроение» заменена на «Определи настроение».
Родительские промпты для кроссовера выбираются пропорционально их качеству (в статье «fitness»; в биологии это «приспособленность», а применительно к промптам – мера того, насколько хороший результат получается при их использовании). Результат оценивается на наборах данных, для которых есть правильные ответы. Например, у нас есть отзывы на товар, которые уже помечены как позитивные и негативные. Эти отзывы передают модели вместе с промптом и смотрят, насколько полученный результат совпадает с имеющимися метками. Больше совпадений – лучше промпт (это очень грубо, на самом деле метрики разные для разных задач и более продуманные, но я эту часть здесь опущу, чтобы не усложнять пост лишний раз).

Вероятность того, что промпт будет выбран для кроссовера, равна его точности, деленной на сумму точностей других промптов в популяции («точность» – это не вполне корректный перевод для термина «fitness», но примем его для краткости). Таким образом, чем лучше промпт, тем больше у него шансов «оставить потомство», однако ни для одного промпта вероятность не равна 100%.
Дифференциальный алгоритм немного сложнее и фокусируется на разнице между родительскими промптами.

<i>Дифференциальный алгоритм</i>
Дифференциальный алгоритм

Дифференциальный алгоритм трансформирует текст в векторы и работает с ними (то есть, кроссовер, например, осуществляется не через заимствование слов, а через заимствование компонентов вектора, в который было обращено предложение, но в целом логика примерно та же, если не вдаваться в подробности). Формулы на примере выше описывают как раз математические операции с векторами.
Алгоритм эволюции в этом случае такой:
1) в самом начале выбирается один базовый промпт;
2) затем отбираются два новых родительских промпта (базовый промпт не входит в их число), у них выделяются отличающиеся компоненты;
3) отличающиеся компоненты случайным образом мутируют, то есть заменяются на другие компоненты;
4) выбирается еще один промпт. Некоторые его компоненты (похожие на выделенные на этапе 2) заменяются на новые, полученные на этапе 3. Получается новый промпт (пятый);
5) наконец, проходит кроссовер пятого промтпа с базовым промптом, выбранным в самом начале, и получается финальный результат.
Таким образом в ходе создания новых промптов обеспечивается больше разнообразия.

Результаты

С помощью EvoPrompt (GA) получились лучшие результаты на задаче определения настроения текста (как в примерах выше), а EvoPrompt (DE) лучше отработал на задаче классификации текста по разным темам. В целом они показали достаточно близкие результаты, но по ряду задач EvoPrompt (DE) был немного лучше. И оба варианта заметно обошли предшественников.
В статье приведены результаты множества экспериментов, которые позволяют заключить, что использование эволюционных алгоритмов – действительно хорошая идея, к которой стоит присмотреться, чтобы улучшить качество работы больших языковых моделей.
P.S.: Помимо аккаунта здесь у меня еще есть телеграм и аккаунт на дзене, можете заглянуть.

Начать дискуссию