В прошлом году я много следил за релизами нейросетей Stable Diffusion, Dalle-2 и ChatGPT. Мне было интересно попробовать их и понять, на что они способны в разработке ИИ-сервисов. В статье расскажу, как в конце прошлого года мы с коллегами: Зоей Воловиковой (МФТИ) и Александром Пановым (AIRI, МФТИ) подготавливали решение для соревнования IGLU (NeurlPS 2022), где использовали ChatGPT для обработки и анализа текстовых данных с помощью простых запросов. Надеюсь, что наш опыт будет интересен и полезен для вас! NeurlPS ­­‑ одно из крупнейших и наиболее популярных сообществ, объединяющих исследователей и практиков в области глубокого обучения. Соревнования по машинному обучению в рамках NeurlPS — это продвижение исследований в области глубокого обучения, совершенствование алгоритмов и методов обработки данных, а также предоставление практического опыта и возможности для сравнения различных подходов и моделей в решении конкретной задачи. Все участники имеют возможность поделиться своими результатами и получить обратную связь от других участников и организаторов соревнования. Цель соревнования ­– разработка интерактивного агента, который будет решать задачу, получая инструкции на естественном языке от человека. Соревнование делится на две части: 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)) Лобовой промпт для генерации координат по диалогу выглядит так: 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 Если внимательно посмотреть ответы 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. Но даже если модель недоступна, всегда можно использовать её навыки для чего‑то полезного, например, аугментации данных.   Обучаю агентов методом проб и ошибок