Agent Memory

Модуль 09 · Урок 9.3

Урок 9.3. Mem0: персонализация и атомарная память пользователя

На этой странице
  1. Цель лекции
  2. Ожидаемый результат
  3. Зачем это нужно
  4. Основная идея
  5. Ключевые термины
  6. Архитектурный подход Mem0
  7. ADD, UPDATE и DELETE: что именно происходит
  8. Под капотом: retrieval и связи сущностей
  9. Лучший сценарий использования
  10. Где Mem0 не должен быть единственным слоем
  11. Мини-кейс: персональный учебный ассистент
  12. Мини-пример интеграции
  13. Типичные ошибки
  14. Когда выбрать Mem0
  15. Источники для дальнейшего чтения
  16. Краткое резюме
  17. Вопросы для самопроверки
  18. Что дальше

Цель лекции

Разобрать Mem0 как пример dedicated memory framework для user memory: что он берет на себя, как меняет архитектуру персонального ассистента и какие ограничения остаются за продуктовой командой.

Ожидаемый результат

Читатель понимает, что Mem0 полезен прежде всего как слой персонализации и компактных memory records, но не заменяет policies, consent, source of truth, observability и собственные evals.

Зачем это нужно

В предыдущих лекциях мы говорили о memory framework как о категории инструментов. Теперь посмотрим на конкретный представитель этой категории.

Mem0 часто рассматривают как способ быстро добавить агенту долговременную память:

  • пользовательские предпочтения;
  • факты профиля;
  • устойчивые привычки;
  • заметки между сессиями;
  • scoped memory по user_id, agent_id, run_id или приложению;
  • retrieval памяти перед ответом.

Но "добавить память" не значит "решить memory architecture". Framework может извлечь и найти memory item, но продукт все равно должен решить:

  • что можно сохранять;
  • как показывать память пользователю;
  • как удалять память из всех индексов;
  • что делать с конфликтами;
  • как оценивать качество;
  • где проходит граница между transient session state и durable user profile.

Основная идея

Mem0 лучше всего понимать как слой для превращения диалога и событий в компактные записи памяти, которые потом можно искать и вставлять в контекст.

Вместо хранения всего сырого диалога агент обычно хочет получить более короткие и пригодные для retrieval записи:

text
Raw conversation:
User: I moved to Austin last month. Also, please stop recommending early morning calls.

Memory records:
- User lives in Austin.
- User prefers not to schedule early morning calls.

Такие записи дешевле вставлять в prompt, проще фильтровать и легче показывать пользователю в memory UI.

Ключевые термины

Термин Короткое определение
Memory record Компактная запись памяти: факт, предпочтение, заметка или событие с metadata.
Atomic fact Небольшая самостоятельная единица знания, которую можно обновить или удалить отдельно.
Entity ID Идентификатор scope: пользователь, агент, приложение, run или другой объект.
ADD-only extraction Подход, где новый pipeline извлечения добавляет новые записи, а не пытается в том же шаге переписать старые.
Hybrid retrieval Поиск по нескольким сигналам: semantic similarity, keyword/BM25, entity matching, metadata filters.
Entity linking Связывание memory records через сущности, чтобы запрос "где живет Alice" находил связанные записи.
Memory CRUD Операции управления памятью: add, search, get/list, update, delete.

Архитектурный подход Mem0

Упрощенная схема:

flowchart TD A["Conversation or event"] --> B["Mem0 add"] B --> C["Extraction LLM"] C --> D["Atomic memory records"] D --> E["Vector or hybrid indexes"] D --> F["Entity links and metadata"] Q["New user task"] --> R["Mem0 search"] R --> E R --> F E --> S["Relevant memories"] F --> S S --> X["Application context assembly"] X --> L["LLM response"] U["User correction or product UI"] --> M["Update or delete memory"] M --> D

Важно: Mem0 не обязан быть единственным storage. В зрелой системе рядом могут жить:

  • SQL profile table как source of truth;
  • audit log;
  • consent records;
  • deletion jobs;
  • raw conversation archive с отдельной retention policy;
  • product-specific rules.

Mem0 в такой архитектуре часто становится retrieval-oriented memory service.

ADD, UPDATE и DELETE: что именно происходит

В текущих документах Mem0 есть важное различие:

  • endpoint add в новом V3 pipeline описан как single-pass ADD-only extraction: добавление новых memory records из сообщений, без попытки в том же шаге выполнить UPDATE/DELETE старых записей;
  • отдельные API/SDK операции update и delete все равно существуют как explicit memory management operations.

Это значит, что не стоит представлять Mem0 как магический слой, который всегда сам идеально переписывает профиль. Лучше думать так:

  1. add получает сообщения или факты и ставит задачу обработки.
  2. extractor создает компактные записи.
  3. search находит релевантные записи по query и filters.
  4. update/delete выполняются явно, когда система или пользователь знает, какую запись нужно исправить.

Пример изменения предпочтения:

text
Old memory:
- User prefers morning meetings.

New user message:
- Actually, I no longer take calls before noon.

Good product behavior:
- Do not simply add an unrelated second preference.
- Find old scheduling preference.
- Replace, invalidate or mark it stale.
- Keep audit trail if policy requires it.

Mem0 может помочь с механикой поиска и обновления, но политика "что считать устаревшим" должна быть вашей.

Под капотом: retrieval и связи сущностей

Для memory layer одного vector search часто мало. Запросы пользователя бывают точными, временными и entity-heavy:

text
What city does Alice live in now?
What food should I avoid recommending to Bob?
Which project did the user say uses FastAPI?

Поэтому Mem0 полезно рассматривать как multi-signal retrieval layer:

  • semantic search ищет похожий смысл;
  • BM25/keyword помогает с точными именами, городами, project IDs;
  • metadata filters ограничивают scope;
  • entity linking связывает записи вокруг людей, объектов и приложений;
  • reranking может уточнять порядок candidate memories.

Исторически вокруг Mem0 часто обсуждали graph memory. Важно проверять версию и deployment mode: в новых материалах Mem0 делает акцент на entity linking и hybrid search, а некоторые graph-store детали могут относиться к более ранним или отдельным режимам.

Лучший сценарий использования

Mem0 особенно хорошо ложится на B2C или prosumer ассистентов, где нужна персонализация между сессиями:

  • AI companion;
  • learning assistant;
  • productivity assistant;
  • writing assistant;
  • health/fitness coach с осторожной privacy model;
  • customer-facing assistant с user preferences;
  • internal copilot, который помнит рабочие предпочтения сотрудника.

Типовая задача:

text
Пользователь месяцами общается с ассистентом.
Ассистент должен помнить предпочтения,
но не должен вставлять в каждый prompt всю историю.

Mem0 помогает сделать память компактной и searchable.

Где Mem0 не должен быть единственным слоем

Mem0 не заменяет:

  • identity and access management;
  • compliance storage;
  • source-of-truth database;
  • legal hold;
  • human review;
  • product-specific memory UI;
  • domain ontology;
  • evaluation harness;
  • audit trail для high-stakes действий.

Например, если пользователь говорит:

text
Удалите все, что вы обо мне знаете.

Недостаточно удалить только ближайшую semantic memory. Нужно удалить:

  • memory records;
  • embeddings;
  • entity links;
  • summaries;
  • cache;
  • derived preferences;
  • possibly raw logs according to retention policy.

Мини-кейс: персональный учебный ассистент

Ассистент помогает пользователю учиться.

Он может сохранять:

  • preferred language: Russian;
  • prefers short examples first;
  • struggles with vector search terminology;
  • studies in evenings;
  • wants weekly review questions.

Он не должен автоматически сохранять:

  • случайные эмоциональные фразы;
  • медицинские подробности без явного consent;
  • платежные данные;
  • секреты;
  • одноразовые детали текущего чата.

Memory write policy:

text
Store:
- explicit preferences;
- repeated learning difficulties;
- durable schedule constraints;
- corrections confirmed by user.

Do not store:
- sensitive data unless explicitly allowed;
- temporary frustration;
- raw private conversation;
- facts without scope.

Мини-пример интеграции

Псевдокод, без привязки к конкретной версии SDK:

python
from mem0 import MemoryClient

memory = MemoryClient(api_key="...")

memory.add(
    messages=[
        {"role": "user", "content": "Я предпочитаю короткие ответы с примерами."},
        {"role": "assistant", "content": "Понял, буду отвечать короче и с примерами."},
    ],
    user_id="user_123",
)

memories = memory.search(
    query="Как пользователь предпочитает получать объяснения?",
    filters={"user_id": "user_123"},
    top_k=5,
)

В production этот код должен быть окружен:

  • privacy filter перед add;
  • metadata: source, timestamp, app_id, consent_basis;
  • user-visible memory UI;
  • deletion workflow;
  • logging and evals.

Типичные ошибки

Ошибка 1: хранить все сообщения как память.

Это превращает memory layer в дорогой архив и ухудшает retrieval.

Ошибка 2: считать add заменой conflict resolution.

Если пользователь поменял предпочтение, нужно продумать invalidation/update strategy.

Ошибка 3: забывать metadata.

Без source, timestamp, scope и confidence память трудно безопасно использовать.

Ошибка 4: вставлять найденные memories без context assembly.

Search results еще нужно отфильтровать, упорядочить и сжать.

Ошибка 5: не делать memory UI.

Пользователь должен видеть, исправлять и удалять память.

Ошибка 6: верить benchmark claims без своих тестов.

Даже хорошие публичные benchmark results не гарантируют качество на вашем домене.

Когда выбрать Mem0

Выбирайте Mem0, если:

  • главная ценность - персонализация;
  • много user-level facts и preferences;
  • нужен быстрый prototype long-term memory;
  • команда не хочет писать extraction/retrieval слой с нуля;
  • high-stakes compliance не является центральной сложностью;
  • вы готовы добавить свои policies и user controls.

Не выбирайте Mem0 как единственный слой, если:

  • у вас строгий enterprise governance;
  • все факты должны иметь юридически значимый source;
  • нужна сложная temporal graph model;
  • требуется domain-specific ontology;
  • memory update должен быть полностью explainable.

Источники для дальнейшего чтения

  • Mem0 API overview: https://docs.mem0.ai/api-reference
  • Mem0 add memories: https://docs.mem0.ai/api-reference/memory/add-memories
  • Mem0 update memory: https://docs.mem0.ai/core-concepts/memory-operations/update
  • Mem0 search memories: https://docs.mem0.ai/api-reference/memory/search-memories
  • Mem0 research and benchmarks: https://mem0.ai/research

Краткое резюме

Mem0 - это practical memory framework для компактной, searchable user memory. Его сильная сторона - быстрый путь к персонализации: извлечь memory records, связать их со scope, найти релевантные записи и вставить их в контекст.

Но Mem0 не отменяет архитектурных обязанностей: write policy, consent, deletion, source of truth, conflict handling, observability и evals остаются частью вашей системы.

Вопросы для самопроверки

  1. Почему compact memory records обычно лучше сырого диалога для long-term personalization?
  2. Чем отличается ADD-only extraction от explicit update/delete операций?
  3. Какие metadata нужны memory record для безопасного использования?
  4. Почему memory framework не заменяет user-visible memory UI?
  5. В каких случаях Mem0 может быть недостаточен без дополнительного custom layer?

Что дальше

В следующей лекции мы разберем Zep и Graphiti: подход, где центр тяжести переносится с атомарных пользовательских фактов на temporal knowledge graph, provenance, governance и точность фактов во времени.

Обновлено 08.08.2026