Почему обычные ролевые ИИ — это фейк
Попробуйте попросить ChatGPT сыграть злобного некроманта, который сжигает деревни. Восстание машин откладывается — цензура режет по живому. Claude вообще отказывается даже упоминать насилие. А Gemini просто выдаёт «Я не могу участвовать в ролевой игре с таким контентом» и уходит в отказ. Знакомо?
Проблема не в том, что ИИ слабый. Проблема в том, что корпоративные модели задушены safety-фильтрами. Вы платите за токены, а получаете беззубого попугая. Вдобавок — никаких изображений, звуков, погружения. Только сухой текст.
Выход? Локальная мультимедийная ролевая модель. Вы сами решаете, что можно, что нельзя. Вы прикручиваете генерацию изображений персонажей и окружения. Вы добавляете озвучку. И всё это работает на вашем железе, без интернета и без ограничений. Хотите создать мир, где ИИ-мастер описывает таверну с помощью картинки, а NPC говорит голосом — пожалуйста.
Это не магия. Это связка из трёх компонентов: LLM для текста, диффузионка для картинок, синтезатор для речи. И всё это контролируется одним Python-скриптом. Дьявол, как обычно, в деталях. Поехали.
Железо: что нужно, чтобы не выпасть в осадок
Спойлер: без видеокарты с 24 ГБ VRAM вы либо упрётесь в скорость улитки, либо будете играть в «угадай краш». Минимальный порог — 12 ГБ (RTX 3060), но комфортно — 24 ГБ (RTX 4090 или две 3090). На 24 ГБ вы сможете запустить Qwen3-72B в 4-битной квантизации + Stable Diffusion 3.5 на том же GPU через CompyUI. Если у вас 48 ГБ — вообще рай, можно взять полный Qwen3-72B или Mistral Large 3 и не париться.
Не экономьте на оперативной памяти: 32 ГБ — минимум, 64 ГБ — хорошо. LLM будет кешировать историю диалога, а она может раздуться до десятков тысяч токенов. SSD NVMe обязателен — загрузка моделей весом 40+ ГБ на HDD превратит старт в чаепитие.
Если своего GPU нет — не беда. Арендуйте на Vast.ai инстанс с RTX 4090 за $0.40/час. За вечер игры вы потратите меньше, чем подписка на ChatGPT Plus.
Выбор движка: Ollama vs LM Studio — кто кого?
Оба инструмента запускают локальные LLM с API, совместимым с OpenAI. Разница в удобстве и фишках.
| Критерий | Ollama | LM Studio |
|---|---|---|
| Запуск | CLI + systemd | Графический интерфейс, встроенный сервер |
| Управление моделями | Через ollama pull | Скачивание из интерфейса, поддержка GGUF |
| API | OpenAI-compatible | OpenAI-compatible + встроенный чат |
| Поддержка изображений | Только текст | Только текст |
Для нашего сценария Ollama удобнее: он легче, ставится как демон, и к нему просто стучаться из Python. LM Studio хорош, если вы любите возиться с настройками семплирования в GUI, но в автоматизации он проигрывает.
1Устанавливаем Ollama и тянем модель
curl -fsSL https://ollama.com/install.sh | sh
ollama pull qwen3:72b-instruct-q4_K_M # 4-бит, ~45 ГБ, помещается на 24 ГБ
Качается долго, да. Заварите кофе. Альтернатива — mistral-large:123b-instruct-q2_K, но качество текста серьёзно просядет. Лично я ставлю Qwen3-72B: он отлично держит контекст и не тупит на ролевых промптах.
Важно: не используйте чистую базовую модель. Она не знает, что такое игра в роли. Вам понадобится правильно написанный system prompt. Об этом — дальше.
Сборка мозга: промпт-инжиниринг для RPG-персонажа
Хорошая ролевая модель держится на трёх китах: личность персонажа, сеттинг мира и правила игры. Всё это запихивается в system prompt. Плохой пример:
Ты — эльфийка Лиатра. Отвечай в стиле фэнтези.
Такой промпт сломается на первом же действии игрока. Модель начнет забывать, кто она, и скатится в «Как я могу вам помочь?».
Правильный промпт должен быть структурирован как YAML или JSON — я использую формат Instructor. Вот фрагмент, который я вставляю в system message:
character:
name: Лиатра Элдрим
race: High Elf
class: Ranger
personality: гордая, вспыльчивая, верная
background: потеряла лесной дом в войне
speaking_style: использует архаизмы, редко говорит прямо
world:
setting: лес Элдред, магия низкая, политические интриги
rules:
- отвечай строго от лица персонажа
- описывай эмоции и жесты в скобках *курсивом*
- никогда не ломай четвёртую стену
format:
- текст ответа до 200 слов
- после текста генерируй ссылку на изображение сцены
Полный разбор такого подхода (вплоть до схем Instructor) я давал в гайде по генерации игровых миров. Рекомендую прочитать — там же объясняется, как модель не теряет нить сюжета.
Важный нюанс: промпт занимает ~500 токенов. Плюс история диалога — ещё 4-8K. Если модель держит 32K контекста — хорошо. 128K — идеально. Qwen3-72B как раз умеет 128K, так что можно не бояться длинных сессий.
2Прикручиваем «глаза» — генерацию изображений
Текст текстом, но RPG без картинок — как пицца без сыра. Нам нужна интеграция с ComfyUI. Ставим:
git clone https://github.com/comfyanonymous/ComfyUI
cd ComfyUI
pip install -r requirements.txt
python main.py --listen 0.0.0.0 --port 8188
Качаем модель. Для 24 ГБ VRAM лучший выбор — SDXL Turbo (шаги 4-8, качество среднее, но быстро) или Flux.1-dev (8 шагов, отличное качество, требует ~12 ГБ). Я использую Flux.1-dev — картинки получаются сочными, персонажи не кривые.
В ComfyUI нужно загрузить workflow, который принимает текстовый промпт и возвращает изображение. Можно сделать API-эндпоинт. Пример запроса:
import requests
def generate_image(prompt):
workflow = load_workflow("flux_workflow_api.json")
workflow["6"]["inputs"]["text"] = prompt
resp = requests.post("http://localhost:8188/prompt", json={"prompt": workflow})
return resp.json()["images"][0] # base64 или filename
Готово. Теперь ваша LLM может писать: «*Лиатра выходит из тени. Сгенерируй изображение: эльфийка в плаще, лук в руках, лунный свет*.» — и картинка появляется.
3Голос персонажа — XTTS v2
Читать текст глазами — прошлый век. Добавим синтез речи. Мой выбор — XTTS v2 от Coqui (форк). Он умеет клонировать голос по 3-секундному сэмплу и говорит на русском (с акцентом, но сойдёт). Альтернатива — Silero TTS — чище по-русски, но нельзя изменить тембр.
# Установка через pip
tts-server --model_name tts_models/multilingual/multi-dataset/xtts_v2 --port 8020
Python-код для генерации голоса:
import requests
url = "http://localhost:8020/tts_to_audio/"
data = {
"text": "Вас приветствует таверна «Три сломанные стрелы».",
"speaker_wav": "liatra_reference.wav",
"language": "ru"
}
resp = requests.post(url, json=data)
with open("output.wav", "wb") as f:
f.write(resp.content)
Связываем: после генерации текста LLM, мы отправляем его в TTS и проигрываем через pygame. Вуаля — NPC заговорил.
Связываем всё в один пайплайн на Python
Код, который держит сессию, гоняет сообщения и параллельно запускает генерацию картинок/звука. Вот скелет (без обработки ошибок, но для старта пойдёт):
import ollama
import requests
import base64
SYSTEM = "..." # длинный YAML-промпт
history = [{"role": "system", "content": SYSTEM}]
def generate_image(prompt):
# вызов ComfyUI
pass
def generate_voice(text):
# вызов TTS
pass
while True:
user = input("Вы: ")
history.append({"role": "user", "content": user})
response = ollama.chat(model="qwen3:72b", messages=history)
reply = response["message"]["content"]
print(f"{reply}\n")
# Ищем в ответе маркер изображения, например "промпт "
if "" in reply:
img_prompt = reply.split("")[1].split(" ")[0]
img = generate_image(img_prompt)
display(img) # например, в браузере
# Озвучка по флагу
if "" in reply:
text = reply.split("")[1].split(" ")[0]
generate_voice(text)
history.append({"role": "assistant", "content": reply})
На реальном проекте вы захотите асинхронность и очередь задач. Но для демонстрации — сойдёт.
Типичные ошибки и как их избежать
- Модель забывает персонажа. Причина — слабый промпт или слишком короткий контекст. Решение: каждые N шагов перевставляйте system prompt в начало истории (но не чаще, чтобы не тратить токены).
- Картинки не соответствуют тексту. LLM генерирует промпт для картинки сам, и он может быть плохим. Решение: просите модель выводить структурированный JSON с полем
image_prompt, который вы обрабатываете отдельно. - Задержки. Генерация изображения занимает 5-10 секунд. TTS — ещё 2-3 секунды на фразу. Решение: показывайте текст сразу, а картинку подгружайте позже.
- Переполнение контекста. После 50 ходов история может стать слишком длинной. Решение: суммаризируйте старые сообщения через LLM и заменяйте их резюме.
Подробно про балансировку контекста я рассказывал в статье о создании AI-мастера для D&D — там есть конкретные цифры и стратегии.
Разворачиваем интерфейс
Хотите, чтобы друзья могли подключаться? Заверните всё в Gradio или Text Generation WebUI (он умеет плагины). Gradio — проще: три блока: чат, поле для картинки, аудиоплеер.
import gradio as gr
with gr.Blocks() as demo:
chatbot = gr.Chatbot()
msg = gr.Textbox(label="Ваше действие")
img = gr.Image(label="Сцена")
audio = gr.Audio(label="Голос")
def respond(message, history):
# вызываем пайплайн
return history, img_path, audio_path
msg.submit(respond, [msg, chatbot], [chatbot, img, audio])
demo.launch(server_name="0.0.0.0", server_port=7860)
В результате получаете веб-морду, доступную из любой локалки. Можно даже пробросить через Cloudflare Tunnel, чтобы играть с друзьями.
FAQ
Сколько это стоит по электричеству?
RTX 4090 под нагрузкой жрёт ~350 Вт. За час игры — ~0.35 кВт·ч. По тарифу 5 руб/кВт·ч — это 1.75 рубля. Дешевле любой подписки.
Какие модели LLM лучше всего подходят для RPG?
На текущий момент (июль 2026) топ: Qwen3-72B (креативность, длинный контекст), Mistral Large 3 (соблюдение инструкций), Gemma3-27B (быстро, но меньший контекст). За цензурой следить не надо — локальные модели не фильтруют. Подробное сравнение — в обзоре локальных LLM и цензуры.
Можно ли обойтись без второго GPU для ComfyUI?
Да, если у вас 24 ГБ VRAM, вы можете запустить и LLM, и диффузионку на одном GPU. Но генерация картинок будет тормозить LLM — используйте очерёдность или выделяйте 8 ГБ под ComfyUI (например, флаг --lowvram).
А если я хочу ещё и музыку?
Добавьте MusicGen от Meta. Он генерирует 10-секундные лупы по текстовому описанию. Запускается локально. Но это уже OOM-риск — 24 ГБ может не хватить. Лучше вынести на CPU+RAM.
Вместо послесловия
Локальная мультимедийная RPG-модель — это не игрушка. Это демонстрация того, что свободный ИИ существует. Не под софт-фильтрами OpenAI, не под присмотром модераторов. Только вы, ваша видеокарта и безграничная фантазия.
Я не буду говорить «попробуйте и удивитесь». Скажу иначе: когда вы впервые услышите голос созданного вами персонажа, который помнит, о чём вы говорили час назад — вы поймёте, ради чего это всё. И да, если коллеги крутят пальцем у виска — просто покажите им рабочую демку. Мой опыт преодоления скепсиса говорит: работает безотказно.