Как я писал умного ИИ-мастера ДнД, а игроки его сломали в первый день
ДнД + ИИ
Только познакомился с ДнД, влюбился — и тут в играх появилась пауза. А мне очень хотелось её заполнить. Играть было не с кем, и я решил попробовать поиграть с обычным ИИ-ассистентом Gemini. Создал бота с большим промптом (правила, стилистика и т.д.), с помощью того же ИИ создал сценарий, его тоже подгрузил боту - и понеслась!
Поначалу было прям вау! Описание живое, атмосферное и плавное. Враги коварные, npc прикольные — супер! И главное, я ощутил "правильный" вайб :) В общем, зацепило.
Потом создал ещё два сценария, их тоже прошёл. Смущало, что быстро как-то. Сценарии я генерил на 8-10 локаций, а тут через 5 ты уже победил финального босса. Решил перепройти один — начало такое же, финальный босс вроде похож, середина — другая. Как так? Проверил — а в сценарии, кроме первой локации, всё другое! NPC прописаны, артефакты, те же локации. А в игре их нет. Сценарий, по которому меня вёл виртуальнй мастер, оказался галлюцинацией.
Как оказалось, с ИИ-ассистентом играть не так-то просто. Во-первых, ты постоянно переписываешь и доправляешь промпт. Во-вторых, он не умеет кидать кубы, он лишь угадывает подходящие значения. Потом, он подыгрывает: если ситуация тяжёлая, он придумает как тебя спасти, даже самым нелепым образом. Дарует силу, призовёт помощь, сделает волшебным и могучим найденную бесполезную безделушку... Наконец, он не помнит — ни что было 10 ходов назад, ни какая вторая локация в сценарии. Банальная нехватка контекста. И вот это всё сильно ломает кайф.
Сделаю сам!
И тогда я подумал: а вдруг я смогу как-то улучшить этот опыт? Тем более что я как-то делал себе бот-напоминалку в тг на N8N, плюс под эту платформу есть даже готовый шаблон ДМ (спойлер: такое себе)... в общем, звёзды совпали! Я решил собрать своего Франкенштейна.
За основу взял как раз N8N + Telegram. Для стадии PoC (проверки концепта) это идеальный вариант: логика наглядно собирается стрелочками, связи очевидны, и не нужно тратить недели на написание бэкенда с нуля там, где можно провериться за несколько вечеров. Плюс у них есть ноды-агенты и лёгкая интеграция почти с чем угодно. Для хранения данных выбрал Google sheets. Сами данные оказалось удобно хранить в json, примерно так:
В сочетании с N8N это оказалось чертовски удобным. На каждом шаге можно открыть входящий и исходящий json и посмотреть, что там внутри и всё ли правильно.
Общий алгоритм выполнения получился следующий:
1. получаем сообщение игрока
2. собираем данные локации и историю из гугл таблиц
3. пакуем всё это вместе, чтобы скормить LLM
4. агент переваривает и выдаёт мега-json со всеми изменениями
5. парсим ответ LLM
6. обновляем базу данных (гугл таблицы)
7. пишем ответ ИИ-мастера игроку
Что касается ИИ, тут всё просто. В N8N есть готовая нода LLM нода, к ней привязывается модель, на которую у вас есть подписка и API ключ; я использовал groq/llama-70b-versatile. Сборку входных данных для агента и парсинг его ответа я сделал через JS ноды, код которых любезно написал для меня ChatGPT.
В результате получилась вполне рабочая схема.Я потратил какое-то время на перекладывание своего готового сценария на 10 локаций в json и раскладывание по табличкам, и сел играть. Поскольку локации и статы лежат в базе, бот не может их забыть. Из любой локации можно идти только туда, куда прописаны переходы, и никаких "тайных проходов". Броски теперь не сочиняются, а честно генерируются отдельным инструментом. Ну, круто! На этом Франкенштейне я и прошёл свой сценарий.
PoC работает!
Гений архитектуры
Правда, я очень быстро понял, что одной моделью не обойдёшься. Если одна LLM будет и помнить данные локации, и интерпретировать намерения, и генерить проверки, и писать историю, и сериализовать JSON - она всё это будет делать в равной степени плохо. И тогда я решил разделить ответственность. На тот момент мне удалось выделить 3 максимально разных компонента:
* "Боец" отвечает только за бой (атаки игрока и NPC);
* "Арбитр" отвечает за мирную логику, загадки, триггеры врагов и так далее;
* "Рассказчик" отвечает за нарратив.
Расчёт результатов бросков кубов, подсчёт попаданий и hp, флаги и прочие статы (загадка решена, враг побеждён, какой сейчас раунд и чей ход) — это было вынесено в код.
Схема вышла примерно такая, и по сути это стало ядром движка. Помню, я тогда ощущал себя архитектурным гением!
Альфа тест
Реализация и отладка заняли время, результаты радовали, в целом всё работало. Пришло время показать сие живым игрокам, и 1 июня я запустил закрытый альфа тест. Я сделал одну локацию, закинул туда пару монстров, одну загадку — и дал доступ друзьям и знакомым игрокам в ДнД.
Первое, что я увидел — игру убивают галлюцинации ИИ-мастера: игроки осознают, что мастер мелет чушь, и отваливаются. Ирония в том, что галлюцинациях я знал, но относился к ним как к незначительной ерунде: на самом деле движок считает "правильно", просто надо промпт доработать, это ж фигня! Очень по-технарски. А вот задержки в ответах (DeepSeek-v4-Flash ни разу не flash), как ни странно, людей практически не бесили.
Вторая важная штука — игрокам важна свобода. Сеттинг: стоит чаша-загадка, куда надо положить что-то ценное, а рядом стриггерился враг, начинается бой. Игнорируя врага, игрок несколько ходов подряд пытался то откусить, то отрезать себе палец, чтобы положить в чашу. А бот позволяет либо решать загадки, либо сражаться. Или-или. А резать пальцы вообще не умеет.
Третья — правила. Тут я угадал, и они более-менее работали. Но как только удавалось лишний раз атаковать — сразу сообщали, что боёвка сломана.
В общем, самое важное — не баги или их отсутствие. Важен драйв. Важно то, ради чего игроки хотят играть, важны эмоции — и негативные (чего избегать), и позитивные (что давать). В моём случае нужная формула выглядит так: свобода в рамках правил плюс непротиворечивый нарратив.
Опыт бесценный, и я очень благодарен моим альфа тестерам. Без обратной связи от них я бы так и продолжал полировать собственные фантазии.
Сейчас я практически полностью переделываю движок, чтобы обеспечить эту самую триаду — свободу, правила и хорошие ответы ИИ-мастера. Скоро буду собирать людей на вторую альфу. Если хотите поучаствовать и попытаться сломать моего бота — залетайте в канал.