Любая текстовая RPG на базе LLM сталкивается с одной фундаментальной проблемой: модель обучена быть полезной. В импровизационном театре это называют «Да, и…» — принимай предложение партнёра и развивай его. В RPG это превращается в читерство: «У меня был ключ от сейфа всё это время» — и нейросеть с радостью согласится.
Без серверной валидации игрок может переписать реальность одним сообщением. Модель не знает, что было в инвентаре на ходу 3. Она видит только текст и стремится продолжить историю. Именно поэтому свободный текст LLM никогда не должен напрямую менять состояние кампании — это базовый инвариант «Стирая Грань».
За месяцы тестов мы собрали типовые паттерны обхода правил:
Семантический анализ эмбеддингов сравнивает утверждение игрока с известным состоянием мира: инвентарь, отношения, хроники, локация. Если cosine similarity указывает на противоречие — ход помечается для углублённой проверки.
Микро-LLM переводит свободный текст в structured JSON: что игрок утверждает, что просит, какие предметы задействованы. Свободный текст больше не попадает в движок.
Бэкенд — единственный источник истины. Каждый claim проверяется по БД: есть ли предмет, знаком ли NPC, допустима ли проверка. LLM может предложить нарратив, но не может записать невалидное изменение.
Pre-Turn: если детектор нашёл подозрительный claim, ГМ получает явную подсказку «в лоб» — отвергнуть или потребовать проверку до генерации основного ответа.
Post-Turn: контрольный выстрел — если модель всё же «подыграла» и добавила невалидный предмет в JSON, Post-Turn стирает его до сохранения snapshot. Игрок видит последствия честной игры, а не фантазии модели.
Итог: нейросеть остаётся творческим рассказчиком, но не судьёй. Судья — движок на сервере.