Зачем играть в то, что не видит?
Мобильные игры давно научились использовать камеру - для AR, сканирования QR-кодов, распознавания лиц в фильтрах. Но это всегда были заранее заготовленные сценарии. Что если дать игре настоящие глаза? Не просто доступ к пикселям, а способность их понимать, анализировать контекст, вести диалог о том, что она видит. Именно эту идею мы и проверяли в проекте Lenswalker.
Суть проста: игрок фотографирует реальные объекты, игра их анализирует через локальную мультимодальную модель и генерирует квесты на основе увиденного. Никаких облаков, никаких API-ключей, полная автономность.
Почему именно локально? (Спойлер: не только из-за приватности)
Да, приватность - это важно. Но есть и более прагматичные причины. Задержки. Представьте: вы фотографируете дерево во дворе, игра отправляет картинку в облако, ждет 2-3 секунды ответа. Магия момента разрушается. С локальной моделью задержка - это время инференса, а не сетевого пинг-понга.
Еще момент - стоимость. Если ваша игра станет популярной, каждый запрос к GPT-4 Vision будет стоить денег. Много денег. Локальная модель после развертывания работает бесплатно. Ну, почти бесплатно - если не считать счет за электричество.
Выбор оружия: почему Qwen3-VL, а не LLaVA или другие?
Мы тестировали несколько кандидатов. LLaVA-Next - хороша, но требовательна к ресурсам. CogVLM - мощная, но размеры моделей пугали. Qwen3-VL выбрали по трем причинам:
- Качество анализа - на тестовых изображениях она показывала лучшую консистентность в описаниях
- Размер - 8B параметров, что для vision-модели довольно скромно
- Поддержка в Ollama - это критично, потому что Ollama стала нашим мостом между моделью и приложением
Не обольщайтесь - даже 8B модель требует серьезных ресурсов. На RTX 4090 инференс одной картинки занимает 1.5-3 секунды. На более слабых картах время может увеличиться до 10-15 секунд, что для игры уже неприемлемо.
Архитектура: как заставить телефон разговаривать с видеокартой
Самая интересная часть. Модель живет на сервере (в нашем случае - ПК с RTX 4090), мобильное приложение - на телефоне. Как их подружить? Через локальную сеть.
| Компонент | Роль | Технология |
|---|---|---|
| Vision-сервер | Запускает Qwen3-VL, обрабатывает запросы | Ollama + FastAPI |
| Игровой бэкенд | Генерирует квесты, хранит прогресс | FastAPI + SQLite |
| Мобильное приложение | Интерфейс, камера, сетевое взаимодействие | React Native |
1Настраиваем Ollama сервер
Первое - устанавливаем Ollama. Если вы раньше не работали с локальными LLM, почитайте наш гайд по избежанию ошибок при локальном запуске. Там много тонкостей с CUDA, памятью и настройками контекста.
Загружаем модель: ollama pull qwen2.5-vl:7b (да, в Ollama она называется qwen2.5, но это та же модель). Важный момент - проверяем, что модель использует GPU. Запускаем ollama run qwen2.5-vl:7b и вводим простой запрос с изображением. Если видите использование видеопамяти в nvidia-smi - все хорошо.
2Строим FastAPI прокси
Ollama предоставляет REST API, но он слишком низкоуровневый для нашей игры. Мы оборачиваем его в FastAPI, который выполняет три задачи:
- Принимает изображение от мобильного приложения (base64 или multipart/form-data)
- Конвертирует его в формат, понятный Ollama
- Формирует промпт с системной инструкцией и отправляет в модель
Системная инструкция - это магия, которая превращает сырой анализ изображения в игровой контент. Выглядит примерно так: "Ты - проводник в мире Lenswalker. Опиши изображение кратко, выдели 3-5 ключевых объектов. Для каждого объекта предложи мистическое свойство или скрытую историю."
Не используйте слишком длинные системные инструкции. Qwen3-VL имеет ограниченный контекст, и каждая картинка "съедает" огромное количество токенов. Оптимально - 2-3 предложения.
3Разрабатываем игровую логику
Получив анализ изображения от модели, нужно превратить его в игровое событие. Мы использовали простой конечный автомат:
- Модель идентифицирует объекты ("дерево", "автомобиль", "кошка")
- Игровой движер сопоставляет объекты с шаблонами квестов
- Генерируется задание ("Этот старый дуб хранит память о древнем ритуале. Найди три предмета, связанных с землей, вокруг него")
Ключевая хитрость - мы не просим модель генерировать готовые квесты. Мы просим описание, а уже на его основе игровой движер создает структурированное задание. Так надежнее и контролируемее.
4Мобильное приложение: камера, сеть, UX
React Native с Expo - наш выбор. Почему? Expo Camera API работает стабильно, а для сетевых запросов используем обычный fetch. Важные моменты:
- Сжатие изображений - отправлять 12MP фото бессмысленно. Сжимаем до 1024px по большей стороне, качество 80%
- Индикация загрузки - пользователь должен видеть, что игра "думает". Анимация, прогресс-бар, что угодно
- Обработка ошибок сети - если сервер недоступен, предлагаем перейти в режим "оффлайн-квестов"
Цифры, которые имеют значение: производительность в реальных условиях
Теория - это хорошо, но как все работает на практике? Мы провели 100 тестовых запусков с разными изображениями.
| Метрика | Значение | Комментарий |
|---|---|---|
| Время инференса (RTX 4090) | 1.8-3.2 секунды | Зависит от сложности изображения |
| Потребление VRAM | 12-14 ГБ | Да, 8B модель требует столько |
| Консистентность ответов | 85% | На одинаковых фото дает схожие описания |
| Точность идентификации | ~70% | Иногда путает похожие объекты |
Консистентность в 85% - это хороший результат для локальной модели. Но помните: 15% вариативности означают, что одно и то же дерево сегодня может быть "древним дубом", а завтра - "призрачным ясенем". В игре мы превратили это в фичу, а не баг.
Типичные грабли, на которые мы наступили (чтобы вы не повторяли)
Ошибок было много. Вот самые болезненные:
- Кодировка изображений - Ollama ожидает base64 без префикса data:image/... Потратили день на отладку
- Размер контекста - по умолчанию Ollama использует 2048 токенов. Для мультимодальных моделей нужно увеличивать до 4096 или больше через параметр --num-ctx
- Тепловой дросселинг - RTX 4090 после 10-15 последовательных запросов начинала греться и снижать частоту. Пришлось добавлять задержки между запросами
- Мобильная сеть - если телефон переключается с Wi-Fi на мобильный интернет, соединение с локальным сервером рвется. Решили детектировать смену сети и переподключаться
А что с менее мощным железом?
RTX 4090 - это роскошь. А что если у вас RTX 3060 (12 ГБ) или даже ноутбук с мобильной видеокартой? Варианты есть:
- Квантование - загружаем модель в формате q4_K_M или q5_K_M через Ollama. Теряем немного качества, но экономим память
- Уменьшение разрешения - просим модель анализировать не оригинальное фото, а превью 512x512
- Более легкая модель - можно попробовать LLaVA-Next или даже специально обученную lightweight-версию
Если интересно, как запускать модели на слабом железе, у нас есть отдельный гайд по Raspberry Pi и майнинг-ригам. Принципы те же, только терпения нужно больше.
Будущее, которое уже здесь: куда двигаться дальше?
Lenswalker - это proof of concept. Дальше можно развиваться в нескольких направлениях:
- Персонализация - модель запоминает, что игрок уже фотографировал, и строит нарратив на основе истории
- Мультиплеер - несколько игроков видят один объект, модель генерирует разные перспективы для каждого
- Генерация контента - на основе анализа фото модель создает не только текстовые квесты, но и простые 3D-модели или текстуры. Похожий подход мы описывали в статье про генерацию 3D-мебели
Самый интересный вариант - полностью локальная игра, где модель живет на телефоне. Технически это уже возможно с llama.cpp на Snapdragon 888, но для vision-моделей потребуется еще 2-3 года развития мобильных нейропроцессоров.
Главный инсайт проекта: локальные мультимодальные модели уже достаточно хороши для создания уникальных игровых механик. Они не идеальны, иногда ошибаются, но именно эта "человечность" делает игру живой и непредсказуемой.
Игра, которая видит мир - это не фантастика. Это рабочий прототип, собранный из открытых компонентов. Qwen3-VL, Ollama, FastAPI, React Native. Ничего экзотического. Сложность не в технологиях, а в том, чтобы придумать, как превратить анализ пикселей в увлекательный геймплей.
Попробуйте. Сфотографируйте свою комнату и спросите у модели, какие тайны она здесь видит. Возможно, вы найдете идею для следующей игры.