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

Цена квеста иногда бралась из слов самого игрока ("за десять золотых"), а не из ответа NPC, потому что модуль-директор записывал награду раньше, чем нарратор озвучивал итоговую сумму торга. Правило промпта для директора закрыло проблему; дополнительная эвристика по тексту хода её не решила и сама уводила деньги игрока, поэтому её убрали.
Хочешь попробовать это в игре прямо сейчас? Соло-ДнД с ИИ-мастером в Telegram · базовая игра бесплатная.
Ребят, представьте сценку. Игрок пишет наёмнику: “сделаю за десять золотых”. Наниматель отвечает: “по рукам, но давай двадцать - дело опасное”. Игрок соглашается - а в карточке квеста ложится награда 10 золотых. Не потому что бот жадный, а потому что одна часть системы прочитала только первую реплику и не дождалась, чем кончился торг.
Это реальный баг из последней волны фиксов ИИ-мастера DnD. И история вышла ровно про то, что я люблю разбирать на этом блоге: подстраховка, добавленная “на всякий случай”, сама чуть не увела деньги героя - а спасло только жёсткое правило без всякой хитрости.
Деньги - это ровно то место в игре, где доверие к нейросети либо есть, либо нет. Проиграть бой можно из-за неудачного броска, это часть игры. А вот если карточка квеста тихо занижает обещанную награду - это уже не игра, а баг, который бьёт по кошельку персонажа без объяснений. Поэтому такие находки я разбираю подробно, а не прячу в патчноуте одной строкой.
Почему ИИ-мастер DnD путает цену квеста с торгом игрока?
Цена квеста уходила в базу раньше, чем нарратор успевал описать, чем кончился разговор. “Директор” - модуль, который фиксирует структуру квеста, - отрабатывает до нарратора и видит только реплику игрока. Сказал “за десять золотых” - в reward_gp легло 10, даже если наниматель тут же поднял цену до двадцати. На проде за две недели так разошлись 7 из 26 квестов с прописанной ценой - почти каждый четвёртый.
Нашли не по жалобе игрока, а во время планового QA-прогона хвостов рефактора движка: диагносты гоняли офлайн-репрей прод-квестов и заметили расхождение цены с прозой раньше, чем кто-то вообще написал про неправильную награду. Приятно, когда баг ловишь ты, а не игрок на живые деньги.
Что было → что стало: два фикса вместо одного
Обычно чинишь баг один раз одним способом. Тут сделали два фикса параллельно на одну и ту же проблему - и это была ошибка номер один, хоть и не сразу заметная.
- Правило промпта. Директору прямо прописали в инструкции: торг игрока в награду не попадает, цена квеста фиксируется только по факту согласия NPC, а не по первому названному числу.
- Подстраховка по прозе. Если в тексте хода встречается ровно одна золотая сумма - считать её ценой квеста. Звучит логично: нарратор же почти всегда проговаривает итоговую цифру вслух.
Что было: цена квеста бралась из чего попало - из первой реплики, из случайного числа в сцене. Что должно было стать: два независимых фильтра ловят проблему с двух разных сторон, для надёжности. Логика понятная и даже правильная на бумаге - два способа поймать один и тот же баг звучат надёжнее одного. На практике вторым способом оказалась подстраховка, которая сама умеет ошибаться, и это выяснилось только на живых ходах, а не на бумаге.
Почему “умная” эвристика увела деньги игрока?
Подстраховка по прозе не отличала аванс от полной цены и деньги одного 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 верных - и оба ложных увели деньги игрока, а не защитили их.
Что делать, если ИИ-мастер выдал неверную награду за квест?
Прислать скрин или описание хода в канал бота - именно так находят большинство денежных багов последних месяцев, и этот не исключение.
Как готовился материал: черновик собирает мой ИИ-конвейер по темам из практики таверны, факты сверяются с первоисточниками и правилами, финальную версию я читаю и правлю руками перед публикацией. Обложку тоже рисует нейросеть. Про кухню — на странице о проекте.