ДнД с ИИ: как валидатор ответов начал глушить обычные ходы - и что оказалось ложным срабатыванием

В ИИ-мастере DnD 82 из 84 заглушек "Ты сосредотачиваешься" за месяц были ложным срабатыванием валидатора, а не сбоем модели: нарратор дважды честно отвечал, но проверка путала честное эхо действия игрока с выдуманным предметом. Фикс - эхо-гейт для взятия вещей и переписанные ретрай-хинты.
Ход выглядел так: игрок пишет “забираю узелок с покупками”, а вместо ответа мастера видит “Ты сосредотачиваешься. Мир вокруг живёт своей жизнью”. Не сбой сети, не таймаут - просто нарратор соврал сам себе, а собственный валидатор решил, что так безопаснее, чем показать нормальный текст. За месяц это случилось 84 раза, и я разбирал каждый случай, пока не нашёл, что 82 из них - ложная тревога.
Зачем ИИ-мастеру DnD вообще нужен валидатор ответов
Валидатор - это код, который проверяет прозу нарратора против того, что реально изменилось в игре: пришли ли деньги, появился ли предмет, сменилась ли сцена. Если проза говорит одно, а состояние - другое, ход не проходит и запрашивается пересказ. Без такой проверки ИИ-мастер время от времени выдумывает награды или деньги, которых не было.
Причина, по которой этот контроль вообще стоит именно жёстким: за неделю 27 июля - 2 августа я закрыл эпик из 87 багфиксов, где нарратор рожал деньги из воздуха - двойные начисления, ложные квестовые награды, списания без названной суммы. После такой волны руки сами тянутся закрутить гайки посильнее - и я их закрутил. Логика на первый взгляд честная: чем жёстче проверка, тем меньше шанс, что игрок увидит в летописи деньги, которых на самом деле не было. Про то, как ловил похожие фокусы с деньгами раньше, рассказывал в статье про торговлю без обмана.
Почему бот вместо ответа стал писать “Ты сосредотачиваешься”
Прямой ответ: в 82 из 84 случаев нейросеть дважды честно сгенерировала нормальную прозу, а завернул её собственный валидатор - реальных сбоев модели за тот же период было всего два (инцидент у одного из провайдеров 31 июля и таймаут 2 августа), и с ними справлялся отдельный механизм подмены.
Разбивку по типам ходов удалось восстановить только косвенно, по самим фразам-заглушкам: проверки навыков - 41 случай, что-то неопознанное - 16, движение - 10, чистая нарративка - 9, отдых - 4, заклинания - 3, атака - 1. Точно сказать, какая именно проверка завернула каждый из 82 ходов, я уже не могу - причина сбоя жила только в логах хостинга, и то в коротком окне до ротации, а в саму игру она не сохранялась. Пришлось разбираться на том, что осталось: единственный класс, который удалось поймать железно, по сырому логу конкретного хода - проверка на “появление предмета”. Разбор такого хода 2 августа и стал зацепкой на всю историю.
Как нашли причину: узелок, который игрок и так купил
Что было: игрок пишет “забираю узелок с покупками” - вещь, которую он сам купил парой ходов раньше. Нарратор честно отвечает “забираешь узелок…”. Проверка видит глагол получения предмета, а в изменениях состояния пусто (предмет и так уже был у игрока, инвентарь не менялся) - и рубит ход как галлюцинацию.
Что стало понятно дальше: система запрашивает пересказ с хинтом “не описывай получение предметов” - а игрок только что сам заявил это действие. Хинт невыполним в принципе, вторая попытка падает на том же регулярном выражении, и игрок получает заглушку вместо связного текста. Две дыры сошлись в одной цепочке: ложный триггер (проверка ловит глагол, а не факт нового предмета) и невыполнимый ретрай (хинт запрещает результат, не объясняя, как переписать).
Как починили: эхо-гейт и переписанные ретрай-хинты
Прямой ответ: фикс из двух частей - ретрай-хинты переписали с запрета результата на инструкцию по перефразированию, а для проверки предметов добавили эхо-гейт: если взятие заявил сам игрок, эта проверка на ход не срабатывает.
Гейт матчит не сам факт предмета, а глаголы владения по основам - “беру”, “забираю”, “подбираю”, “поднимаю”, “хватаю” - во всех формах и лицах. И тут была отдельная ловушка: основа “бер” без окончаний ловила бы “на берегу реки” как взятие предмета, так что регулярку пришлось калибровать под живые контрпримеры. Сознательно в список НЕ попали глаголы поиска - “нахожу”, “обыскиваю”, “собираю”: если игрок обыскивает труп, а нарратор пишет “находишь кинжал” при пустом списке добавленных предметов - это и есть настоящая галлюцинация, которую валидатор обязан ловить, а не пропускать. Правило на кухне простое: валидатор не имеет права спорить с тем, что игрок сам сказал о своих вещах, но обязан спорить с тем, что придумал нарратор от себя. Похожая тема - как игроки формулировками ломают нейросеть DnD, там разбирал обратный случай, когда слова игрока сознательно давят на движок.
Какие проверки остались строгими и почему
Ослабили только канал предметов. Деньги и смена сцены остаются под жёсткой проверкой всегда - там цена ошибки выше: золото из воздуха и телепорт без ведома движка бьют по игре сильнее, чем неточное описание вещи. Отдых тоже не тронули отдельным эхо-гейтом, хотя заглушек на нём было всего 4 из 84 - если движок легитимно не восстановил здоровье (например, отдых прервали боем), проза “восстанавливаешь силы” замаскировала бы именно этот рассинхрон, а не спасла бы от заглушки.
Честно говоря, у решения есть цена: раз эхо-гейт снимает проверку предметов для всей прозы хода, нарратор теоретически может между делом упомянуть в тексте и вымышленный предмет - “берёшь меч, а в сундуке видишь кольцо”. Состояние игры это не портит: инвентарь по-прежнему защищён отдельной проверкой и не даёт лишнему добру попасть на баланс, страдать может только текст. Реже и мягче, чем прежняя заглушка на ровном месте, но не ноль - доверять кубикам и памяти ИИ-мастера на слово всё равно не стоит, я писал об этом отдельно, разбирая кто в DnD с ИИ на самом деле бросает кубики.
Как проверяли фикс перед тем, как выпускать на игроков
Процесс был длиннее самого фикса: спека → адверсариальное ревью, которое закрыло три серьёзных замечания ещё до кода → план → отдельный ревьюер прогнал регулярку на 9 позитивных и 8 отрицательных кейсах вручную, прежде чем что-либо трогать в проде. Среди отрицательных кейсов, кстати, была та самая “на берегу реки” - контрольный пример специально держали в тестах, чтобы калибровка основы “бер” не развалилась при следующей правке. Дальше - исполнение по готовому плану, весь тестовый набор бота зелёный (6460 тестов), и уже на проде живой смок 2 августа: тот самый ход с узелком выдал связную прозу с первой попытки, без единой заглушки и без лишнего вызова модели на пересказ.
Похожий путь - спека, ревью, тесты, живой смок - я проходил и на фиксе состояний персонажа, когда чинил, почему ИИ-мастер не держал паралич: тоже сначала находка на живых логах, потом ловушка в регулярке, потом честная сверка на проде.
Что дальше и куда смотреть
Цель после этого фикса - меньше 0,3% ходов-заглушек за неделю против 0,6-1% раньше; замеряю отдельным SQL-запросом по содержимому ответов, и завёл отдельную задачу на пост-деплой замер через неделю. Число подстроено под конкретную формулировку заглушек, так что часть редких не-валидаторных сбоев туда тоже попадёт - но с тем же инструментом, что и раньше, тренд читается честно.
Осталась и часть, которую я сознательно не трогал: вариант с сохранением первой (уже удавшейся) попытки при двойном провале валидатора - решение отложено до того, как станет ясно, сколько заглушек всё-таки останется после фикса A+B. Туда же - нормальная наблюдаемость: сейчас причина провала не пишется никуда, кроме логов хостинга, и в следующий раз копать придётся так же на ощупь, если не заведу отдельную задачу на персистентную запись причины.
Продукт всё ещё активная стройка, и заглушки - не последняя грабля на этом пути, но конкретно эта дыра больше не должна портить обычные ходы. Если играете в бота в Телеграме и сталкивались с “Ты сосредотачиваешься” на ровном месте - это как раз тот случай, который я разбирал. Пишите в канал “Таверна Мокрый Тортл”, если заглушка всё-таки вылезла снова - на живых репортах я это и ловлю быстрее всего.
Частые вопросы
Что делать, если ИИ-мастер DnD выдал заглушку вместо ответа?
Заглушка вида "Ты сосредотачиваешься" - добровольный отказ валидатора показать спорную прозу, а не сбой сети. Если она вылезла на обычном ходу без взятия предметов, денег или смены сцены, быстрее всего переформулировать ход и написать об этом в канал "Таверна Мокрый Тортл" - так разбор идёт быстрее.
Может ли ИИ-мастер DnD начислить деньги или предмет, которых не было?
Проверки золота и появления предметов остаются строгими всегда - это защитный слой, родившийся из эпика в 87 багфиксов о деньгах из воздуха. Ослаблена только проверка взятия вещей, которые игрок сам заявил в своём ходу.
Почему валидатор ответов иногда ошибается сильнее, чем сама нейросеть?
Валидатор - отдельный код с жёсткими правилами поверх прозы модели: он не понимает контекст целиком и ловит по ключевым словам. Слишком строгое правило иногда режет честный текст точнее, чем нейросеть успевает его выдумать.
Как готовился материал: черновик собирает мой ИИ-конвейер по темам из практики таверны, факты сверяются с первоисточниками и правилами, финальную версию я читаю и правлю руками перед публикацией. Обложку тоже рисует нейросеть. Про кухню — на странице о проекте.