
Память агентного ИИ с затуханием по кривой забывания Эббингауза. +16pp лучше запоминания, чем Mem0 на LoCoMo.

Постоянная, само-улучшающаяся память для AI-агентов — построенная на науке о том, как люди запоминают.
Каждое утро ваш AI-агент ведёт себя так, будто видит вас впервые. Один и тот же контекст объясняется заново. Одни и те же предпочтения забываются. Каждый сеанс начинается с нуля.
Большинство инструментов «памяти» просто прикручивают векторную базу данных к агенту и называют это готовым решением — но это всего лишь хранилище. Оно накапливает почти дублирующуюся информацию, пока поиск не утонет в шуме. Золотая рыбка с большей миской.
YourMemory — это иное: память, работающая как мозг, а не как база данных.
flowchart LR
A["🧠 Вы говорите<br/>своему ИИ"] --> B["Извлечь устойчивые<br/>факты"]
B --> C["Дедупликация + эмбеддинг<br/>+ графовые связи"]
C --> D[("Хранилище<br/>памяти")]
D -->|"родственные факты накапливаются"| E["✨ Консолидация<br/>N → 1 сводка"]
D -->|"устаревшие+неиспользуемые"| F["📉 Затухание<br/>+ обрезка"]
D -->|"новый сеанс"| G["♻️ Воспроизведение<br/>гибрид + граф"]
E --> D
G --> H["🤖 Ваш агент<br/>продолжает с того<br/>места, где остановился"]
style D fill:#0a2540,stroke:#19cdff,color:#fff
style E fill:#0c2b3a,stroke:#5eead4,color:#fff
style H fill:#0c2b3a,stroke:#19cdff,color:#fff
Одна команда для установки. DuckDB по умолчанию (без настройки), Postgres + pgvector для команд.
Три внешних набора данных. Каждое число можно независимо воспроизвести — код бенчмарков в репозитории. Полная методология в BENCHMARKS.md.
xychart-beta
title "Recall@5 · LoCoMo-10 (чем выше, тем лучше)"
x-axis ["Mem0", "Zep Cloud", "Supermemory", "YourMemory"]
y-axis "Recall@5 percent" 0 --> 70
bar [18, 28, 31, 59]
Качество воспроизведения в 2 раза выше, чем у Zep Cloud по всем 10 выборкам. *Supermemory и Mem0 исчерпали квоты бесплатного тарифа в середине бенчмарка; показатели вычислены по всем 1 534 парам.
Самый сложный стандартный бенчмарк для долгосрочной памяти. Каждый вопрос «зарыт» в ~53 сеансах.
| Показатель | Результат |
|---|---|
| Recall@5 (любой релевантный сеанс в топ-5) | 89.4% |
| Recall-all@5 (все релевантные сеансы в топ-5) | 84.8% |
| nDCG@5 (качество ранжирования) | 87.4% |
| Система | BOTH_FOUND@5 |
|---|---|
| YourMemory (вектор + BM25 + граф сущностей) | 71.5% |
| YourMemory (без графовых связей) | 59.5% |
Графовые связи добавляют +12 процентных пунктов — они переходят от факта 1 к факту 2, даже если эмбеддинговое сходство факта 2 с запросом невелико.
Статья: Я построил затухание памяти для AI-агентов на основе кривой забывания Эббингауза
Python 3.11–3.14. Не требуется Docker или настройка базы данных. Вся память хранится локально в ~/.yourmemory/.
pip install yourmemory
yourmemory-register <your-token>
yourmemory-setup
Получите ваш токен: посетите yourmemoryai.xyz → введите email → подтвердите 6-значным кодом → скопируйте токен.
yourmemory-setup автоматически обнаруживает и настраивает Claude Code, Claude Desktop, Cursor, Windsurf и Cline, затем спрашивает, какой бэкенд использовать:
DATABASE_URL (нужно расширение pgvector)Опционально — более интеллектуальное локальное извлечение: YourMemory работает из коробки со встроенными эвристиками. Для более качественного, полностью локального извлечения фактов установите Ollama —
yourmemory-setupзагрузит модель (qwen2.5:7b, ~4,7 ГБ) автоматически. Предпочитаете облако? УстановитеYOURMEMORY_EXTRACT_BACKEND=anthropic.
Не хотите возиться с pip? Загрузите готовый бинарник для вашей платформы из последнего релиза:
| Платформа | Файл |
|---|---|
| macOS (Apple Silicon) | yourmemory-macos-arm64.tar.gz |
| macOS (Intel) | yourmemory-macos-x86_64.tar.gz |
# macOS / Linux — скачать, распаковать, запустить
tar -xzf yourmemory-macos-arm64.tar.gz
./yourmemory-macos-arm64 register <your-token>
./yourmemory-macos-arm64 setup
./yourmemory-macos-arm64 # запустить сервер
Один исполняемый файл обрабатывает все команды: register, setup, ask "<question>", path и (без аргументов) запускает сервер.
Полностью самодостаточен и работает офлайн — бинарник содержит Python, все зависимости и обе ML-модели (модель эмбеддингов + spaCy). Ничего не загружается при первом запуске. Платой за это является размер (~2 ГБ). Соберите свой собственный одной командой — ./build-binary.sh — а многоплатформенные релизные бинарники создаются автоматически рабочим процессом сборки.
YourMemory рассматривает память как живую систему — она растёт, консолидируется, забывает и соединяется, как мозг.
Большинство инструментов памяти просто продолжают расти. YourMemory отслеживает кластеры связанных фактов и, когда их накапливается достаточно, сжимает их в одну чистую сводку, архивируя оригиналы (никогда не удаляет, так что ничего не теряется).
flowchart LR
subgraph before [Связанные факты накапливаются]
A1["Railway использует Nixpacks"]
A2["Railway на Pro плане"]
A3["Переменные окружения Railway содержат URL Postgres"]
A4["Развёртывается на Railway с Postgres"]
end
before --> C{"кластеризация +<br/>LLM суммаризация"}
C --> S["✨ Сводка<br/>Развёртывается на Railway (Pro,<br/>Nixpacks) с Postgres<br/>через переменные окружения"]
C -.->|"архивировано, можно восстановить"| ARC[("архив")]
style S fill:#0a2540,stroke:#5eead4,color:#fff
style C fill:#0c2b3a,stroke:#19cdff,color:#fff
Реальный пример из одного продакшен-хранилища: 444 воспоминания → 16 сводок — те же знания, а шума гораздо меньше. Консолидация событийно-управляемая (запускается, когда накапливаются связанные воспоминания), а не слепая ночная задача.
Сила памяти затухает экспоненциально. Важность и частота воспроизведения замедляют это затухание:
effective_λ = base_λ × (1 − importance × 0.8)
strength = clamp(importance × e^(−effective_λ × active_days) × (1 + recall_count × 0.2), 0, 1)
active_days учитывает только дни, когда вы были активны — отпуск не вызывает потерю памяти. Воспоминания с силой ниже 0.05 автоматически обрезаются. Каждая категория имеет свою скорость старения:
Обрезка с учётом графа: затухающее воспоминание сохраняется, если какой-либо его сосед по графу всё ещё силён — нагрузочный контекст выживает, даже если его редко запрашивают напрямую.
Воспроизведение проходит в два раунда, чтобы выявить как то, о чём вы спросили, так и то, о чём вы забыли спросить:
flowchart LR
Q["запрос"] --> R1["Гибридный поиск<br/>Vector + BM25"]
R1 --> R2["Расширение по графу<br/>(то, о чём вы забыли спросить)"]
R2 --> S["ранжирование по<br/>сходству × силе"]
S --> OUT["🎯 Ранжированные воспоминания"]
style OUT fill:#0a2540,stroke:#19cdff,color:#fff
Дедупликация с учётом субъекта выполняется перед каждым сохранением — она встраивает субъект каждого предложения, так что "Sachit использует DuckDB" и "YourMemory использует DuckDB" остаются раздельными (разные сущности), а "YourMemory использует DuckDB" и "YourMemory хранит данные в DuckDB" объединяются (та же сущность). Нет жёстко заданных списков слов; работает для любого языка.
Предприятия не позволят непрозрачному чёрному ящику хранить их данные. Поэтому каждая операция — чтение, запись, обновление, удаление, консолидация — добавляется в хэш-сцеплённый, защищённый от подделки журнал аудита.
flowchart LR
E0["GENESIS"] --> E1
subgraph E1 [Событие 1]
H1["row_hash =<br/>sha256(prev + data)"]
end
E1 --> E2
subgraph E2 [Событие 2]
H2["row_hash =<br/>sha256(#1.hash + data)"]
end
E2 --> E3
subgraph E3 [Событие 3]
H3["row_hash =<br/>sha256(#2.hash + data)"]
end
E3 --> V{"GET /audit/verify"}
V -->|цепочка цела| OK["✅ проверено"]
V -->|любая строка изменена| BAD["❌ цепочка разорвана<br/>на этой строке"]
style OK fill:#0a2540,stroke:#5eead4,color:#fff
style BAD fill:#3a0c14,stroke:#fb7185,color:#fff
Каждая строка содержит временную метку, пользователя-агента, действие, операцию, целевую память, источник (http или mcp) и хэш предыдущей строки. Измените любую историческую запись — и verify_chain() укажет точное место разрыва цепочки.
GET /audit # просмотр журнала (фильтр по пользователю / действию / операции)
GET /audit/verify # криптографическая проверка целостности цепочки
POST /audit/prune # очистка на основе хранения (минимум 90 дней, не меньше)
Журналирование аудита работает по принципу «fail-open» — оно никогда не блокирует операции с памятью — а события чтения/списка из собственного цикла рендеринга панели управления исключены, чтобы журнал оставался сигналом, а не шумом.
Дайте агентам всей команды один общий мозг — без утечки чьего-либо приватного контекста. Воспоминания могут быть общими (видны всему пулу) или приватными (видны только владельцу).
flowchart TB
P(("🧠 Командный пул<br/>общая память"))
A["Агент Алисы"] <-->|shared| P
B["Агент Боба"] <-->|shared| P
C["Агент Кэрол"] <-->|shared| P
A -. private .-> AP["🔒 Только Алиса"]
B -. private .-> BP["🔒 Только Боб"]
style P fill:#0a2540,stroke:#19cdff,color:#fff
style AP fill:#0c1424,stroke:#5a6b80,color:#8294a8
style BP fill:#0c1424,stroke:#5a6b80,color:#8294a8
Доступ на основе ролей обеспечивается для каждого агента — то, что узнаёт агент одного инженера, мгновенно становится доступным всей команде; конфиденциальный контекст остаётся в пределах владельца.
POST /pools # создать пул
POST /pools/{id}/members # добавить участника (с ролью)
POST /pools/{id}/memories # внести общее воспоминание
POST /pools/{id}/retrieve # воспроизвести по всему пулу
Поскольку память, хранящая реальные данные, нуждается в контролях, чтобы ей можно было доверять:
В сочетании с хэш-сцеплённой цепочкой аудита и минимальным сроком хранения 90 дней это напрямую соответствует контролям, описанным в SECURITY.md (SOC 2).
Две встроенные браузерные панели — не требуют дополнительной настройки, запускаются автоматически вместе с сервером.
http://localhost:3033/uiПолный интерфейс чтения/записи с вкладками Memories · Audit · Pools: статистическая панель (Strong / Fading / Near-prune), вкладки для каждого агента, карточки воспоминаний с живыми индикаторами силы, фильтры по категориям, журнал аудита и управление пулами.
http://localhost:3033/graphИнтерактивная силовая карта связей между воспоминаниями — корневое воспоминание выделено ярким узлом, соседи раскрашены по категориям, толщина рёбер = сила связи. Перетаскивайте, масштабируйте, кликайте по узлу, чтобы увидеть полное содержимое.
http://localhost:3033/graph?memoryId=42&userId=alex&depth=2
Три инструмента, которые ваш ИИ вызывает автоматически.
# Сохранение с пространственным контекстом
store_memory(
"Alex предпочитает табуляцию пробелам в Python",
importance=0.9, category="fact",
context_paths=["/projects/backend"],
)
# Следующий сеанс — пространственное ускорение срабатывает при работе в этом каталоге
recall_memory("форматирование Python", current_path="/projects/backend")
# → {"content": "Alex предпочитает табуляцию пробелам в Python", "strength": 0.87}
Единственная система памяти, которая может отвечать на вопросы без единого вызова LLM API:
yourmemory ask "какую базу данных использует этот проект"
# → YourMemory использует DuckDB локально и Postgres в продакшене.
yourmemory ask "как исправить развёртывание kubernetes"
# → Недостаточно контекста в памяти, чтобы ответить без LLM.
Когда память достаточно сильна, ответ приходит мгновенно — ноль токенов, ноль затрат на облако, нулевая задержка. Когда нет — система честно отказывается, а не галлюцинирует. Ваш запрос никогда не покидает ваше устройство.
MCP-инструменты вызываются по усмотрению ИИ. API-прокси устраняет эту неопределённость — он перехватывает каждый вызов LLM, автоматически вставляет релевантные воспоминания и обрабатывает store_memory / update_memory без какой-либо настройки модели.
Запустите сервер (yourmemory), затем укажите клиенту localhost:3033:
from anthropic import Anthropic
client = Anthropic(
api_key="sk-ant-...",
base_url="http://localhost:3033/proxy/anthropic",
default_headers={"X-YourMemory-User": "alex"}, # память для каждого пользователя
)
# Память вставляется автоматически — никаких других изменений не требуется
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{"role": "user", "content": "Какую базу данных я использую?"}],
)
OpenAI работает аналогично через base_url="http://localhost:3033/proxy/openai".
flowchart LR
C["Ваш AI-клиент<br/>Claude · Cursor · любой MCP"] <--> Y["🧠 YourMemory"]
Y --> M[("Хранилище<br/>памяти")]
Y --> A[("Реестр<br/>аудита")]
style Y fill:#0a2540,stroke:#19cdff,color:#fff
style M fill:#0c1a2c,stroke:#5eead4,color:#fff
style A fill:#0c1a2c,stroke:#5eead4,color:#fff
Зависание / тайм-ауты при записи (блокировка записи DuckDB). Если MCP-сервер и HTTP-сервер запущены одновременно, они конкурируют за блокировку записи DuckDB. Исправление:
pkill -f yourmemory 2>/dev/null || true
rm -f ~/.yourmemory/memories.duckdb.wal ~/.yourmemory/memories.duckdb.lock 2>/dev/null || true
# перезапустите клиент
Используете одновременно Claude Desktop (MCP) и Claude Code (хуки)? Вместо этого используйте SQLite — он чисто обрабатывает одновременных читателей/писателей:
DATABASE_URL=sqlite:///~/.yourmemory/memories.db
Принимаются Pull Request'ы — см. CONTRIBUTORS.md.
Copyright 2026 Sachit Misra — Licensed under CC-BY-NC-4.0.
Бесплатно для личного использования, образования, академических исследований и проектов с открытым кодом. Коммерческое использование требует отдельного письменного соглашения → [email protected]
pip install yourmemory| Возможность | Что она делает |
|---|
| 🧠 | Консолидация | Когда накапливается достаточно связанных фактов, они сжимаются в одну чистую сводку, а оригиналы архивируются. Память становится чётче со временем, а не раздувается. |
| 📉 | Биологическое затухание | Каждое воспоминание стареет по кривой забывания Эббингауза. Устаревшие, неиспользуемые факты исчезают; важные и часто воспроизводимые сохраняются. |
| 🔗 | Граф сущностей | Воспоминания связываются через общих людей, места и концепции — так что при воспроизведении всплывает то, о чём вы забыли спросить. |
| ♻️ | Переживает сброс контекста | Когда окно контекста сжимается, YourMemory возвращает рабочий контекст — не нужно перечитывать файлы, чтобы понять, на чём вы остановились. |
| 🔒 | Защищённая от подделки цепочка аудита | Каждая операция чтения/записи/удаления логируется в хэш-сцеплённый реестр. Измените одну запись — цепочка разорвётся. |
| 👥 | Командные пулы памяти | Ролевая общая память — агенты всей команды используют одни и те же институциональные знания, приватные воспоминания остаются приватными. |
| 🛡️ | Встроенные права на данные | Экспорт одной командой (право доступа) и «право на забвение» (очистка), а также контроли, соответствующие SOC 2. |
| 🔌 | MCP-native & локальный по умолчанию | Работает с Claude, Cursor, Cline, Windsurf или любым MCP-клиентом. Запускается полностью на вашем устройстве — без API-ключа, ничего не покидает вашу систему. |
| Linux (x86-64) | yourmemory-linux-x86_64.tar.gz |
| Windows (x86-64) | yourmemory-windows-x86_64.exe.zip |
| Категория | Период полураспада | Лучше всего для |
|---|
strategy | ~38 дней | Сработавшие паттерны, архитектурные решения |
fact | ~24 дня | Предпочтения, личность, стабильные знания |
assumption | ~19 дней | Выведенный контекст, неопределённые убеждения |
failure | ~11 дней | Ошибки, неправильные подходы, специфичные для окружения |
| Право | Endpoint | Что делает |
|---|
| Доступ (экспорт DSAR) | GET /users/{id}/export | Полный экспорт всех данных, хранящихся для пользователя |
| Удаление (право на забвение) | DELETE /users/{id}/memories | Однокомандная очистка воспоминаний пользователя |
| Переносимость | POST /users/{id}/import | Повторный импорт предыдущего экспорта |
| Восстанавливаемость | GET /users/{id}/archive | Извлечение оригиналов, ушедших в консолидацию |
| Инструмент | Когда ваш ИИ его вызывает | Что делает |
|---|
recall_memory(query, current_path?) | В начале каждой задачи | Извлекает воспоминания, ранжированные по сходству × сила затухания; пространственное ускорение для воспоминаний, связанных с путём |
store_memory(content, importance, category?, context_paths?) | После изучения чего-то нового | Встраивает, дедуплицирует, сохраняет с затуханием; добавляет необязательные пути к файлам/каталогам |
update_memory(id, new_content, importance) | Когда сохранённый факт устарел | Повторно встраивает и заменяет; фиксирует изменение в журнале аудита |
| Компонент | Роль |
|---|
| DuckDB | Векторное хранилище по умолчанию — без настройки, нативное косинусное сходство |
| PostgreSQL + pgvector | Опционально — для команд или больших наборов данных |
| NetworkX | Графовый бэкенд по умолчанию (~/.yourmemory/graph.pkl) |
| Neo4j | Опциональный графовый бэкенд |
| sentence-transformers | Локальные эмбеддинги (multi-qa-mpnet-base-dot-v1, 768 dims) |
| spaCy | Локальная NLP для дедупликации и извлечения сущностей |
| APScheduler | Автоматическое затухание и обрезка |