FalkorDB — графовая база данных на Redis для GraphRAG и памяти агентов

· 2 мин чтения
graph-database rag ai-agents knowledge-graph database
📂 Исходный код на GitHub

Открытая графовая база данных, реализованная как модуль Redis. Хранит граф как разреженные матрицы (GraphBLAS) и выполняет обходы как умножение матриц. Понимает подмножество OpenCypher, поддерживает полнотекстовый и векторный поиск, есть MCP-сервер и интеграции с LangChain и LlamaIndex. Лицензия SSPLv1.

FalkorDB — графовая база данных на Redis для GraphRAG и памяти агентов

FalkorDB — это графовая база данных. Если вы работали только с обычными базами, где данные лежат в строках и таблицах, то разница простая: здесь главное не сами записи, а связи между ними. Данные хранятся как вершины, а связи между вершинами — как рёбра. Такая модель удобна, когда нужно быстро отвечать на вопросы вида «кто с кем связан» и «что ещё связано с этим объектом».

Сам продукт — не ИИ-сервис. Это база данных, которая подходит под задачи ИИ: собрать граф знаний, отдать его модели как контекст, хранить память агента между сессиями. Ниже разберём, что внутри, и покажем, как поднять её за пару минут.

Зачем это разработчику, который пишет код с ИИ

Когда вы собираете приложение на агентах или RAG-систему, рано или поздно появляется один и тот же вопрос: где хранить связи между сущностями. Документы, файлы репозитория, задачи, пользователи, инструменты — всё это связано между собой, и обычная таблица с user_id плохо выражает такие связи. Соединительные таблицы растут, запросы с несколькими JOIN становятся тяжёлыми.

FalkorDB решает это за счёт трёх вещей:

  • Граф вместо таблиц. Связи хранятся прямо в данных, а не восстанавливаются запросами.
  • Redis под капотом. Если у вас уже есть Redis, второй сервис ставить не нужно.
  • Быстрый обход. Проход по связям считается через умножение матриц, а не через перебор записей.

Собственная цель команды разработчиков — построить граф знаний с низкой задержкой, который удобно отдавать большим языковым моделям. Это прямо заявлено в README проекта.

Как устроено хранение

Ключевая идея FalkorDB в том, что граф лежит в памяти как разреженные матрицы. Разреженная матрица — это таблица, в которой заполнено лишь несколько ячеек, а остальные пустые. Именно так выглядит граф: вершин много, а связей между ними по сравнению с вершинами мало.

Каждая связь ставит единицу в нужную ячейку матрицы. Строка матрицы отвечает за вершину-источник, а столбец — за вершину, куда ведёт связь. Для каждого типа связи заводится своя матрица. Плюс есть одна общая матрица, где отмечены все соединения без разбора типа.

Обход через такие матрицы считается обычным умножением. Если нужны друзья друзей, это просто возведение матрицы дружбы в квадрат. Поскольку умножение матриц ассоциативно, движок сам решает, какие части вычислять первыми, чтобы промежуточные матрицы оставались разреженными. Отдельные части можно считать параллельно.

За матрицами стоит библиотека GraphBLAS — стандартный набор операций над разреженными матрицами, аналог BLAS для линейной алгебры. Само текущее ядро репозитория написано на Rust и использует GraphBLAS для хранения и обхода графа.

Отсюда и цифры из документации: добавление связи занимает O(1), больше миллиона вершин создаётся меньше чем за полсекунды, 500 тысяч связей — примерно за 0,3 секунды.

Что нужно, чтобы попробовать

Достаточно одной команды, никакой установки не требуется:

docker run -p 6379:6379 -p 3000:3000 -it --rm -v ./data:/var/lib/falkordb/data falkordb/falkordb

Порт 6379 — сам сервер базы, порт 3000 — веб-интерфейс в браузере. Дальше можно зайти на http://localhost:3000 и посмотреть на данные глазами.

Из консоли Redis запросы отправляются командой GRAPH.QUERY:

$ redis-cli
127.0.0.1:6379> GRAPH.QUERY social "CREATE (:person {name: 'roi', age: 33, gender: 'male'})"

Из Python всё выглядит проще:

from falkordb import FalkorDB

db = FalkorDB(host='localhost', port=6379)

g = db.select_graph('MotoGP')
g.query("""CREATE (:Rider {name:'Valentino Rossi'})-[:rides]->(:Team {name:'Yamaha'}),
           (:Rider {name:'Dani Pedrosa'})-[:rides]->(:Team {name:'Honda'})""")

res = g.query("""MATCH (r:Rider)-[:rides]->(t:Team)
                 WHERE t.name = 'Yamaha'
                 RETURN r.name""")

for row in res.result_set:
    print(row[0])

Официальные клиенты есть для Java, Python, Node.js, Rust, Go и C#. Кроме того, база понимает и Bolt-протокол, поэтому к ней можно подключиться драйверами Neo4j — такая совместимость пока экспериментальная.

Что внутри для работы с ИИ

Язык запросов — подмножество OpenCypher с собственными расширениями. Важно понимать: это не полный Neo4j. Перед использованием стоит заглянуть в раздел известных ограничений.

Поиск в базе есть трёх видов, и для RAG это важно:

  • полнотекстовый — по словам и фразам;
  • векторный — по смыслу, через эмбеддинги;
  • диапазонный — по числам и строкам.

Эмбеддинг здесь — это вектор чисел, в котором близкие по смыслу тексты дают близкие векторы.

Векторный индекс построен на алгоритме HNSW, работает с косинусной мерой или евклидовым расстоянием и поддерживает размерность от 1 до 4096. Создаётся прямо в запросе:

CREATE VECTOR INDEX FOR (p:Product) ON (p.embedding)
OPTIONS {dimension:768, similarityFunction:'cosine', M:32, efConstruction:200}

Поиск идёт отдельной процедурой:

CALL db.idx.vector.queryNodes('Product', 'embedding', 5, vecf32([...])) YIELD node, score

Документация честно предупреждает о цене: миллион векторов по 768 измерений — это около 3 ГБ памяти. И ещё одно ограничение: к векторному поиску нельзя добавить фильтр по свойствам вершины.

Память агента на этой базе

Отдельный большой раздел документации посвящён памяти ИИ-агентов. Логика простая: если агенту нужно помнить, как менялись знания и связи, обычные таблицы не подходят, а граф подходит. Внутри одного экземпляра FalkorDB каждая система памяти живёт в своём графе, поэтому агенты не мешают друг другу.

Документация описывает три готовых решения:

  • Graphiti — граф знаний, который учитывает время. Факты живут в окне срока действия, история изменений не теряется.
  • Cognee — память, где хранилище графов и векторов соединено в одном слое.
  • Mem0 — FalkorDB как графовое хранилище для памяти, с отдельным графом на пользователя.

Для агентов на LangChain есть отдельная интеграция. Она даёт четыре вещи, которые обычно пишут руками:

  • FalkorDBChatMessageHistory — история диалога, у каждой сессии свой граф, переживает перезапуск;
  • FalkorDBSaver — чекпоинтер для LangGraph, сохраняет состояние агента;
  • FalkorDBVector — векторное хранилище с фильтрами и гибридным поиском;
  • FalkorDBQAChain — превращает вопрос на естественном языке в запрос Cypher.

У этой цепочки есть предупреждение. Она выполняет на вашей базе запрос, который написала модель. Поэтому включать её нужно явно, флагом allow_dangerous_requests=True. И только с узкими правами доступа.

MCP-сервер

Для тех, кто работает в Claude Desktop или Cursor, у FalkorDB есть свой MCP-сервер в отдельном репозитории. Он умеет:

  • выполнять запросы OpenCypher, в том числе в режиме только для чтения;
  • создавать вершины и связи;
  • показывать список графов и их содержимое.

Работает через stdio (по умолчанию) и через HTTP с необязательной проверкой ключа. Режим только для чтения включается переменной FALKORDB_DEFAULT_READONLY=true — это то, что стоит поставить на реплики и в продакшен.

Честно об ограничениях

  • Лицензия SSPLv1, а не Apache и не MIT. Для некоторых компаний это препятствие — проверьте заранее.
  • Это подмножество OpenCypher. Код для Neo4j может потребовать правок.
  • Данные живут в оперативной памяти. Есть сохранение на диск, но память всё равно основное хранилище.
  • Векторные индексы требуют много памяти и не работают вместе с фильтрами по свойствам.
  • Поддержка Bolt для драйверов Neo4j пока экспериментальная.

FalkorDB — продолжение RedisGraph от той же команды. RedisGraph закрыт 31 января 2025 года, и если у вас он остался, для перехода есть отдельная инструкция.

Полезные ссылки

Источник: https://github.com/FalkorDB/FalkorDB