Комментарии 15
Привет!
Отличный материал!
Если не секрет — какой стек используете для инференса System 1 на клиенте? ONNX Runtime, TensorRT или что-то самописное на CUDA? И как тестировали нагрузку, когда на сцене действительно появляется 100 NPC с активным рефлекторным слоем?
Мы намеренно отказались от классических инференс-движков вроде ONNX Runtime и TensorRT для клиентской части System Они отлично подходят для "Когнитивной коры" (System 2), но для рефлексов на 60+ Гц их оверхед на CPU-GPU синхронизацию убивает всю идею Zero-latency. Поскольку System 1 — это сверхлегкие перцептроны без семантики, мы пошли по пути bare-metal. Мы "запекаем" веса обученной сети в сырые буферы и гоняем инференс напрямую через Compute Shaders (вычислительные шейдеры) или кастомные CUDA/DirectML ядра. По сути, это просто параллельное перемножение матриц, которое происходит прямо в VRAM, минуя прослойки ML-фреймворков. Выходные тензоры мапятся напрямую в буферы анимации (Blendshapes/Bones). Точную топологию слоев пока держим под капотом.
Что касается нагрузки в 100 NPC — честно признаюсь, полномасштабный стресс-тест роя мы еще не гоняли. Прямо сейчас мы продираемся через ад зависимостей на бэкенде, чтобы поднять хотя бы минимальное стабильное MVP
Хорошая демонстрация того, почему модель "один поток - одна LLM" не работает в real-time. Параллель с рефлекторной дугой понятна и точная.
Любопытный нюанс для тех, кто применяет похожую архитектуру не в геймдеве, а в браузерных агентах (browser-use, Playwright-based сценарии). Там появляется третий источник задержки, который не покрывает ни System 1, ни System 2: сам браузер. Антибот-системы могут добавить 2-7 секунд на JS-челлендж до того, как страница вообще отдаст DOM. Рефлекторный слой в этот момент просто ждет данных, которых ещё нет.
По сути, для веб-агентов нужен ещё один уровень - что-то вроде "вегетативной нервной системы": асинхронное управление сессиями и предварительная прогрузка контекста, которая не блокирует ни System 1, ни System 2.
Думали про применение архитектуры вне геймдева - или пока фокус именно на NPC/робототехнике?
Берем концепт на заметку.
Отвечая на вопрос про выход за пределы геймдева: пока фокус держим здесь, но мы уже пытаемся масштабировать подход на саму LLM.
После того как мы успешно обкатали рефлекторную дугу (System 1) на генерации лицевых анимаций (Blendshapes) в реалтайме напрямую из сырого звука, мы замахнулись на System 2. Идея: горячая подмена личности у Gemma 3 на лету. Мы хотели скрестить наш подход с динамическим переключением LoRA-адаптеров, чтобы NPC менял характер за доли секунды.
Но суровая реальность инди-R&D вносит коррективы. Наши вычислительные возможности и лимиты бесплатных облаков (сидим на карточках T4 16GB) не позволяют проводить тысячи тестов. Можете сами посчитать: с учетом времени на загрузку чекпоинтов, очистку памяти (gc.collect() + empty_cache()) и перестройку графов, за сегодня мы осилили от силы пару десятков чистых экспериментов.
Итог на данный момент: Глубинную «личность» (паттерны долгосрочного планирования) подменить на лету пока не вышло — нужно больше машинного времени на подбор гиперпараметров. НО, мы добились того, что семантика ответа и tone of voice меняются буквально за секунды при инъекции нужного адаптера в слои q_proj и v_proj.
Так что пруф-оф-концепт работает, архитектура тянет, мы просто упираемся в железо
Ваши разработки понравились военным. За вами уже выехали, не меняйте местоположение
Я прочитал первую секцию, увидел вторую, посмотрел на третью, и мне так печально стало... Я хочу читать статью написанную человеком, а не хтонь с 50% шансом галлюцинаций от ИИ..
Мой внутренний кожаный мешок протестует против написания лонгридов, когда можно пилить код. Отдал черновик нейронке, а она нагнала хтони — классика. Зато в моих репозиториях (в соседних статьях) 100% ручной хардкор и ни одного сгенерированного пайплайна. Заходи туда за чистым опенсорсом! 🛠️
Не не не это не так работает. Я пришёл, я начал читать и понял, что текст написан ИИ. Желания тратить время чтобы разобраться - есть ли там человек за ней (и где именно ИИ его обманул) - у меня нет, я пошёл скролить ленту дальше.
Предварительно написав этот коммент из сожаления о времени уже потраченном.
Эх, детектор у тебя настроен отлично, не проведешь. Похоже, мой кожаный мешок поленился и доверился нейронке больше, чем стоило. Согласен, время дорогое, поэтому я и влил его всё в разработку, а не в редактуру. Заходите за чистым кодом — там авторский стиль во всей красе и без галлюцинаций
У меня только один вопрос остался - зачем ты человека сожрал, железяка ИИшная?
Как именно вектор состояния от LLM кодируется?
Раз уж мы договорились оставить саму математику «спинного мозга» под капотом, я отвечу на архитектурном уровне, как именно мы передаем данные, чтобы не сжечь железо.
Главное правило нашей System 1: никаких сырых LLM-эмбеддингов (hidden states) на 4096 размерностей. Если гонять такие векторы на 60 FPS, мы получим тот самый inference lag, с которым боремся.
Вектор состояния кодируется предельно прагматично:
Структурированный выхлоп (System 2): Мы заставляем LLM (через system prompt или function calling) выдавать не просто текст, а жестко структурированный JSON с фиксированными ключами. Как в примере из статьи:
{"mood": "aggressive", "target": "player", "tactic": "flank_left"}.Детерминированный парсинг (Мост): Наш промежуточный скрипт перехватывает этот JSON и переводит его в нормализованный, сверхкомпактный 1D-тензор (массив float-значений).
Дискретные состояния (цель, тактика) переводятся через One-Hot/Multi-Hot кодирование.
Непрерывные состояния (настроение) маппятся в диапазоны
[-1.0, 1.0].На выходе мы получаем крошечный вектор, скажем, размерностью
[1x16]или[1x32].
Инъекция в рефлексы (System 1): Этот компактный вектор
V_stateпередается в наш легковесный MLP-движок. На вход "спинного мозга" каждый кадр (60 раз в секунду) подается конкатенация:[Текущие_сырые_данные_среды + V_state].
Итог: LLM обновляет этот крошечный управляющий вектор V_state раз в пару секунд. А "спинной мозг" молотит кадры непрерывно, используя последний полученный вектор как контекстное условие (conditioning) для своих реакций. Дешево, железобетонно и без утечек памяти.
Сейчас мы эксперементируем переход на динамическую архитектуру с наращиванием слоёв (Net2Net), чтобы NPC учился прямо на ходу

Как мы пришили LLM «спинной мозг»: архитектура рефлексов для ИИ-агентов в 60 FPS