Agentis Memory — Redis-совместимое хранилище со встроенным векторным поиском и локальными эмбеддингами

Agentis Memory — Redis-совместимое хранилище со встроенным векторным поиском и локальными эмбеддингами

Разработка настоящих AI-агентов требует не только продуманной архитектуры, но и общей памяти, которой у большинства решений попросту нет. Агенты работают изолированно, что приводит к дублированию усилий, конфликтующим гипотезам и ошибкам. Решение этой проблемы — Agentis Memory: сервер, совместимый с Redis-протоколом, но с встроенным семантическим поиском и локальной генерацией эмбеддингов.

Проблема: у агентов не было общей памяти

Представьте шесть агентов, расследующих инцидент. Один находит OOMKilled в логах, другой — CPU-пик в Grafana, третий — недавний деплой в Slack. Все действуют параллельно, но не обмениваются информацией. Результат — три конкурирующие версии, из которых две ложные.

Первоначальные попытки использовать общий файл привели к гонкам за запись, отсутствию структуры и невозможности поиска. Была нужна оперативная память — быстрая, разделяемая, с семантическим поиском. Не долгосрочный RAG, а shared-контекст, где факт, сохранённый одним агентом, мгновенно доступен другим.

Почему существующие решения не подошли

Mem0 и Zep требуют REST API, внешние сервисы для эмбеддингов и отдельные векторные базы. Это означает минимум три сетевых вызова на одну операцию — неприемлемо для оперативной памяти.

Redis с модулем RediSearch ближе к цели: поддержка RESP-протокола, но эмбеддинги нужно считать отдельно. Всё равно нужен внешний inference-сервис, API-ключи и задержки.

Главная проблема всех решений — зависимость от сети и внешних зависимостей. Цель была проще: MEMSAVE key text → +OK, всё в одном процессе, без HTTP, без SDK, без ключей.

Почему не стал форкать Redis

Первая попытка — модуль на C с ONNX Runtime внутри Redis. Ручное управление памятью, сегфолты, сложная линковка, падения при нагрузке. Через неделю стало ясно: это тупик.

Вопрос: зачем писать на C, если можно на Java? Никто не видит внутренности — клиенту важно только, чтобы redis-cli -p 6399 PING возвращал PONG. Нужен не «настоящий Redis», а сервер, говорящий на его протоколе.

Технологии: GraalVM, Java 25 и инкубационные проекты

Решение принято — писать с нуля на Java, но не на обычной JVM, а с использованием GraalVM native-image. Результат — один бинарник ~150 МБ, нулевой startup, никакой JVM.

Использованы передовые технологии:

  • Java Vector API (Project Panama) — SIMD-инструкции прямо в Java для ускорения косинусного сходства.
  • Project Loom (Virtual Threads) — лёгкие потоки, упрощающие параллелизм без overhead’а от OS-тредов.
  • ONNX Runtime — локальный inference модели all-MiniLM-L6-v2, 384-мерные векторы за 2–5 мс.
  • jvector — HNSW-граф для быстрого approximate nearest neighbor search.

Как производительность упала, а потом взлетела

Первая версия на обычной JVM показала пропускную способность вдвое ниже Redis. Было обидно.

Два изменения изменили всё:

  • Сборка через GraalVM native-image — устранён JIT-warmup и GC-переменные.
  • Переписан hot path вычисления косинусного сходства с использованием Vector API.

Результат — 1.36x производительности Redis на строковых операциях: с 60 тыс. до 168 тыс. ops/sec.

Как это работает

Agentis Memory — единый процесс с двумя движками:

  • KV-движок — поддержка 90+ Redis-команд: строки, хэши, списки, TTL, SCAN, pub/sub. Можно использовать Redis Insight — всё выглядит как обычный Redis.
  • Векторный движок — четыре специальные команды:

MEMSAVE — принимает текст, разбивает на чанки, генерирует эмбеддинги через ONNX, индексирует в HNSW. Операция возвращает +OK мгновенно — тяжёлая работа идёт асинхронно. Задержка до готовности поиска — 5–10 мс.

MEMQUERY — семантический поиск по запросу. Возвращает ключ, текст и score.

MEMSTATUS — статус индексации: indexed, pending, error.

MEMDEL — удаляет и из KV, и из векторного индекса.

Никаких SDK: используйте Jedis, redis-py, go-redis — любые клиенты, поддерживающие call() или execute_command().

Теперь агенты видят общую картину: один нашёл OOM — сделал MEMSAVE, другой перед анализом выполнил MEMQUERY и увидел факт. Никаких дублей, одна истина.

Бенчмарки: честные цифры

Тесты проводились через memtier_benchmark на отдельном Ubuntu-сервере.

Throughput (ops/sec)

На строках — 1.36x Redis. На mixed workload — 1.40x. Lux быстрее (1.62x), но без встроенного векторного поиска.

Latency p99 (ms)

Redis быстрее на строках: 3.82 мс против 6.27 мс. Это цена GC-пауз, несмотря на GraalVM. На хэшах и множествах — паритет.

Pipeline scaling

При глубине pipeline 100 — 3.19 млн ops/sec (1.71x Redis). Virtual threads и многопоточность позволяют лучше масштабироваться под пакетной нагрузкой.

Важно: ни один из конкурентов не поддерживает MEMSAVE/MEMQUERY «из коробки». Agentis Memory — единственный, кто совмещает высокую производительность KV-операций и встроенный семантический поиск без внешних зависимостей.

Privacy-first: эмбеддинги остаются внутри

Данные инцидентов — логи, метрики, Slack-переписки — чувствительны. Отправлять их в облако ради эмбеддингов? Нет.

Модель all-MiniLM-L6-v2 работает локально через ONNX Runtime. Никаких API-ключей, задержек, внешних вызовов. Inference за 2–5 мс — быстрее, чем roundtrip в облако.

И это бесплатно. Ноль долларов за миллион операций — критично для внутренних систем.

Итог

Agentis Memory решает реальную проблему: отсутствие общей памяти у AI-агентов. Это не волшебная пуля, но рабочее решение, уже используемое в нескольких проектах: Claude Desktop, Codex, Antigravity и других.

Результат — меньше ошибок, меньше дублирования, выше качество выводов. Проблема автора решена. Возможно, поможет и вам.

Читать оригинал