Графы знаний и темпоральные графы: дайджест @kdoronin_blog

Сборка по постам Кости Доронина (канал @kdoronin_blog) за июль 2025 — май 2026. 26 постов про Graphiti, Hindsight, Mem0 и темпоральные графы как слой памяти AI-агентов.


TL;DR


Что такое темпоральный граф

«Темпоральный граф — это граф, рёбра которого имеют привязку ко времени. Это отличное решение, когда нужно проанализировать взаимоотношения между сущностями и изменения этих отношений во времени» (пост от 5 января 2026)

Главное отличие от обычного графа знаний / GraphRAG: сохраняется не только «кто с чем связан», но и полная история связи. Если факт «директор X = Иванов» сменился на «директор X = Петров» — старое ребро не удаляется, а помечается невалидным с конкретной датой. Можно спросить графу «а кто был директором в марте 2025?» — и получить честный ответ.

Костин тезис из вводного поста:

«Люди — существа непостоянные. У них постоянно всё меняется. Особенно что касается отношений к товарам, услугам и компаниям. Graphiti предлагает сохранять не только статические данные в графах знаний, но также привязывать их к конкретному моменту времени.»


Стек 1: Graphiti (Zep)

Что это технически

Дефолтные модели (можно поменять)

Модель
Эмбеддинги text-embedding-3-small
Основная LLM gpt-4o-mini
Вспомогательная gpt-4o-nano

На эксперименте Кости (55 сообщений из TG) — потратилось ~$0.5 на API, граф вышел 112 сущностей + 89 продвинутых связей.

Скорость

«Добавление одного эпизода занимает, в среднем, 10–15 секунд. Это обязательно стоит учитывать, когда система поставляет больше, чем 4–7 эпизодов в минуту.»

Чем «сложнее» эпизод (больше потенциальных сущностей) — тем дольше его добавление.

Как ускорить

Две техники из поста про оптимизацию:

  1. Bulk-операция — пачкой. Минус: не перестраивает связи между узлами, годится только для первичной загрузки.
  2. Параллельный runtime через env:
    USE_PARALLEL_RUNTIME=true
    SEMAPHORE_LIMIT=10
    У Кости с SEMAPHORE_LIMIT=30 загрузилось 485 эпизодов за 8 минут. Подводный камень: эпизоды, обработанные параллельно, не связываются между собой — не отправляйте одновременно связанные эпизоды.

Кастомные сущности через Pydantic

По умолчанию Graphiti сам решает, какие сущности извлекать. Но можно заранее погрузить его в предметную область:

  1. Определить кастомные типы узлов через Pydantic.
  2. Определить кастомные типы связей.
  3. Указать, между какими узлами какие связи возможны.
  4. У сущностей и у связей могут быть свои поля.

Жёсткий лимит: максимум 10 кастомных сущностей на граф. Костин обход — заводить «кастомные эпизоды» на уровне приложения, каждый со своим набором Pydantic-схем (10 сущностей на эпизод).

Три способа извлечения данных

Через параметр source=EpisodeType.*:

  1. plain_text — любой неструктурированный текст. Худший вариант, режет качество.
  2. message — сообщение в диалоге. Норм.
  3. json — структурированные данные. Лучший вариант, процесс становится предсказуемым.

«Использовать plain text стоит только в крайних случаях.»


Стек 2: Hindsight

Open Source, ставится из docker одной командой. Достаточно положить API-ключ OpenAI (или поднять на локальных моделях).

Четыре типа памяти:

  1. Факты о мире — из документов, которые загружает пользователь.
  2. Опыт агента — что агент делал, какие давал рекомендации.
  3. Мнения — суждения агента с показателем уверенности 0..1. Чем ниже — тем выше шанс пересмотра.
  4. Наблюдения — сводки о сущностях, формирует в фоне.

«Модель достаточно быстро формирует записи в графе. 1000+ воспоминаний загрузились буквально за пару минут. Что достаточно быстро для темпорального графа.»

Минусы:


Graphiti vs Hindsight: что выбрать

Критерий Graphiti Hindsight
Старт Нужно понимать архитектуру Установка + настройка 10–15 мин
Кастомизация Глубокая (group_id, Pydantic, batch) Почти отсутствует
Документация Хорошая Никакой
Из коробки даёт Базис, аналог графа World facts Готовую 4-слойную систему памяти
Когда брать Знаешь, что делаешь, нужен прод Хочешь пощупать темпоральный граф

«А всем, кто только начинает взаимодействие с темпоральными графами и хочет понять преимущества от хранения данных таким образом, я советую выбрать Hindsight. Установка + настройка за 10–15 минут и уже можно работать.»

Костя в итоге использует оба.


Стек 3: Mem0 — почему НЕ темпоральный граф

Mem0 специализируется на векторной памяти (Qdrant и т.п.). Граф — как вспомогательная структура.

Костин кейс:

  1. «Я живу в стране X» → сохраняет «пользователь живёт в X».
  2. «Я живу в городе N» → сохраняет «пользователь живёт в N». Новое ребро.
  3. «До Y года я жил в M» → сохраняет «пользователь живёт в M», удаляя при этом связи из п.1 и п.2.

Итог: два важных узла, висящих без связей. Mem0 даёт AI-агенту право удалять рёбра — и мусор копится.

В Graphiti того же сценария нет: даже если факт записан ошибочно, можно сказать «нет, на самом деле так» — и Graphiti просто пометит старое ребро как невалидное.


Кейсы применения в бизнесе

Кейс 1. Память о клиентах (база)

«Чем больше вы знаете о клиентах и их взаимоотношениях с вашим брендом и товарами, тем лучше вы понимаете, как ваш бизнес может ему помочь.»

Векторная БД схлопывает клиента в плоский снапшот. Темпоральный граф хранит динамику: предпочтения менялись, статус менялся, отношения менялись.

Кейс 2. Анализ отзывов → стратегия и roadmap

Кейс подписчицы Марии (4 октября 2025). Парсинг отзывов с Wildberries → JSON → Graphiti.

Итог графа: 758 узлов, 2126 связей.

Через Cursor + MCP-сервер Graphiti сформировано 8 отчётов:

  1. Анализ Клиентского Опыта
  2. Анализ Качества Продукта и Упаковки
  3. Анализ Клиентского Сервиса и Взаимодействия с Покупателями
  4. Временной Анализ и Эволюция Отзывов
  5. Анализ Сетевых Связей и Взаимоотношений в Экосистеме Отзывов
  6. Стратегические Инсайты и Общие Рекомендации
  7. Дорожная Карта Развития Бизнеса
  8. Стратегия Запуска Новой Линейки Продуктов

Без ручной разметки сущностей — Graphiti сам выделил из отзывов всё нужное.

Кейс 3. Память о коде / проекте

Авторы Zep сами выложили шаблон: Cursor + MCP-сервер Graphiti + готовые Cursor Rules.

Результат — память о проекте и всех изменениях, которые в нём происходили. В любой момент можно спросить графу: «Кто, зачем и когда добавил этот метод?» — и получить ответ.

Запуск:

  1. Установить Graphiti.
  2. Запустить MCP-сервер.
  3. Подключить Cursor Rules от Zep.

Кейс 4. Структурированное + неструктурированное (главный практический паттерн)

«Для получения наибольшего эффекта от использования Graphiti, нужно использовать данные по схеме структурированные + неструктурированные данные (события)

Пример из поста. Собираем данные об изменениях в топ-менеджменте компаний — это структурированный костяк (сущности «компания», «должность», «сотрудник», рёбра со временем начала/окончания). Поверх доливаем неструктурированные эпизоды:

Что вскрывается: на какие события влияет конкретное назначение, как кадровые перестановки меняют инфополитику.

Кейс 5. Финансы / политика (arxiv-исследование, февраль 2026)

Исследователи Национального университета Тайваня построили темпоральный граф GAP-TGN:

Проанализировали 32 401 сделку + 1.6 млн отчётов о лоббировании + 26 млн голосований.

Что нашли:

  1. Члены комитетов по обороне торговали акциями оборонных подрядчиков в моменты геополитического обострения.
  2. Топ-политики дают аномальную доходность 47% годовых (примерно ×10 от нормальной).
  3. По положению политика в графе можно предсказывать прибыльные сделки на горизонте двух лет.

Иллюстрация, что темпоральный граф вскрывает связи, недоступные плоской аналитике.

Кейс 6. Индивидуализация ответов для пользователя

«Графы с рёбрами, привязанными ко времени, позволяют формировать долгосрочный динамический индивидуальный контекст. А индивидуальный подход от AI-агента — отличный способ повысить частоту пользования инструментом.»

Поверх общей базы знаний — индивидуальный темпоральный граф на каждого юзера. Hindsight из коробки заточен на эту «эмоциональность» и индивидуальность ответов.


Подводные камни (важно перед прод-внедрением)

1. Дорого по API

В Костином эксперименте — $0.5 на 55 сообщений. На реальном продакшене нужно считать в десятках и сотнях долларов в день, особенно с дефолтными OpenAI-моделями. Альтернативы: китайские модели (Kimi, Deepseek), локальные модели.

2. Медленно — 10–15 сек на эпизод

Не подходит для систем с большим количеством одновременных событий без специальной обработки (bulk / параллельный runtime).

3. LLM додумывает год

«В натуральном общении мы очень редко указываем дату и год, когда событие произошло. И именно год LLM додумает самостоятельно. В своём уникальном стиле. То есть не всегда правильно.»

Что делать: для архивов и реальных бизнес-данных писать кастомный загрузчик с явным полем event_date отдельно от ingestion_date.

4. Загрузка архива «как есть»

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

5. Лимит 10 кастомных сущностей

Если домен сложнее — заводить «кастомные эпизоды» на уровне приложения и для каждого свой набор Pydantic-сущностей.

6. Параллельные эпизоды не связываются

С SEMAPHORE_LIMIT > 1 Graphiti не строит связи между эпизодами, обрабатываемыми параллельно. Не отправляйте одновременно сильно связанные эпизоды.

7. MCP-сервер Graphiti не умеет листать group_id

Без явно переданного group_id MCP-сервер не отдаёт данные из графа в принципе. Это нужно учитывать в архитектуре.


Костина рекомендуемая архитектура для версионирования фактов

Найдена в одной из статей, переложена в Graphiti-сущности.

Сущности:

Сущность Что хранит
Episode Стандарт Graphiti, всё входящее
Event Конкретное событие внутри эпизода: время, участники
Fact Ключ факта (идентификатор смысла — «о чём факт?»)
FactVersion Версия факта: timestamp, значение, confidence (0..1), TTL
Source / Evidence Источник с полем weight (авторитетность)

Связи:

(Episode) -[:CONTAINS]-> (Event)
(Event)   -[:REFERENCES]-> (Fact)
(Fact)    -[:HAS_VERSION]-> (FactVersion)
(Fact)    -[:LATEST]-> (FactVersion)
(FactVersion) -[:SUPPORTED_BY]-> (Source)

Что это даёт:

  1. Объяснимые ответы — каждый факт с указанием источника.
  2. Контроль версий — отслеживаем, как факт менялся во времени.
  3. Приоритет свежих и авторитетных — комбинируем confidence × weight источника × затухание по времени × TTL.
  4. Если на момент «сейчас» даже LATEST-версия устарела — факт не учитывается.

Идея на будущее: автоадаптация Graphiti к домену

Костин концепт «как обойти лимит 10 сущностей и не описывать домен вручную»:

  1. Из эпизода извлекаем сырые сущности (как сейчас).
  2. Пробуем соотнести с существующими типами в доменной схеме.
  3. Если не вышло — кидаем в реестр кандидатов.
  4. Накапливаем «поддержку» — сколько эпизодов завязано на сущность этого типа.
  5. При достижении порога X — добавляем тип в доменную схему, создаём custom type для Graphiti.
  6. Remapping старых эпизодов на новый тип.
  7. В промпте для новых эпизодов — обновлённая доменная схема.

«Выглядит так, как будто пора создавать форк Graphiti с автоматической адаптацией к любому домену.»


Костин пайплайн отбора инструментов

Как Костя решает, что брать в арсенал:

  1. Раз в неделю через ChatGPT ищет публикации последней недели по теме «темпоральные графы как память для AI-агентов».
  2. Отбирает по заголовку и введению то, что бьётся с текущими задачами.
  3. Изучает глубже — обычно через NotebookLM с вопросами к документу.
  4. Если есть код на github — разворачивает и проверяет в связке с AI-агентами.
  5. Если жизнеспособно — забирает в арсенал.

«Из фреймворков с кодом прошли отбор только Graphiti и Hindsight

Критерий «не брать»: проект, теоретический фреймворк которого обновился один раз — на init-коммите. Это значит, сообщество идею не поддержало (DyG-RAG, HippoRAG — примеры мёртвых).


Полный список постов (для самостоятельного чтения)

ID Дата Тема
867 2025-07-27 Вводный пост про Graphiti
875 2025-07-31 Graphiti + Neo4j + MCP-сервер
886 2025-08-06 Анонс TG-бот эксперимента
890 2025-08-10 Результаты эксперимента (модели, цены)
892 2025-08-12 Анализ графа через Goose + Claude 4 Sonnet
918 2025-08-31 Pydantic-схемы для кастомных сущностей
946 2025-09-13 Память о коде через Cursor + MCP Graphiti
984 2025-09-29 Скорость добавления эпизодов
992 2025-10-04 Кейс Марии: отзывы WB → 8 отчётов и стратегия
1012 2025-10-16 Структурированное + неструктурированное (паттерн)
1016 2025-10-20 Ускорение через bulk и параллельный runtime
1019 2025-10-23 «Концентрат. Часть 3» — сборник по Graphiti
1128 2026-01-02 Hindsight — обзор и 4 типа памяти
1131 2026-01-05 Время как преимущество и подвох
1141 2026-01-10 Graphiti vs Hindsight
1148 2026-01-17 Три способа извлечения данных
1159 2026-01-29 Темпоральные графы для индивидуализации
1167 2026-02-05 Архитектура версионирования фактов
1169 2026-02-07 Кейс Конгресса США (GAP-TGN, arxiv)
1172 2026-02-10 Источники информации + личный пайплайн отбора
1186 2026-02-23 Концепт автоадаптации Graphiti к домену
1218 2026-03-18 Как покрыть домен через кастомные эпизоды (обход лимита 10)
1229 2026-03-23 Mem0 и почему она не темпоральная

С чего начать знакомство

Минимальное чтение, чтобы войти в тему:

  1. 867 — что такое Graphiti и зачем
  2. 1012 — главный практический паттерн «structured + unstructured»
  3. 1131 — почему время это сложно
  4. 1141 — Graphiti vs Hindsight, как выбрать стартовую точку
  5. 992 — живой кейс с WB-отзывами

Если готов руками щупать:


Дайджест собран автоматически из публичных постов канала. Все цитаты приведены дословно. Канал автора: @kdoronin_blog.