Сборка по постам Кости Доронина (канал @kdoronin_blog) за июль 2025 — май 2026. 26 постов про Graphiti, Hindsight, Mem0 и темпоральные графы как слой памяти AI-агентов.
«Темпоральный граф — это граф, рёбра которого имеют привязку ко времени. Это отличное решение, когда нужно проанализировать взаимоотношения между сущностями и изменения этих отношений во времени» (пост от 5 января 2026)
Главное отличие от обычного графа знаний / GraphRAG: сохраняется не только «кто с чем связан», но и полная история связи. Если факт «директор X = Иванов» сменился на «директор X = Петров» — старое ребро не удаляется, а помечается невалидным с конкретной датой. Можно спросить графу «а кто был директором в марте 2025?» — и получить честный ответ.
Костин тезис из вводного поста:
«Люди — существа непостоянные. У них постоянно всё меняется. Особенно что касается отношений к товарам, услугам и компаниям. Graphiti предлагает сохранять не только статические данные в графах знаний, но также привязывать их к конкретному моменту времени.»
Episode (входящие
события, что подаём в граф) и Entity
(сущности, которые LLM выделяет сама).MENTIONS
(эпизод → сущность) и RELATES_TO (между
сущностями).| Модель | |
|---|---|
| Эмбеддинги | text-embedding-3-small |
| Основная LLM | gpt-4o-mini |
| Вспомогательная | gpt-4o-nano |
На эксперименте Кости (55 сообщений из TG) — потратилось ~$0.5 на API, граф вышел 112 сущностей + 89 продвинутых связей.
«Добавление одного эпизода занимает, в среднем, 10–15 секунд. Это обязательно стоит учитывать, когда система поставляет больше, чем 4–7 эпизодов в минуту.»
Чем «сложнее» эпизод (больше потенциальных сущностей) — тем дольше его добавление.
Две техники из поста про оптимизацию:
USE_PARALLEL_RUNTIME=true
SEMAPHORE_LIMIT=10
У Кости с SEMAPHORE_LIMIT=30 загрузилось 485
эпизодов за 8 минут. Подводный камень: эпизоды, обработанные
параллельно, не связываются между собой — не
отправляйте одновременно связанные эпизоды.По умолчанию Graphiti сам решает, какие сущности извлекать. Но можно заранее погрузить его в предметную область:
Жёсткий лимит: максимум 10 кастомных сущностей на граф. Костин обход — заводить «кастомные эпизоды» на уровне приложения, каждый со своим набором Pydantic-схем (10 сущностей на эпизод).
Через параметр source=EpisodeType.*:
plain_text — любой неструктурированный
текст. Худший вариант, режет качество.message — сообщение в диалоге.
Норм.json — структурированные данные.
Лучший вариант, процесс становится предсказуемым.«Использовать plain text стоит только в крайних случаях.»
Open Source, ставится из docker одной командой. Достаточно положить API-ключ OpenAI (или поднять на локальных моделях).
Четыре типа памяти:
«Модель достаточно быстро формирует записи в графе. 1000+ воспоминаний загрузились буквально за пару минут. Что достаточно быстро для темпорального графа.»
Минусы:
| Критерий | Graphiti | Hindsight |
|---|---|---|
| Старт | Нужно понимать архитектуру | Установка + настройка 10–15 мин |
| Кастомизация | Глубокая (group_id, Pydantic, batch) | Почти отсутствует |
| Документация | Хорошая | Никакой |
| Из коробки даёт | Базис, аналог графа World facts |
Готовую 4-слойную систему памяти |
| Когда брать | Знаешь, что делаешь, нужен прод | Хочешь пощупать темпоральный граф |
«А всем, кто только начинает взаимодействие с темпоральными графами и хочет понять преимущества от хранения данных таким образом, я советую выбрать Hindsight. Установка + настройка за 10–15 минут и уже можно работать.»
Костя в итоге использует оба.
Mem0 специализируется на векторной памяти (Qdrant и т.п.). Граф — как вспомогательная структура.
Костин кейс:
Итог: два важных узла, висящих без связей. Mem0 даёт AI-агенту право удалять рёбра — и мусор копится.
В Graphiti того же сценария нет: даже если факт записан ошибочно, можно сказать «нет, на самом деле так» — и Graphiti просто пометит старое ребро как невалидное.
«Чем больше вы знаете о клиентах и их взаимоотношениях с вашим брендом и товарами, тем лучше вы понимаете, как ваш бизнес может ему помочь.»
Векторная БД схлопывает клиента в плоский снапшот. Темпоральный граф хранит динамику: предпочтения менялись, статус менялся, отношения менялись.
Кейс подписчицы Марии (4 октября 2025). Парсинг отзывов с Wildberries → JSON → Graphiti.
Итог графа: 758 узлов, 2126 связей.
Через Cursor + MCP-сервер Graphiti сформировано 8 отчётов:
Без ручной разметки сущностей — Graphiti сам выделил из отзывов всё нужное.
Авторы Zep сами выложили шаблон: Cursor + MCP-сервер Graphiti + готовые Cursor Rules.
Результат — память о проекте и всех изменениях, которые в нём происходили. В любой момент можно спросить графу: «Кто, зачем и когда добавил этот метод?» — и получить ответ.
Запуск:
«Для получения наибольшего эффекта от использования Graphiti, нужно использовать данные по схеме структурированные + неструктурированные данные (события).»
Пример из поста. Собираем данные об изменениях в топ-менеджменте компаний — это структурированный костяк (сущности «компания», «должность», «сотрудник», рёбра со временем начала/окончания). Поверх доливаем неструктурированные эпизоды:
Что вскрывается: на какие события влияет конкретное назначение, как кадровые перестановки меняют инфополитику.
Исследователи Национального университета Тайваня построили темпоральный граф GAP-TGN:
Проанализировали 32 401 сделку + 1.6 млн отчётов о лоббировании + 26 млн голосований.
Что нашли:
Иллюстрация, что темпоральный граф вскрывает связи, недоступные плоской аналитике.
«Графы с рёбрами, привязанными ко времени, позволяют формировать долгосрочный динамический индивидуальный контекст. А индивидуальный подход от AI-агента — отличный способ повысить частоту пользования инструментом.»
Поверх общей базы знаний — индивидуальный темпоральный граф на каждого юзера. Hindsight из коробки заточен на эту «эмоциональность» и индивидуальность ответов.
В Костином эксперименте — $0.5 на 55 сообщений. На реальном продакшене нужно считать в десятках и сотнях долларов в день, особенно с дефолтными OpenAI-моделями. Альтернативы: китайские модели (Kimi, Deepseek), локальные модели.
Не подходит для систем с большим количеством одновременных событий без специальной обработки (bulk / параллельный runtime).
«В натуральном общении мы очень редко указываем дату и год, когда событие произошло. И именно год LLM додумает самостоятельно. В своём уникальном стиле. То есть не всегда правильно.»
Что делать: для архивов и реальных бизнес-данных
писать кастомный загрузчик с явным полем
event_date отдельно от ingestion_date.
Дефолтный загрузчик считает, что все архивные события произошли в момент загрузки. Это почти всегда не так. Снова — кастомный пайплайн.
Если домен сложнее — заводить «кастомные эпизоды» на уровне приложения и для каждого свой набор Pydantic-сущностей.
С SEMAPHORE_LIMIT > 1 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)
Что это даёт:
confidence × weight источника × затухание по
времени × TTL.LATEST-версия устарела —
факт не учитывается.Костин концепт «как обойти лимит 10 сущностей и не описывать домен вручную»:
«Выглядит так, как будто пора создавать форк Graphiti с автоматической адаптацией к любому домену.»
Как Костя решает, что брать в арсенал:
«Из фреймворков с кодом прошли отбор только 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 и почему она не темпоральная |
Минимальное чтение, чтобы войти в тему:
Если готов руками щупать:
Дайджест собран автоматически из публичных постов канала. Все цитаты приведены дословно. Канал автора: @kdoronin_blog.