Кубики в DnD с ИИ-мастером: почему бросок нельзя доверять нейросети

Кубики в DnD с ИИ-мастером кидает код, а не нейросеть. Движок бросает d20, считает попадание, урон и инициативу, а языковая модель получает готовый результат и только описывает сцену. Менять числа ей нельзя: LLM не умеет быть честным генератором случайных чисел и склонна дописывать правдоподобные, но выдуманные броски.
Кубики в DnD — единственное место за столом, где нейросети верить нельзя вообще. Она отлично опишет, как кабан вылетает из подлеска и сшибает тебя с ног, но если попросить её же назвать результат броска, она не бросит ничего: просто допишет правдоподобное число. У меня в AI-Мастере это долго жило вместе, и вылезало это самым дурацким образом — вплоть до того, что дикий кабан в лесу оказывался бандитом. Дальше расскажу, почему бой пришлось вынуть из рук рассказчика и отдать коду, и что изменилось после.
Кто кидает кубики в DnD с ИИ-мастером?
Кубики кидает код, а не нейросеть. В AI-Мастере генератор случайных чисел живёт в движке: он бросает d20, складывает модификаторы, сравнивает с классом брони и записывает урон. Нейросеть получает уже готовый результат и только рассказывает, как это выглядело. Число она увидеть может, изменить — нет.
Правило одной строкой: нейросеть не имеет права трогать числа. Ни свои, ни твои.
Звучит скучновато, но именно на этой границе держится ощущение честной игры. Если рассказчик может подкрутить бросок ради красивой сцены — ты перестаёшь верить любому броску, включая удачные. А доверие к кубику — это, вообще-то, весь ДнД.
Почему нейросеть не умеет честно бросать d20?
Языковая модель не бросает кубик, а предсказывает следующее слово. Число «14» она пишет тем же способом, что и остальную прозу — по совпадению с паттернами из обучающих данных. Поэтому её «случайные» числа только выглядят случайными: распределение у них кривое и предсказуемое, а иногда модель уверенно называет то, чего на кубике вообще нет.
Это не моя догадка, это меряли. В простом тесте «назови случайное число от 1 до 10» GPT-4o ответил «7» 92 раза из 100, Claude 3.5 Sonnet — 90 из 100, а Gemini 2.0 Flash выдал семёрку все 100 раз подряд (springboards.ai). Отдельная работа Хавьера Коронадо-Бласкеса (arXiv, февраль 2025) разбирает то же самое подробнее: модели при запросе на случайность ведут себя скорее детерминированно, и смещения у каждой свои — они зашиты в данные обучения (arXiv:2502.19965).
Теперь представь эту семёрку в бою. Ты десять раундов подряд получаешь «крепкий средний» результат, боссы не промахиваются в критические моменты, а твой Плут почему-то никогда не выкатывает двадцатку. Игра формально идёт, но кубик перестал быть кубиком — стал настроением рассказчика.
Есть и вторая, менее очевидная беда: модель может назвать невозможное. На двадцатигранном кубике выпадает 47, спасбросок проходит при результате ниже сложности, урон меняется по дороге от описания к подсчёту. Код такого не умеет в принципе — там математика верна по определению, а не по совпадению.
Откуда берётся кабан-бандит?
Кабан-бандит — это когда рассказчик сам придумывает участника боя, вместо того чтобы взять его из бестиария. Модель знает, что «в кустах кто-то шуршит» обычно заканчивается стычкой, и достаёт первое, что подходит по жанру — разбойника с большой дороги. С точки зрения текста всё складно. С точки зрения правил в лесу вместо зверя появился гуманоид с оружием, репликами и, если не поймать, ещё и с награбленным золотом.
У меня это чинилось апдейтом 16 июня 2026: дикие звери теперь заводятся как звери — со своим типом и нормальным именем, а не как бандиты (t.me/dnd5chat/195). Тем же апдейтом уехали ещё две болячки того же корня: характер NPC перестал плавать от реплики к реплике, а убийство квестодателя перестало быть тупиком — мир теперь как-то отвечает на такое, а не замирает.
Ровно та же история была с добычей. Пока лут жил только в описании боя, найденный кинжал оставался красивой фразой: в инвентарь он не попадал, а имена предметов приезжали то с техническими кодами, то с заглавными буквами не там. Следующим апдейтом, 17 июня 2026, лут переехал в структуру — теперь движок вытаскивает предметы из описания и кладёт их тебе в сумку по-настоящему (t.me/dnd5chat/196).
Общее у всех этих багов одно. Это не «нейросеть тупит». Это рассказчику дали право заводить сущности, которых нет в состоянии игры. Кабан-бандит, плавающий характер и мёртвый квестодатель — три хвоста одной проблемы: мир жил в тексте, а не в структуре.
Как отделить движок боя от рассказчика?
Разделение простое: детерминированное — в код, творческое — модели. Броски, порядок ходов, хиты, слоты заклинаний, состояния вроде «отравлен» считает движок и хранит в состоянии боя. Нейросеть получает машиночитаемый результат раунда и превращает его в сцену. Проза может быть какой угодно, числа — только те, что пришли из движка.
Такую гибридную схему сейчас собирают почти все, кто делает ИИ-ведущего всерьёз: правила и арифметика — в коде, интеллект и повествование — в модели, и именно это разделение мешает ей «переписать» правила по ходу дела (dev.to).
Если совсем по-простому, то у меня внутри так:
- Движок держит список участников боя, их характеристики и текущее состояние. Взяться в этом списке из воздуха нельзя — только через явное событие «появился монстр такой-то».
- Движок бросает кубики и считает попадания с уроном. Результат уходит модели уже готовым.
- Модель описывает раунд и ведёт реплики. Ей видно, что произошло, но не дано это менять.
- Всё, что модель попыталась дописать сверх — новых врагов, чужой урон, внезапный лут — движок просто не принимает.
Кстати, к тому же классу задач относится и старый баг с потерянным ходом: когда в сцене появлялся новый персонаж, очередь могла съесть чей-то ход. Это тоже вылечилось на стороне движка, а не уговорами промпта.
Как считается инициатива в ДнД, когда ведёт нейросеть?
Инициатива в ДнД — это порядок ходов в бою, и определяется он броском d20 с модификатором Ловкости. У ИИ-мастера этот бросок делает код: движок катает инициативу всем участникам разом, выстраивает очередь и держит её до конца боя. Нейросеть очередь видит и озвучивает, но переставить в ней никого не может.
Разница вылезает ровно тогда, когда становится интересно. Рассказчику драматургически хочется, чтобы босс ударил первым, а союзник героически успел вмешаться в последний момент. Очередь, живущая в тексте, под это тихо подстроится. Очередь, живущая в структуре, — нет: ходи как выпало, выкручивайся.
Что изменилось в боёвке после разделения?
Что было: рассказчик вёл бой целиком. Враги появлялись по настроению сцены, кабан мог оказаться бандитом, числа плавали, а очередь ходов иногда теряла участника. Играть было местами весело, но проверить игру на честность было невозможно — спорить с рассказчиком о его же броске бессмысленно.
Что стало: бой считает движок, а модель его рассказывает. Кабан остаётся кабаном, инициатива не переигрывается ради красивого момента, а результат броска один и тот же и в описании, и в подсчёте урона. Скучных описаний от этого не прибавилось — модели, наоборот, стало легче, когда с неё сняли бухгалтерию.
Честно скажу: это активная стройка, а не «мы всё починили». Баги по бою ещё ловятся, часть из них по-прежнему про границу между движком и текстом. Ребят из чата, которые эти штуки исправно отлавливают и присылают — спасибо, без вас половина этого списка так и жила бы в проде )
Что тогда вообще решает нейросеть?
Всё, что не сводится к числу. Как выглядит удар, что кричит гоблин, соглашается ли трактирщик помочь, чем закончится разговор, который правила вообще не описывают. Это работа рассказчика, и здесь модель хороша настолько, что живого Мастера местами напоминает всерьёз.
Больше того, модель решает и то, что случится дальше по сюжету — просто предлагает это движку событиями, а не ставит перед фактом. Хочет вывести из-за камня второго кабана? Пожалуйста: движок заведёт зверя из бестиария, с честными характеристиками и своим местом в очереди ходов. Разница только в том, что кабан после этого существует по правилам, а не по вдохновению.
Забавно, что академическая работа пришла к тому же выводу раньше меня. В исследовании CALYPSO (Чжу и соавторы, конференция AIIDE, 2023) языковую модель ставили не вместо Мастера, а рядом с ним — как помощника, который сжимает контекст и подкидывает идеи, оставляя решения человеку (arXiv:2308.07540). Мой движок занял место того самого человека в части правил: он арбитр, а модель — голос.
Отсюда и вся конструкция. Рассказчик отвечает за то, чтобы тебе было интересно. Движок — за то, чтобы тебе не было обидно. Смешивать эти две работы в одном месте я больше не буду )
Попробовать, как оно сейчас, можно в самом боте — AI-Мастер DnD в Telegram, а что чиню на этой неделе, пишу в «Таверне Мокрый Тортл» (@dnd5chat).
Частые вопросы
Может ли нейросеть подкрутить бросок в свою пользу?
В архитектуре с отдельным движком — нет. Модель видит результат броска, но записать своё число в состояние боя не может: движок принимает только то, что посчитал сам. Всё, что модель дописала сверх — лишний урон, внезапный враг, чужой лут, — просто не применяется.
Чем ИИ-мастер отличается от AI Dungeon и подобных текстовых генераторов?
Текстовые генераторы ведут игру целиком в тексте: когда там написано «выпало 14», за этим числом нет генератора случайных чисел. У ИИ-мастера с отдельным движком есть состояние игры и настоящие броски в коде, поэтому правила DnD 5e соблюдаются, а не имитируются.
Зачем вообще нужна нейросеть, если бой считает код?
Код не умеет рассказывать. Модель отвечает за описания, реплики NPC, реакцию мира на твои решения и всё, что правилами не описано. Движок отвечает за то, чтобы тебе не было обидно, рассказчик — за то, чтобы было интересно.
Как готовился материал: черновик собирает мой ИИ-конвейер по темам из практики таверны, факты сверяются с первоисточниками и правилами, финальную версию я читаю и правлю руками перед публикацией. Обложку тоже рисует нейросеть. Про кухню — на странице о проекте.