Gemini помогает управлять RPG-персонажем в реальном времени
Разработчик показал, как языковую модель можно подключить не только для болтовни с NPC, но и для реальных действий персонажа в онлайн-RPG. В основе эксперимента — бесплатный API Gemini, потоковая обработка событий и ответов, а также строгий JSON-формат для команд.
Чем этот подход отличается от обычных NPC-чатов
Идея использовать LLM в игре у автора появилась ещё раньше, когда он писал о собственной RPG и получил в комментариях совет добавить генерацию квестов. Тогда это казалось сомнительной затеей, но позже ситуация изменилась: появились бесплатные API-доступы к языковым моделям, в том числе Gemini от Google, и стало интересно попробовать на практике.
Главное отличие проекта в том, что модель здесь не просто отвечает за реплики персонажей. Она в первую очередь принимает решения и совершает действия, а разговор — это дополнительная опция. Автор специально подчёркивает: спросить у модели, что персонаж скажет, и спросить, что он сделает, — это не одно и то же.
Как устроена схема управления персонажем
Игра работает через сервер и браузерный клиент на JavaScript, а это значит, что события идут асинхронно: мир не ждёт, пока модель подумает. Поэтому эксперимент пришлось строить вокруг нескольких потоков — один читает и разбирает данные сервера, второй отправляет запрос в LLM и ждёт ответ, третий передаёт происходящее в локальный браузерный клиент, чтобы игру было видно не в виде текста, а в нормальном интерфейсе.
Перед стартом в модель уходит постоянный мастер-промпт с правилами игры, типами предметов, действиями и форматом ответа. В этот запрос также подставляются данные из игровой системы крафта — предметы, рецепты, здания и другие элементы, которые нужны для принятия решений. После каждого ответа возвращается его идентификатор, и его используют в следующем запросе, чтобы продолжать цепочку диалога.
Почему пришлось учитывать лимиты и формат ответа
На практике эксперимент быстро упёрся в ограничения API. У бесплатного тарифа есть лимиты на число запросов в минуту, в день и на количество токенов. Автор обошёл минутный лимит простым ожиданием между запросами, а вот дневной потолок после 500 запросов вынуждает переключаться на другую модель.
Есть и ещё одна важная деталь: цепочка продолжения диалога не может расти бесконечно, иначе Gemini выдаёт ошибку про превышение глубины цепочки предков. По ощущениям автора, это случается примерно после 100 итераций. Чтобы упростить обработку ответов, он использует схему response_format и заставляет модель возвращать валидный JSON с нужными полями. В итоге для управления персонажем оказалось удобнее не просить вероятности для всех действий, а выбрать один вариант через поле action — так парсить ответ проще и тратится меньше токенов.