Мокрый Тортл Мокрый Тортл Wet Tortle Таверна для героев A tavern for heroes
ТавернаTavern ГеймплейGameplay Как игратьHow to play ПутьJourney ВопросыFAQ Блог Роадмап Играть в TelegramPlay on Telegram

Игрок перевязывает раны, а бот катит Обман: где в ДнД с ИИ нельзя доверять выбор навыка

· Владислав Новиков

Игрок перевязывает раны, а бот катит Обман: где в ДнД с ИИ нельзя доверять выбор навыка

ИИ-мастер катит не тот навык, когда словарь быстрых правил не узнал формулировку игрока и выбор проверки уходит нейросети: она решает по смыслу фразы, а не по правилам 5e. Так "перевязать раны" превратилось в проверку Обмана вместо Медицины. Лечится это не промптом, а морфологией в словаре триггеров: механику решают правила, нейросеть отвечает только за текст.

Ребят, вот жалоба из чата, от которой у меня дёрнулся глаз. Игрок выбирает “Попробовать перевязать раны вручную”, а бот бодро катит Обман: 12 на кубике плюс 6 бонуса, итого 18 против сложности 12. Успех! Только успех в чём? Персонаж убедительно наврал собственным бинтам?

Баг из самых обидных. Кубик честный, математика честная, движок честный - неверен ровно один шаг, выбор навыка. И принимала этот шаг нейросеть. Разбираю, почему так вышло в днд с ии, как я это чинил и что делать, если бот покатил не ту проверку.

Почему ИИ-мастер катит не тот навык?

ИИ-мастер катит не тот навык, когда словарь быстрых правил не узнал формулировку игрока и решение уходит нейросети. Нейросеть выбирает проверку по смыслу текста, а не по правилам 5e, и на короткой фразе легко промахивается. “Перевязать раны” она прочитала как попытку что-то изобразить - и выдала Обман вместо Медицины.

По правилам выбор навыка вообще не должен быть творческой задачей. В “Подземельях и драконах” это работа Мастера: “Мастер решает, какой навык уместен в конкретной ситуации”, и “в итоге Сл устанавливает Мастер” (справочник по механикам 5e, dnd.su). Медицина - навык Мудрости, по SRD стабилизация умирающего идёт через проверку Мудрости (Медицина) со Сл 10. Обман - Харизма и совсем другая история: игрок кого-то вводит в заблуждение. Между ними в правилах нет ни одного мостика. Мостик появился у нас в коде.

Как ИИ-мастер выбирает навык: словарь триггеров и нейросеть

Разбор действия у нас идёт ступенями. Сначала из фразы вытаскиваются токены (заклинания в скобках, оружие, отыгрышные звёздочки). Потом ступень 1a - словарь триггеров, обычный yaml-файл с ключевыми словами: “атакую”, “прячусь”, “каст”. Если словарь узнал фразу, тип действия определён без всякой магии, детерминированно и мгновенно. И только если словарь промолчал или уверенность ниже порога, включается ступень 1b - разбор нейросетью.

Метафора простая: на входе сидит вахтёр со списком знакомых фраз, а кого он не узнал в лицо, отправляет к переводчику. Переводчик умный, но правил игры он не читал и премии за точность не получает.

Нейросеть у нас - последний рубеж, а не первый. Это осознанное решение: детерминированная ступень дешевле, быстрее и, главное, повторяема. Одна и та же фраза всегда даст одну и ту же проверку.

Есть и третий путь, самый честный. Если действие спорное, бот показывает окно выбора: сам спрашивает, какой навык ты имел в виду. Когда игрок ткнул в вариант, разбор фразы вообще пропускается - выбранный навык уезжает в движок как есть и не переигрывается на следующем запросе. То есть механика “спросить, а не угадывать” в боте была и на момент бага. Беда в том, что окно показывается на спорных случаях, а “перевязать раны” спорным никому не казалось - ни словарю, ни модели, ни мне.

Что сломалось: “перевязываю” в словаре был, а “перевязать” - нет

Причина оказалась двухслойной, и оба слоя по отдельности выглядят безобидно.

Первый слой: словарь знал только форму “перевязываю”. Матчинг у триггеров идёт по началу слова, а инфинитив “перевязать” под этот префикс не попадает. Русская морфология тут не щадит никого: перевязать, перевяжу, перевязываю, перевяжи, перевязку - для человека одно слово, для префиксного матчинга пять разных. Самое смешное, что подсказка в интерфейсе была написана как раз в инфинитиве. Мы предлагали игроку нажать ровно ту форму, которой не знал наш собственный словарь)

Второй слой: раз словарь промолчал, интент ушёл нейросети. А она, глядя на короткую фразу без контекста, выбрала Обман. Дальше всё сработало идеально - и в этом главная подлость. Проверка честно посчиталась, бросок честно прошёл, игрок получил успех не в том навыке.

Что стало: в триггер Медицины уехали стемы “перевязыва”, “перевяза”, “перевяж” плюс пять тестов на словоформы, чтобы следующая правка не выкинула половину. Коммит трогает ровно два файла - словарь и тесты. Урок записал в лоб: словарь триггеров обязан покрывать морфологию, а не одну удобную форму. Кстати, про то, как игроки ломают нейросеть одними формулировками, у меня есть отдельный разбор - там та же болезнь с другой стороны.

Второй баг той же недели: маг выучил заклинания, но не мог их скастовать

По жалобам той же недели вылез близнец. Арканический ловкач третьего уровня - это плут, который подмешивает себе магию волшебника. Заклинания он выучил, они лежат в книге, кнопка есть. Каст - отказ. Всё выше заговоров движок резал.

Причина: прокси персонажа, который уходит в проверку перед движком, не содержал поле подкласса. Вычислитель максимального круга заклинаний смотрел в это поле, видел пустую строку и честно делал вывод, что кастовать нечего. Охранник у двери в библиотеку смотрит в пропуск, а графа “специализация” пустая - разворачивает.

После фикса живой ретест на проде: ловкач третьего уровня кастует первый круг (усыпление проходит, очки заклинаний уходят с 4 на 2, ошибок нет), а контрольный вор по-прежнему получает отказ - значит, дыру не прорубили лишнюю. Тестовый сьют после обоих фиксов зелёный целиком, 4885 тестов.

Два бага одной недели, а форма одна: пропущенное поле в прокси и непокрытая словоформа в словаре. Каждый ломал игроку целую механику (лечение и магию), а чинился одной строкой плюс тестами. Такие дела.

Обидно тут не то, что баги случились, а то, как они выглядят изнутри игры. Ты не видишь ни пустого поля, ни промаха классификатора. Ты видишь мастера, который зачем-то заставил тебя врать бинтам и запретил магу колдовать. То есть цена пропущенной строки в коде - не “минус балл в тестах”, а испорченный вечер за столом.

Где нейросети для днд можно доверять, а где нельзя

Граница у меня давно проведена и после этой недели стала только жёстче: нейросеть отвечает за язык, движок - за числа и правила.

Про кубики я это уже расписывал подробно - бросок нельзя доверять нейросети, потому что модель “бросает” удобное для сюжета число. Выбор проверки лежит на той же полке. Модель не хочет тебя обмануть, у неё просто нет обязанности быть правой, а у таблицы правил есть.

Забавно, что исследования интентов формально на стороне нейросети. В сравнении на диалоговых сценариях LLM опознала все 14 намерений, правила - 12, согласие с эталоном 1.00 против 0.85 (arXiv, 2025). Но в игре важна не средняя точность, а стоимость промаха: словарь ошибается предсказуемо (не знает слово - молчит), а модель ошибается уверенно и катит Обман против Сл 12. Плюс правило легко чинится строкой, а модель - переучиванием промпта и надеждой.

Отсюда схема, к которой я двигаю бота: правила решают всё, что вообще можно решить правилами; нейросеть подхватывает остаток; а спорное должно уходить в уточняющее окно, а не в самостоятельную догадку модели.

Что делать, если бот покатил не ту проверку

Пока словарь дырявый (а он дырявый, это активная стройка), у игрока есть рычаги.

Назови навык прямо: “Проверка Медицины: перевязываю раны”. Такая фраза цепляется словарём и до нейросети не доходит. Если бот показал окно с выбором навыка - выбирай в нём, выбор фиксируется и второй раз уже не переигрывается. Пиши действие глаголом и конкретно: “осматриваю рану” и “разбираюсь с раной” для парсера две разные вселенные. И самое полезное - жалуйся со скрином в чат. Обе истории выше приехали ко мне именно так, а не из тестов.

Мастеру за живым столом это тоже знакомо, кстати. Услышал “я пытаюсь его переубедить” и покатил Обман вместо Убеждения - разница та же, только вахтёр сидит у тебя в голове. Про то, когда проверка вообще нужна, а когда хватает отыгрыша, тоже был разбор.

Что дальше

Расширяю словарь морфологией там, где действия популярные: лечение, поиск, скрытность, взаимодействие с предметами. Параллельно докручиваю пороги, чтобы спорные фразы уходили в уточняющее окно, а не в самостоятельное решение модели.

Формулировка, которую я теперь держу перед глазами: нейросеть не выбирает, что ты бросаешь, - она рассказывает, что из этого вышло.

Если хочешь пощупать, где стройка уже устоялась, а где ещё пахнет краской, - вот с чего начать игру с ИИ-Мастером в Telegram. Найдёшь такую же дичь с проверкой - тащи скрин, чиню быстро.

Частые вопросы

Какой навык нужен, чтобы перевязать раны в ДнД 5е?

Медицина - навык Мудрости, именно он отвечает за первую помощь. По SRD стабилизация умирающего союзника делается действием и требует проверки Мудрости (Медицина) со Сл 10. Хиты Медицина сама по себе не восстанавливает: за это отвечают отдых, лечебная магия и классовые умения.

Можно ли заставить ИИ-мастера бросить нужную проверку?

Да, самый надёжный способ - назвать навык прямо в сообщении: "Проверка Медицины: перевязываю раны". Такая фраза цепляется словарём триггеров и до нейросети не доходит. Если бот показал окно выбора навыка, выбор в нём фиксируется и на следующем ходу не переигрывается.

Почему ИИ-мастер иногда запрещает кастовать уже выученное заклинание?

Обычно это баг проверки перед движком, а не правило игры. У нас арканический ловкач 3 уровня не мог кастовать первый круг, потому что в служебную копию персонажа не попало поле подкласса: вычислитель максимального круга видел пустую строку и резал всё выше заговоров.

Как готовился материал: черновик собирает мой ИИ-конвейер по темам из практики таверны, факты сверяются с первоисточниками и правилами, финальную версию я читаю и правлю руками перед публикацией. Обложку тоже рисует нейросеть. Про кухню — на странице о проекте.