Первая же сессия показала, что LLM — плохой DM
Я сел за стол (виртуальный), открыл ноутбук, запустил своего первого AI-мастера. Через 20 минут партия 3-го уровня была пережёвана бандой крыс. Нет, не по правилам — модель просто решила, что у крыс есть multiattack с автохитом. И это только начало. К концу часа ГМ забыл, что в комнате уже лежит труп главного злодея, а NPC стал предлагать награду за его убийство. Типичный провал: LLM не держит контекст длинных диалогов и плодит галлюцинации баланса.
Наивный подход — скормить модели полный лог чата + правила D&D — разбился о границу контекстного окна. После 10 000 токенов модель начинает «забывать» начало, а после 20 000 — впадает в бред. Переносимся в июнь 2026: даже самые передовые модели (GPT-4o, Gemini 2.5 Pro, Qwen 3) не спасают, если не выстроить правильную архитектуру памяти и баланса.
В этой статье я расскажу, как мы построили AI-мастера, который провёл 10 полноценных тестовых сессий без единого TPK по вине модели. Без воды — только схемы, цифры и грабли, на которые я наступил.
Архитектура, которая не даст кампании развалиться
Мой AI-мастер — это не монолитная LLM. Это три слоя: Narrator (генерация текста), Referee (валидация правил) и Memory Manager (рабочая + долговременная память). Каждый слой — отдельный микросервис, общающийся через JSON.
Ключевая идея: не заставляйте модель помнить всё. Дайте ей только то, что нужно для текущей сцены. Остальное — саммари в векторной базе.
За основу мы взяли концепцию structured output, подробно разобранную в статье про архитектуру AI RPG с авторитарным бэкендом. Для каждого ответа модели мы задаём жёсткую JSON-схему: описание сцены, действия NPC, броски кубов (переменные, которые потом заполняет бэкенд). Модель никогда не пишет «вы нанесли 15 урона» — она пишет «{damage: dice(2d6+3)}», а сервер уже считает реальное значение. Это убивает галлюцинации цифр.
1 Выбор LLM: локально или облака?
Для тестов я гонял три варианта: GPT-4o (дорого, но умно), Qwen 3 35B через LM Studio (локально, 20 токенов/с на RTX 4090) и свежую Gemini 2.5 Pro (лучший баланс цена/качество). Лучше всего себя показала Qwen — за счёт низкой латентности и возможности донастроить на датасете D&D. Подробнее о локальном запуске — в гайде по связке LM Studio и Qwen. Если бюджет позволяет — GPT-4o с fine-tuning на датасете из 22k задач как в Meta RPG.
2 State memory: не дай LLM забыть, кто ты
Рабочая память хранится как JSON-объект текущей сцены: локация, активные NPC, статы партии, инициатива. Модель получает только этот объект + последние 5 действий игроков. Как только сцена меняется — генерируется саммари с ключевыми событиями и сохраняется в ChromaDB с тегами (локация, участвующие персонажи). При возвращении в ту же локации — подгружаем саммари в промпт. Это решение подсмотрено в эпизодической памяти Amazon Bedrock AgentCore.
Мы не храним весь лог — только сжатые факты: «Гоблин Гнук мёртв», «Дверь заперта магией», «NPC обещал 100 золотых за доставку письма». Размер саммари — не более 500 токенов. За 10 сессий средний контекст не превысил 12 000 токенов, хотя логически кампания охватывала десятки сцен.
3 Баланс: пусть модель пишет красиво, а механика считает сухо
Самая частая ошибка — доверять генерацию монстров LLM. Модель либо сделает их имбами (400 HP гоблин), либо тряпками. Решение: Oracle — Python-модуль, который по запросу модели генерирует легального монстра из Monster Manual с адаптацией под уровень партии. Модель только выбирает название и стиль, Oracle достаёт статы, корректирует CR по формуле: CR_adjusted = base_CR + party_level — 3. Проверка бросков происходит на стороне Referee: он использует тот же d20 с модификаторами, что и в настольной игре.
Никогда не передавайте в системный промпт правила D&D целиком — модель начнёт интерпретировать их творчески. Пусть правила живу в коде, а LLM лишь описывает результат.
Для баланса мы добавили систему напряжения: Referee отслеживает текущие HP партии, количество использованных ресурсов (заклинания, особенности). Если партия близка к смерти — AI получает сигнал снизить сложность (убрать одного врага, дать укрытие). Если всё слишком легко — добавить триггер для окружения (обвал, подкрепление). Алгоритм описан в статье про современного AI-агента с planner/executor.
Как НЕ надо делать (мои грабли)
- Не кладите весь лог в контекст. После 10 000 токенов модель теряет начало. Я потерял так две кампании — персонажи забывали свои квесты.
- Не давайте LLM самой генерировать числовые значения. Крыса с 45 ХП? Легко. Атака с бонусом +15? Пожалуйста. Всё, что можно посчитать — считайте на бэкенде.
- Не игнорируйте roleplay. Без хорошего системного промпта модель скатывается в сухие «ты ударил — он ударил». Используйте метод рандомизации системных промптов, чтобы NPC имели характер.
- Не давайте модели доступ к «всезнанию». Она должна описывать только то, что видят и знают персонажи. Иначе пропадает интрига. Мы реализовали это через маску «perception
Ошибки памяти: когда модель не помнит, что вы убили короля
Даже с гибридной памятью бывают проколы. Один раз модель «воскресила» того самого короля, потому что саммари не сохранило факт убийства. Пришлось ввести флаг confirmed_dead для каждого уникального NPC. Теперь при генерации саммари Memory Manager проверяет, были ли действия, приводящие к смерти (атака с уроном >0, спасбросок, описание). Если да — в саммари добавляется строка «X dead».
Помогла техника Agent Skills — мы задали модели строгие инструкции, которые не должны забываться ни при каких обстоятельствах. Например: «Ты не можешь создавать предметы из воздуха». Как это работает — в отдельном разборе Agent Skills.
Цифры меня не обманут
| Метрика | Наивный подход | Гибридная архитектура |
|---|---|---|
| Средний размер контекста (токенов) | 80 000 | 12 000 |
| Инциденты разрыва логики за сессию | 8 | 1 |
| TPK (полное уничтожение партии) по вине AI | 3 из 10 | 0 из 10 |
Каждая тестовая сессия длилась ~3 часа. Игроки — четверо друзей, которые не знают, где сидит LLM, а где живой DM. Разницу они заметили только в двух вещах: AI чуть медленнее придумывает диалоги и иногда слишком буквально трактует «разговор с тенями».
Что дальше
Сейчас мы экспериментируем с мультиагентной системой: Narrator (генерация мира), Tactician (тактика врагов), Loremaster (знание истории мира). Каждый получит свою область и свою память. Первые прототипы показывают, что это снижает когнитивную нагрузку на одну модель и улучшает глубину ролевой игры. Если интересно — можете посмотреть, как похожая идея реализована в SillyTavern AI Game Master. Но это уже совсем другая история.
А пока — не пытайтесь заменить живого DM полностью. AI-мастер хорош для соло-кампаний, быстрых стартов и помощи в боёвке. Для глубоких социальных интриг и живых шуток за столом он беспомощен. Используйте его как ко-мастера: пусть рулит монстрами и генерацией подземелий, а живой человек управляет сюжетом. Тогда и баланс не сломается, и память не подведёт.
Кстати, последний штрих: для управления состоянием через JSON мы использовали open-source движок, который я разбирал в статье про Python AI Dungeon Master — он идеально лёг в нашу архитектуру.