Зачем учить нейросеть играть в новеллы? (Да, это безумие)
Представьте: вы запускаете "Бесконечное Лето", но вместо вас диалоги ведёт локальная LLM. Она читает реплики персонажей, анализирует контекст и выбирает ответы. Звучит как помесь академического эксперимента и цифрового баловства. Но именно так можно протестировать, насколько модель понимает сюжетные арки и эмоциональные нюансы.
В 2026 году инструменты для такого эксперимента стали доступнее. Ollama 2.4 (актуальная версия на март 2026) позволяет развернуть Llama 3.2 70B или Qwen2.5 32B на домашней видеокарте. Ren'Py 8.1 остаётся монополистом в мире визуальных новелл с открытым исходным кодом. Осталось только заставить их говорить друг с другом.
Важно: патчинг игр без разрешения авторов может нарушать лицензионные соглашения. Экспементируйте только с играми, у которых исходный код открыт, или с теми, что вы разрабатываете сами. Или используйте техники перехвата, которые не модифицируют файлы игры.
1Готовим железо и софт: Ollama и модель
Сначала установите Ollama с официального сайта. На момент марта 2026 года, версия 2.4 исправляет баги с длинными контекстами и добавляет Native Windows Support (наконец-то!).
curl -fsSL https://ollama.ai/install.sh | sh
# Или скачайте установщик для WindowsЗатем выберите модель. Для диалогов в новеллах важны:
- Понимание контекста: модели с контекстом 128k токенов теперь не редкость. Llama 3.2 70B-instruct-q4_K_M отлично справляется.
- Отсутствие цензуры: если ваш эксперимент включает NSFW-сцены, ищите ансафовые варианты. В статье про NSFW-чат с картинками есть подборка моделей.
- Скорость ответа: даже на RTX 5090 70B-модель может тормозить. Рассмотрите Qwen2.5-14B – она легче и для диалогов подходит.
ollama pull llama3.2:70b-instruct-q4_K_M
# Или
ollama pull qwen2.5:14b-instruct2Добываем игру: где взять Ren'Py проект для патчинга
Идеальный вариант – игры с открытым исходным кодом. «Бесконечное Лето» распространяется под лицензией, которая позволяет модификации. Скачайте исходники с GitHub репозитория.
Если исходников нет, придётся использовать реверс-инжиниринг. Ren'Py игры компилируются в архивы .rpa, которые можно распаковать утилитой un.rpa. Но это серая зона. Лучше работать с открытыми проектами.
Для эксперимента создадим простейшую новеллу на Ren'Py 8.1 с одним диалогом. Это легально и безопасно.
# script.rpy
define mc = Character("[mc_name]", color="#c8c8ff")
define alice = Character("Алиса", color="#ffc8c8")
label start:
mc "Привет, Алиса. Как настроение?"
menu:
"Спросить о погоде":
alice "Погода? Солнечно, но ветрено."
"Пошутить":
alice "Ха-ха, смешно. Не очень."
alice "Ладно, мне пора."
return3Пишем мост между Ren'Py и Ollama: Python-скрипт для автоматизации
Ren'Py позволяет вызывать внешние Python-скрипты. Мы создадим модуль, который будет:
- Перехватывать диалоги из игры.
- Формировать промпт для LLM с историей разговора.
- Отправлять запрос в Ollama через API.
- Возвращать выбранный вариант ответа в игру.
Ollama предоставляет REST API на localhost:11434. Используем библиотеку requests.
# ai_bridge.py
import requests
import json
class OllamaBridge:
def __init__(self, model="llama3.2:70b-instruct-q4_K_M", base_url="http://localhost:11434"):
self.model = model
self.base_url = base_url
self.conversation_history = []
def add_to_history(self, role, content):
self.conversation_history.append({"role": role, "content": content})
# Ограничиваем историю последними 20 репликами, чтобы не перегружать контекст
if len(self.conversation_history) > 20:
self.conversation_history = self.conversation_history[-20:]
def get_response(self, prompt):
self.add_to_history("user", prompt)
messages = self.conversation_history.copy()
# Системный промпт задаёт роль
system_msg = {"role": "system", "content": "Ты персонаж визуальной новеллы. Отвечай кратко и в соответствии с характером."}
messages.insert(0, system_msg)
response = requests.post(
f"{self.base_url}/api/chat",
json={
"model": self.model,
"messages": messages,
"options": {"temperature": 0.7, "top_p": 0.9}
}
)
if response.status_code == 200:
reply = response.json()["message"]["content"]
self.add_to_history("assistant", reply)
return reply
else:
return "Ошибка соединения с Ollama."
В Ren'Py скрипте импортируем этот модуль и используем:
# В начале script.rpy
init python:
import ai_bridge
ollama = ai_bridge.OllamaBridge(model="qwen2.5:14b-instruct")
label start:
mc "Привет, Алиса. Как настроение?"
# Вместо menu вызываем LLM
$ prompt = "Персонаж Алиса. Ты говоришь с другом. Он сказал: 'Привет, Алиса. Как настроение?' Ответь кратко."
$ response = ollama.get_response(prompt)
alice "[response]"
mc "Что думаешь о завтрашней встрече?"
$ prompt2 = "Продолжи диалог. Предыдущие реплики: " + response + ". Тебе говорят: 'Что думаешь о завтрашней встрече?'"
$ response2 = ollama.get_response(prompt2)
alice "[response2]"
returnЭто базовый пример. В реальности нужно парсить диалоги автоматически, но для начала хватит.
А что, если не хочется кодить? Альтернативные инструменты
Патчинг Ren'Py – это хардкор. Есть более простые способы интегрировать LLM в игры:
| Инструмент | Как работает | Плюсы | Минусы |
|---|---|---|---|
| SillyTavern AI Game Master | Перехватывает текст из любого окна игры и подставляет ответы LLM | Не требует модификации игры, работает с любыми играми | Может быть нестабильным, требует настройки перехвата |
| Personica AI | Плагин для Unreal Engine, встраивает LLM прямо в движок | Нативная интеграция, высокая производительность | Только для Unreal, сложная настройка |
| Самописный RAG-агент | Использует векторную базу для хранения сценария игры и контекста | Точные ответы на основе знаний об игре | Требует подготовки датасета и настройки RAG |
Для новелл на Ren'Py патчинг – самый прямой метод. Но если вы хотите экспериментировать с разными играми, SillyTavern сэкономит время.
Где это может пригодиться? Не только для баловства
Кажется, что заставлять LLM играть в новеллы – это чисто академическое развлечение. Но есть практические применения:
- Тестирование сценариев: автоматический проход диалоговых веток для поиска багов в интерактивных историях.
- Генерация контента: LLM может предлагать альтернативные реплики или даже создавать новые диалоги на лету, как в AI Dungeon Master.
- Исследование поведения ИИ: как модели принимают решения в эмоционально окрашенных ситуациях? Отличный полигон для психологии ИИ.
- Доступность: система может помогать игрокам с ограниченными возможностями, проговаривая выборы или анализируя сюжет.
Кому стоит попробовать этот эксперимент?
Если вы:
- Разработчик игр на Ren'Py и хотите добавить ИИ-персонажей с динамическими диалогами.
- Энтузиаст локальных LLM, который устал от чат-интерфейсов и хочет новых вызовов.
- Исследователь, изучающий взаимодействие ИИ с нарративными системами.
- Просто любитель визуальных новелл, который хочет увидеть, как «Бесконечное Лето» пройдёт само себя.
Тогда этот гайд для вас. Начните с простой тестовой новеллы, чтобы не утонуть в коде. И помните: самое сложное – не заставить LLM отвечать, а сделать так, чтобы её ответы были уместными и не разрушали immersion. Для этого нужна тонкая настройка промптов и, возможно, RAG-агент с знаниями об игре.
А если хочется чего-то менее хардкорного, попробуйте сторителлинг в SillyTavern – там тоже можно разыгрывать диалоги, но без возни с движками.
И да, если ваш ИИ вдруг начнёт вести себя как социопат или зациклится на одной фразе – это не баг, это фича. По крайней мере, для исследователя.