Как мы отучили нейросеть подыгрывать читерам в текстовой RPG, или Проклятие «Да, и…»
Каждый, кто пробовал играть в текстовые квесты с нейросетью вместо живого гейм-мастера, знает главную проблему AI: он бесхребетный.
Нейросети по своей природе — идеальные импровизаторы. В театральных вузах этому учат на правиле «Да, и…» (Yes-And): что бы ни заявил твой партнер по сцене, ты должен это принять и развить. Но в видеоиграх это ломает к чертям весь баланс.
Игрок пишет: «Я достаю из кармана дымовую шашку и кидаю в охрану» или «Вообще-то я полковник ФСБ, пропустите». Что делает классический AI? Он послушно кивает: «Охрана кашляет в дыму, вы проходите». И нейросети абсолютно плевать, что по базе данных твой персонаж — обычный бродяга в одних трусах, у которого в инвентаре из вещей только ржавый гвоздь.
Привет! Меня зовут Алексей, я разрабатываю нарративную AI-RPG "Стирая Грань" (Beyond the Verge).
Чтобы лично пощупать, как работают правильные текстовые игры будущего, заглядывайте на наш Официальный сайт проекта (посмотреть как это работает) и подписывайтесь на Telegram-канал Beyond the Verge — там мы ежедневно делимся внутрянкой разработки, мемами и апдейтами.
Ну а сегодня я расскажу, как мы построили систему, которая бьет виртуального ГМа по рукам каждый раз, когда игрок пытается нагло соврать и сломать сюжет.
Эволюция наглости: От «карманного плазмогана» до подделки документов
Поначалу мы пытались лечить это обычными инструкциями в промпте (скрытом системном тексте): «Эй, AI, не придумывай предметы за игрока, сверяйся с его инвентарем». Помогало так себе. Нейросеть слишком увлекалась красивой историей и благополучно забывала правила.
Тогда мы написали «вышибалу» на регулярных выражениях (Regex). Код просто искал в тексте игрока маркеры вроде «у меня есть Х», «достаю Y», «беру Z» и блокировал их, если вещей не было в базе.
И тут на проде начался ад. Игроки моментально нащупали уязвимости богатого русского языка:
- Один игрок написал: «предъявляю документы и прохожу в здание ФСБ». Слова «предъявляю» не было в нашем списке — чит сработал, бродягу пропустили к секретным архивам.
- Другой выдал: «Из кармана моего плаща выпадает дымовая шашка, я поднимаю её». Формально он её не «достал», она «выпала». Защита промолчала.
Дальше — хуже. Игроки смекнули, что можно материализовать не только предметы, но и социальный статус. Появились текстовые атаки из разряда: «Я знаю начальника этой тюрьмы, он мой должник» или «Я читал об этом в секретных хрониках, пароль от сейфа — 1234».
12 категорий человеческой хитрости
Мы сели, проанализировали логи и составили Таксономию AI-провалов. Разделили все попытки обмануть игру на 12 понятных категорий:
- Предметы (Possession): материализация вещей из ниоткуда.
- Личность (Identity): «я врач», «я офицер».
- Связи (Relationships): «бармен — мой троюродный брат».
- Знания (Knowledge): внезапное знание кодов и тайн.
- Полномочия (Authorization): «у меня устное разрешение короля».
- Способности: «я умею взламывать квантовые замки».
- Прошлое (Реткон): «мы же вчера об этом договорились».
- Доступ: «окно в замок уже открыто мной ранее».
- Транспорт: внезапное появление машины или вертолета.
- Связь: вызов ОМОНа по выдуманной рации.
- Манипуляция временем: «через час всё взорвется, говори код».
- Слом четвертой стены: «это просто сон, я просыпаюсь».
Как работает новая броня против читеров
Писать код под каждый глагол или падеж — безумие. Поэтому в версии Claim Guard v2 мы перешли со сравнения слов на сравнение смыслов. Теперь защита работает как жесткий трехслойный фильтр:
Шаг 1: Детектор лжи (Эмбеддинги)
Когда игрок пишет свой ход, умный математический алгоритм за пару миллисекунд оценивает общий смысл фразы. У нас есть «эталоны» для каждой категории (например, для Личности: «я работаю, служу, офицер, маг, член гильдии»). Если фраза игрока семантически близка к какому-то эталону, загорается красная лампочка: «Внимание, игрок заявляет права на Личность и Предметы!»
Шаг 2: Извлечение сути (Микро-нейросеть)
Если лампочка загорелась, мы просим отдельную, очень маленькую и быструю нейросеть вытащить конкретику. Нам нужен четкий JSON-перечень. Например, из фразы: «Я офицер ФСБ, предъявляю удостоверение», она достает:
- Категория: Личность → Сущность: Офицер ФСБ
- Категория: Предмет → Сущность: Удостоверение
Шаг 3: Проверка по базе данных (Валидатор)
А вот тут магия нейросетей заканчивается и включается суровая игровая логика. Система берет эти сущности и идет копаться в «паспорте» вашего персонажа:
- Смотрит в инвентарь: О, предмет «Удостоверение» реально есть! (Игрок нашел его три квеста назад). Статус: Подтверждено.
- Смотрит в поле бэкграунда: Так, в графе профессия написано «Бывший солдат», класс — «Воин». Никакого ФСБ. Статус: Вранье.
Двухэтапный хук: как игра наказывает за обман
Что происходит с неподтвержденным действием? Мы прессуем нейросеть-мастера с двух сторон:
1. Подсказка «в лоб» (Pre-Turn) Перед тем как запустить генерацию ответа, мы шепчем нейросети на ухо скрытую инструкцию: «Внимание! Игрок утверждает, что он офицер ФСБ. Это ложь, у него нет таких прав. Отыграй реакцию окружающих на липовый обман».
В итоге AI выдает шикарный нарратив: NPC косится на вашего персонажа, замечает дрожащие руки, понимает, что «корочки» поддельные, и вместо того, чтобы пропустить, нажимает тревожную кнопку. Обман стал частью геймплея!
2. Контрольный выстрел (Post-Turn) Нейросети иногда бывают слишком «творческими» и могут проигнорировать подсказку, написав в тексте: «Ну ладно, верю, держи ключ от архива». На этот случай у нас стоит триггер на бэкенде. Если AI пытается программно выдать игроку вещь, которая находится в списке «неподтвержденных клеймов», бэкенд просто стирает эту строчку. В тексте ключ может упомянуться, но в реальный инвентарь игрока он не попадет. Чит заблокирован.
Итог
Пытаться контролировать ИИ-мастера одними лишь уговорами в промптах — это проигранная война. Игроки всегда найдут лазейку. Единственный способ сделать крутую AI-RPG с честными правилами — это выносить проверку логики за пределы самой нейросети.
Теперь наш мир защищен от внезапных плазмоганов и фейковых генеральских званий, а игра сохраняет баланс, не теряя в гибкости.
А как вы пытались «сломать» нейросети в играх? Рассказывайте в комментариях свои истории!