
В прошлом году я много следил за релизами нейросетей Stable Diffusion, Dalle-2 и ChatGPT. Мне было интересно попробовать их и понять, на что они способны в разработке ИИ-сервисов. В статье расскажу, как в конце прошлого года мы с коллегами: Зоей Воловиковой (МФТИ) и Александром Пановым (AIRI, МФТИ) подготавливали решение для соревнования IGLU (NeurlPS 2022), где использовали ChatGPT для обработки и анализа текстовых данных с помощью простых запросов.
Надеюсь, что наш опыт будет интересен и полезен для вас!
Соревнования конференции NeurIPS
NeurlPS ‑ одно из крупнейших и наиболее популярных сообществ, объединяющих исследователей и практиков в области глубокого обучения. Соревнования по машинному обучению в рамках NeurlPS — это продвижение исследований в области глубокого обучения, совершенствование алгоритмов и методов обработки данных, а также предоставление практического опыта и возможности для сравнения различных подходов и моделей в решении конкретной задачи. Все участники имеют возможность поделиться своими результатами и получить обратную связь от других участников и организаторов соревнования.
IGLU (Interactive Grounded Language Understanding)
Цель соревнования – разработка интерактивного агента, который будет решать задачу, получая инструкции на естественном языке от человека.
Соревнование делится на две части: RL task и NLP task; Более подробное описание можно найти по ссылке.
Первая часть (RL task) предполагает обучение агента выполнять задания, выданные на естественном языке, для построения объемных фигур в среде по типу Minecraft.
Вторая часть (NLP task) ставит задачу генерации вспомогательных вопросов для уточнения задания в диалоге с пользователем.
Как это должно работать вместе? Вот хорошая иллюстрация:

Мы сосредоточены на решении RL task, поэтому рассмотрим постановку задачи этой части соревнования. Есть среда, которая выдает наблюдения агенту: команду на естественном языке — что необходимо построить, показания компаса, и изображение — что видит агент в месте, где он находится.
Необходимо решить две задачи:
Преобразование диалога в воксель размера 9 на 11 на 11, отображающий форму фигуры, которую необходимо построить агенту.
RL агент, который берет на вход 3d воксель и, ориентируясь на него, строит соответствующую фигуру в среде IGLU.
Вдохновленные прогрессом 2022 года в области NLP моделей, мы задались вопросом, можно ли научить ChatGPT решать первую часть только с помощью промт‑запросов?
Данные диалогов
Данные, с которыми необходимо работать, это реплики диалога Архитектора <Architect> и строителя <Builder>. Архитектор дает команды (что необходимо построить), а строитель задает уточняющие вопросы. Примеры диалогов приведены в колонке таблицы task. В правом столбце координаты кубиков, которые необходимо установить в 3d пространстве.
task | target_grid |
<Architect> Facing north, build three stacks of two orange blocks, then destroy the bottom orange block on all three stacks | ((1, 4, 2), (1, 5, 2), (1, 6, 2)) |
<Architect> Make a row with 3 orange blocks next to each other | ((0, 4, 3), (0, 5, 3), (0, 6, 3)) |
<Architect> Make a row with 3 orange blocks next to each other <Architect> Place another green block to the southeastern side of the eastern most block. | ((0, 4, 3), (0, 4, 4), (0, 5, 3), (0, 6, 3)) |
<Architect> Make a row with 3 orange blocks next to each other <Architect> Place another green block to the southeastern side of the eastern most block. <Architect> Place a green block to the west of the green block that's already present. Then, destroy the green block that's there. | ((0, 3, 4), (0, 4, 3), (0, 5, 3), (0, 6, 3)) |
Промпт-запрос для предсказания координат фигуры по диалогу с пользователем
Вариант 1
Лобовой промпт для генерации координат по диалогу выглядит так:
Coordinates are (x, y, z). x coordinate decreases towards west, the y coordinate increases towards the sky and the z coordinate increases towards south. For example, if the grid has a column of 3 blue blocks in positions (3, 0, 1)(3, 1, 1)(3, 2, 1), to build a column 5 blocks high in the south east corner, the new grid is (3, 0, 1)(3, 1, 1 )(3, 1, 1)(-5, 0, 5)(-5, 1, 5)(-5, 2, 5)(-5, 3, 5)(-5, 4, 5). Given a grid that has, facing North, 1 red blocks in position (-3, 0, 0) Place eight orange blocks around the red block in a single layer Give me a list of coordinates of the new grid relative to the center of the grid.
Сначала мы используем информацию о нашей среде и игровой сетке и связь координат со сторонами света, так как в диалогах Архитектор общается с помощью этих понятий:
Coordinates are (x, y, z). x coordinate decreases towards west, the y coordinate increases towards the sky and the z coordinate increases towards south.
Далее даем пример, показывающий связь команд из диалога с координатами, которые выводит агент:
For example, if the grid has a column of 3 blue blocks in positions (3, 0, 1)(3, 1, 1)(3, 2, 1), to build a column 5 blocks high in the south east corner, the new grid is (3, 0, 1)(3, 1, 1 )(3, 1, 1)(-5, 0, 5)(-5, 1, 5)(-5, 2, 5)(-5, 3, 5)(-5, 4, 5).
После идет тестовая команда из датасета:
Given a grid that has, facing North, 1 red blocks in position (-3, 0, 0) Place eight orange blocks around the red block in a single layer Give me a list of coordinates of the new grid relative to the center of the grid.
Вывод ChatGPT:

Да, ChatGPT возвращает координаты! Но насколько правильно? Мы подали на вход модели диалога из датасета, отрисовали полученные фигуры и посчитали метрику F1 между задуманной фигурой и предсказанной ChatGPT.

Визуально фигуры похожи на оригинальные, что касается метрики, измеренной на всем датасете, то без учета цвета кубиков (вокселей) F1 ~= 0.61 . Если учитывать цвет, то результаты выходят скромнее F1 ~= 0.35
Вариант 2. Тюнинг промта
Если внимательно посмотреть ответы ChatGPT, можно будет обнаружить, что при генерации фигур она имеет следующие проблемы:
Путает координаты, причем было замечено, что ChatGPT часто пытается выдать координату z - за ту, которая отвечать за направление к небу;
Она пропускает часть команд из диалогов, особенно те, что касаются удаления;
Часто в диалоге встречаются какие-то абстрактные понятия по типу “tower, line, row, column, middle of grid”. С точки зрения семантики можно понять, что из себя представляют эти слова, но без примера нельзя понять, в какой плоскости их необходимо строить.
Часто строит фигуры в воздухе, а метрика f1 чувствительна к сдвигу по координате, отвечающей за направление к небу.
В связи с этим мы поправили промпт-запрос на следующий:

Первым делом мы даём подробное описание среды, причем меняем местами координаты, сделав последнюю z отвечающей за стремящееся к небу направление.
Дальше даём примеры для связи координат и направлений.
Указываем стартовую позицию.
Даём пример того, что должен делать ChatGPT.
Добавляем информацию о некоторых паттернах из диалога.
А еще в этом подходе мы попытались не давать ChatGPT весь диалог за раз. Мы выдавали запросы по команде и добавили цвета.

Вот получившиеся фигуры. Теперь, во-первых, они строятся от земли, а во-вторых – выглядят визуально ближе к оригиналам. Посмотрим метрики: F1(target, predicted) ~= 0.48 с учетом цвета.
Промпт-запрос для аугментации данных
Наверняка, из ChatGPT можно выбить результаты и лучше, но в процессе реального соревнования это не поможет из-за организационных ограничений. Тем не менее, раз ChatGPT умеет справляться с заданием генерации координат и по диалогу и понимает среду, можно попробовать использовать модель как алгоритм аугментации данных.
Ниже приведем промпт для того, чтобы включить ChatGPT в режим алгоритма аугментации данных.

Промпт также включает в себя описание среды. Далее идет контекст задачи IGLU и контекст задачи алгоритма Аугментации данных.
Красным выделена основная часть, которая вводит ChatGPT в режим работы алгоритма аугментации данных, давая четкое описание поведения, которое от него ожидается.
Ну и далее идут примеры того, как этот алгоритм должен работать.
Пример, что получилось на выходе:

На глаз, генерирует стабильно хорошо, четко в инструкциях передавая тот же смысл, что и в оригинальной фразе.
Инсайты
Где-то после 20 запросов качество предсказаний ухудшается и ChatGPT может отказаться работать:
Синдром выученной беспомощности
Если пару раз дать сети задания, с которыми она не может справиться, то позже она не сможет решить даже простые, с которыми справлялась в начале сессии.
Вместо выводов

Если коротко, то мы взяли ChatGPT в качестве замены NLP модуля для соревнования IGLU. В отличие от классического применения — генерации текста или кода, нужно было генерировать координаты блоков, которые будет строить RL агент. С этой задачей ChatGPT довольно хорошо справилась даже в первом приближении, а правильный промт‑инжиниринг позволил существенно улучшить эти результаты. Выиграть соревнование с таким подходом, к сожалению, не получится, так как агенты обычно тестируются в контейнерах, у которых нет доступа к интернету, а соответственно к OpenAI API. Но даже если модель недоступна, всегда можно использовать её навыки для чего‑то полезного, например, аугментации данных.