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

ДнД с ИИ: почему цена квеста уходила из слов игрока, а подстраховка чуть не увела деньги героя

· Владислав Новиков · Раздел: D&D с ИИ-мастером: нейросети за столом

ДнД с ИИ: почему цена квеста уходила из слов игрока, а подстраховка чуть не увела деньги героя

Цена квеста иногда бралась из слов самого игрока ("за десять золотых"), а не из ответа NPC, потому что модуль-директор записывал награду раньше, чем нарратор озвучивал итоговую сумму торга. Правило промпта для директора закрыло проблему; дополнительная эвристика по тексту хода её не решила и сама уводила деньги игрока, поэтому её убрали.

Хочешь попробовать это в игре прямо сейчас? Соло-ДнД с ИИ-мастером в Telegram · базовая игра бесплатная.

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

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

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

Почему ИИ-мастер DnD путает цену квеста с торгом игрока?

Цена квеста уходила в базу раньше, чем нарратор успевал описать, чем кончился разговор. “Директор” - модуль, который фиксирует структуру квеста, - отрабатывает до нарратора и видит только реплику игрока. Сказал “за десять золотых” - в reward_gp легло 10, даже если наниматель тут же поднял цену до двадцати. На проде за две недели так разошлись 7 из 26 квестов с прописанной ценой - почти каждый четвёртый.

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

Что было → что стало: два фикса вместо одного

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

Что было: цена квеста бралась из чего попало - из первой реплики, из случайного числа в сцене. Что должно было стать: два независимых фильтра ловят проблему с двух разных сторон, для надёжности. Логика понятная и даже правильная на бумаге - два способа поймать один и тот же баг звучат надёжнее одного. На практике вторым способом оказалась подстраховка, которая сама умеет ошибаться, и это выяснилось только на живых ходах, а не на бумаге.

Почему “умная” эвристика увела деньги игрока?

Подстраховка по прозе не отличала аванс от полной цены и деньги одного NPC от денег другого - поэтому на живых ходах она не подстраховывала, а сама два раза подряд записала не ту сумму не в тот квест. За 15 живых ходов у неё 0 истинных срабатываний и 2 ложных, и оба - не в пользу игрока.

Первый случай: игрок получил аванс в 30 золотых, эвристика приняла его за полную цену и записала в reward_gp только 10. Второй: в той же сцене прозвучала сумма другого NPC - она уехала в чужой квест. Такие же ложные тревоги я уже разбирал в истории про валидатор, который начал глушить обычные ходы - механика подстраховки одна и та же: чем проще правило снаружи, тем легче ему спутать похожие, но разные ситуации.

При этом правило промпта - простое, без всякой эвристики по тексту - само закрыло исходный симптом полностью: числа игрока (10, 50, 40, 20 золотых) вообще ни разу не попали в reward_gp. Подстраховку сняли рефиксом в тот же день, правило осталось единственным фильтром. Тут работает то же правило, что и с деньгами вообще в этом боте: подсказка из прозы - это подсказка, а не факт, и решать по ней деньги нельзя.

Почему офлайн-проверка не поймала проблему заранее?

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

Это тот же урок, что я уже разбирал на выборке из 66 слепков живых ходов: корпус для проверки денежного правила обязан включать сами ходы с деньгами, а не только соседние с ними. Иначе зелёный прогон врёт не потому, что фикс плохой, а потому, что тест смотрел не туда.

Что это значит для игроков и куда дальше с деньгами в ДнД-боте

Правило промпта для директора уже в проде - цену квеста в reward_gp можно доверять, торг игрока в неё не подмешивается. Отдельно от этого бага с 7 сентября в игре уже работает единая касса и LLM-арбитр по деньгам: она проверяет каждую сделку по прозе хода и не даёт награде вырасти выше обещанной. Перед включением её прогнали на 5300 реальных ходах за две недели, и ни разу она не стала мягче старой схемы.

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

В той же QA-волне всплыли соседние находки: покупка при пустом кошельке раньше проходила бесплатно и предмет всё равно ложился в инвентарь (теперь касса отказывает и удерживает товар); “устраиваюсь на короткий отдых” распознавался как долгий отдых, потому что в словаре были стемы только для долгого; а один из LLM-проверяльщиков ложно видел отказ передать предмет в 2-3 случаях из 6 на самой простой фразе - модель для этой проверки заменили. Денежную часть после волны решили не чинить точечно дальше: пять из девяти находок оказались про деньги, и сейчас это уже вопрос - тянуть ли на цену квеста тот же денежный гейт, что держит кассу, вместо новых локальных подстраховок.

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

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

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

Почему в DnD-боте цена квеста иногда не совпадает с тем, что сказал NPC? Модуль, который записывает структуру квеста, раньше отрабатывал до нарратора и видел только реплику игрока - если наниматель поднимал цену в ответ, повышение не попадало в награду. Сейчас это закрыто правилом, которое прямо запрещает записывать торг игрока как итоговую цену.

Можно ли доверять эвристике вида “одна сумма в тексте хода - это и есть цена”? Нет: на живых ходах она путает аванс с полной ценой и деньги одного NPC с деньгами другого. В тесте на 15 ходах она дала 2 ложных срабатывания и 0 верных - и оба ложных увели деньги игрока, а не защитили их.

Что делать, если ИИ-мастер выдал неверную награду за квест? Прислать скрин или описание хода в канал бота - именно так находят большинство денежных багов последних месяцев, и этот не исключение.

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

Почему в DnD-боте цена квеста иногда не совпадает с тем, что сказал NPC?

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

Можно ли доверять эвристике вида "одна сумма в тексте хода - это и есть цена"?

Нет: на живых ходах она путает аванс с полной ценой и деньги одного NPC с деньгами другого. В тесте на 15 ходах она дала 2 ложных срабатывания и 0 верных - и оба ложных увели деньги игрока, а не защитили их.

Что делать, если ИИ-мастер выдал неверную награду за квест?

Прислать скрин или описание хода в канал бота - именно так находят большинство денежных багов последних месяцев, и этот не исключение.

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