Как мы создали нейросеть для генерации квестов в ARPG
Всем привет! Многие из вас слышали о том, что кто-то опять добавил в свою игру/мод к игре какую-то нейросеть. Сейчас я вам расскажу как это сделали мы.
Модов на Skyrim с интеграцией ChatGPT выходит всё больше и больше, но они не очень сильно погружают в игру. Проблема в том, что знания NPC не ограничены миром игры и вот ты уже можешь пообщаться с Толфдиром о Гендальфе.
Мы решили использовать нейросети иначе. Мы вдохновились проектом AI Dungeon, который использует ChatGPT для создания приключений в стиле Dungeons & Dragons. Это очень круто, но интегрировать подобную технологию в игровой движок вроде Unreal Engine не так-то просто. AI Dungeon может использовать огромное количество различных действий с помощью текста, но в игре все эти возможности должны быть визуально отображены, что представляет собой серьезную проблему. В текстовой игре отображение всего, что выдает нейронная сеть, ложится на наше воображение, в игровом движке - нет. Помимо этого, языковые модели могут выдумывать новые факты и предметы, которые вообще не соответствуют состоянию мира.
Мы пошли другим путём. Что если мы организуем состояние мира: все игровые объекты, их связи и состояния, в виде одной базы данных, а после представим их в виде графов, то есть множества соединенных между собой сущностей. Давайте объясню на пальцах: Допустим, у нас есть несколько игровых сущностей: Геральт, Каэр-морхен. Сначала зададим типы этих сущностей: персонаж, локация. После создадим несколько видов связей: тип, находится_в. И теперь соединим всё воедино, мы получаем следующие пары: Геральт -тип- персонаж, Каэр-морхен -тип- локация, Геральт -находится_в- Каэр-морхен.
Мы можем уточнять каждый вид связи, добавлять условия, например, -находится_в- может соединять только персонажа и локацию или предмет и локацию.
А теперь о генерации. В статье про процедурную генерацию квестов Vincent Breault предложил рассматривать квесты как набор действий, которые трансформируют состояние мира. И этот набор действий мы можем задавать сами (например, убить, принести, снять проклятие и т.д.). А в своей диссертации Efstathios Goudoulakis определил тип мотивации для каждого реализованного действия и распределил их на три класса: увеличивающие напряжение, не влияющие на напряжение, уменьшающие напряжение. Таким образом, если представить цепочку квестов как сюжетную арку, в начале будут квесты, увеличивающие напряжение, в конце - уменьшающие.
Но все вышеперечисленные статьи использовали очень неэффективные и сложные в вычислениях алгоритмы (да, более дорогие по вычислениям чем нейросети). Мы же решили обучить графовую нейронную сеть создавать такую последовательность действий, которая будет складываться в сюжетную арку.
Однако, сюжет - это что-от большее чем просто складывающиеся в арки квесты. Из-за этого нам пришлось вручную отсматривать результаты генерации модели, субъективно оценивать их и потом дообучать модель на наших оценках. Таким образом мы получили модель, которая умеет генерировать маленькие истории, которые можно использовать в качестве второстепенных квестов.
Мы всё ещё продолжаем работу как над моделями, так и над нашей игрой. Мы ещё не начали вести социальные сети этого проекта, но если вам интересно, я пишу о нём в своем telegram канале.
Также мы планируем после окончания разработки системы генерации квестов, оформить её в виде плагинов для популярных игровых движков, таких как UE или GODOT.