Mem0: память для ИИ-агента — это слой долговременной памяти, который хранит факты о пользователе между сессиями, инструментами и запусками. В документации проекта продукт описан как память, переживающая отдельные диалоги. Дальше — три режима работы, учебный маршрут и проверка того, что поиск возвращает факты нужного пользователя.
Что именно хранит Mem0 и где граница задачи
Документация проекта на docs.mem0.ai описывает Mem0 как слой, дающий агентам долговременную память, которая сохраняется между сессиями, инструментами и запусками. Это определение стоит разложить на три разные вещи, которые часто путают.
Первое — извлечённые факты. Когда вы отправляете в Mem0 пару сообщений, движок вытаскивает из них отдельные утверждения и сохраняет каждое своей записью. В быстром старте на docs.mem0.ai/platform/quickstart фраза про вегетарианство и аллергию на орехи превращается в две записи: «Is a vegetarian» и «Allergic to nuts». Каждая получает свой идентификатор, категорию и оценку совпадения при поиске.
Второе — история сообщений. Это сырой диалог, который вы передаёте в вызове. Он служит входом для извлечения, но сам по себе памятью не становится.
Третье — память в весах модели. Веса языковой модели не меняются от ваших вызовов. Mem0 подставляет найденные факты в контекст запроса, и модель отвечает, опираясь на них. Документация прямо говорит: передайте эти воспоминания модели как контекст, и она ответит тем, что уже знает о пользователе.
Граница задачи отсюда простая. Mem0 отвечает за извлечение, хранение и поиск фактов. За то, как приложение использует найденное, отвечает ваше приложение. Если поиск вернул пустой результат, приложение не должно дописывать догадку в ответ.
| Слой | Что содержит | Кто управляет |
|---|---|---|
| Извлечённые факты | Отдельные утверждения с id и категорией | Mem0 |
| История сообщений | Сырой диалог, вход для извлечения | Ваше приложение |
| Память в весах модели | Отсутствует, веса не меняются | Провайдер модели |
| Контекст запроса | Найденные факты, подставленные в промпт | Ваше приложение |
Три режима: Platform, библиотека, self-hosted server
Документация проекта на docs.mem0.ai/open-source/overview называет open-source версию тем же движком памяти, что и Platform, но работающим на вашей инфраструктуре. README проекта на GitHub перечисляет три способа запуска и их назначение.
Библиотека подходит для тестов и прототипов. Установка — pip install mem0ai или npm install mem0ai, дальше вызов Memory(). Панели управления и ключей здесь нет.
Self-hosted server — это Docker-стек с панелью, ключами на каждого пользователя и журналом аудита запросов. Запуск через make bootstrap поднимает сервер, панель и первый ключ.
Cloud Platform — вариант без собственной инфраструктуры: регистрация на app.mem0.ai, затем встраивание слоя памяти через SDK или ключи.
Важное различие в умолчаниях. У библиотеки по умолчанию LLM — OpenAI gpt-5-mini, эмбеддинги — OpenAI text-embedding-3-small, векторное хранилище — локальный Qdrant в /tmp/qdrant, история — SQLite в ~/.mem0/history.db, реранкер отключён до настройки. У self-hosted server умолчания другие: векторное хранилище — Postgres с pgvector, а модели переопределяются переменными окружения. Эти два набора нельзя объединять в одну инструкцию: конфигурация библиотеки и сервера различается.
| Критерий | Библиотека | Self-hosted server | Cloud Platform |
|---|---|---|---|
| Для чего | Тесты, прототипы | Команды на своей инфраструктуре | Продакшен без своей инфраструктуры |
| Установка | pip или npm install | docker compose up | Регистрация на app.mem0.ai |
| Панель | Нет | Есть | Есть |
| Ключи и авторизация | Нет | Есть | Есть |
| Векторное хранилище по умолчанию | Локальный Qdrant | Postgres + pgvector | Управляется сервисом |
Полный исходный набор и копируемый маршрут Platform
Учебный пример ниже задан целиком. Пользователь A говорит: «В ответах предпочитаю русский язык. Работаю с Python». Пользователь B говорит: «В ответах предпочитаю английский. Работаю с Java». Это заданные учебные входные данные.
Маршрут Platform повторяет шаги из быстрого старта: установка, ключ, добавление, поиск. Ключ берётся из переменной окружения, в код он не вписывается.
import os
from mem0 import MemoryClient
client = MemoryClient(api_key=os.environ['MEM0_API_KEY'])
client.add(
[{'role': 'user', 'content': 'В ответах предпочитаю русский язык. Работаю с Python'}],
user_id='A',
)
client.add(
[{'role': 'user', 'content': 'В ответах предпочитаю английский. Работаю с Java'}],
user_id='B',
)
result = client.search(
'Какой язык ответа и стек предпочитает пользователь?',
filters={'user_id': 'A'},
)
memories = [item['memory'] for item in result['results']]
print(memories)
Документация проекта на docs.mem0.ai/platform/quickstart показывает тот же порядок: установить SDK, задать ключ, вызвать add с массивом сообщений и user_id, затем search с фильтром. Поиск возвращает записи, отсортированные по совпадению с вопросом, и каждая запись несёт поля user_id, agent_id, app_id, run_id, categories, metadata и score.
Поля agent_id, app_id и run_id в примере быстрого старта возвращаются пустыми. Это нормально: они заполняются, когда память привязана к агенту, приложению или конкретному запуску. Для привязки к пользователю достаточно user_id.
Ручной эталон и результаты реального запуска
Ручной эталон — это требование к результату извлечения, которое вы формулируете до запуска. Для нашего набора он выглядит так: A → язык ru, стек Python; B → язык en, стек Java. Приёмка проверяет смысл извлечённых фактов.
Заполненная матрица приёмки:
| Проверка | Ожидание | Что означает расхождение |
|---|---|---|
| A / язык | ru | Извлечение потеряло предпочтение языка |
| A / стек | Python | Стек не попал в факты |
| B / язык | en | Факты пользователей перепутаны |
| B / стек | Java | Стек не попал в факты |
| A / город | неизвестно | Поиск вернул факт, которого не было во входе |
| C / язык | неизвестно | Поиск затронул чужую область |
Последние две строки — отрицательные проверки. Проводите пилот на изолированном учебном наборе без ранее сохранённых фактов для A, B и C. Пользователь A не называл город, пользователя C в этом наборе нет. Неподтверждённое утверждение о городе отвергают и разбирают отдельно: причиной может быть ошибка извлечения или смешение данных. Результат поиска по C проверяют на нарушение заданной области.
Что в реальном запуске заранее неизвестно: точные идентификаторы записей, порядок выдачи, числовые оценки score и дословные формулировки фактов. Документация проекта показывает пример, где одна фраза даёт две записи с оценками 0.87 и 0.81, но эти числа относятся к её собственному примеру. Ваш запуск даст свои значения.
Отсюда правило приёмки: сравнивайте смысл извлечённых фактов. «ru» и «предпочитает русский язык» — одно и то же требование. А вот город у пользователя, который его не называл, — провал независимо от формулировки.
Отрицательный случай и неизвестные значения
Отрицательный случай проверяется так же строго, как положительный. Задайте вопрос о городе A и проверьте, что приложение сообщает об отсутствии сведений о городе. Поиск может вернуть другие сохранённые факты A; они не подтверждают ответ на этот вопрос. Для отсутствующего в учебном наборе пользователя C отдельно проверяют пустую область поиска.
Порядок действий:
- Добавьте факты для A и B, как в маршруте выше.
- Выполните поиск по A с вопросом про город.
- Проверьте возвращённые факты: подтверждения города в них быть не должно, а итоговый ответ должен оставить город неизвестным.
- Выполните поиск по пользователю C, которого нет в данных.
- Проверьте, что список результатов пуст.
- Убедитесь, что при пустой выдаче приложение не добавляет догадку в ответ.
Шестой шаг — самый важный и самый пропускаемый. Если поиск вернул пусто, а приложение всё равно написало «вероятно, вы из Москвы», вы обошли весь смысл слоя памяти. Пустой результат — это корректный ответ, и приложение должно его так и передать.
Отдельно про область поиска. Параметр user_id и фильтры задают, где искать, но сами по себе не являются границей доступа между арендаторами. Приложение обязано получать идентификатор пользователя из доверенного сеанса. Если клиент присылает user_id в теле запроса, он может прислать чужой.
Неизвестные значения стоит зафиксировать в матрице заранее. Точные id, порядок, score и формулировки вы не предскажете. Предсказать можно только смысл: какой факт должен найтись, а какой — нет.
Условия доступа и что проверить перед стартом
Для Platform нужен аккаунт и ключ из панели. Документация проекта на docs.mem0.ai/platform/quickstart называет предварительные требования: аккаунт Mem0 Platform, ключ API, Python 3.10+, Node.js 18+ или cURL. CLI требует Node.js 18+ либо Python 3.10+.
Отдельный путь — регистрация агента. Документация проекта на docs.mem0.ai/introduction описывает четыре терминальные команды, которые создают аккаунт и ключ без почты и панели, с возможностью заявить владение позже. README проекта приводит тот же сценарий: установка CLI, mem0 init --agent --agent-caller, добавление и поиск. Владелец-человек может позже забрать аккаунт командой с почтой, ключ и воспоминания сохраняются.
Для open-source версии аккаунт не нужен. Библиотека ставится локально, self-hosted server поднимается через Docker. У self-hosted server авторизация включена по умолчанию; при обновлении со сборки без авторизации README советует задать ADMIN_API_KEY, зарегистрировать администратора через мастер или отключить авторизацию только для локальной разработки.
Чего в источниках нет, того в инструкцию не переносим: конкретных тарифов, квот и лимитов запросов. Их стоит смотреть в панели своего аккаунта перед тем, как закладывать нагрузку.
Перед стартом проверьте по списку:
- Ключ читается из переменной окружения, в коде и логах его нет.
- Идентификатор пользователя приходит из доверенного сеанса.
- Проверка неизвестного города сохраняет ответ «неизвестно», а поиск по отсутствующему пользователю C проверяет пустую область.
- Выбор режима соответствует задаче: прототип, своя инфраструктура или продакшен без своей инфраструктуры.
- Умолчания библиотеки и сервера не смешаны в одной конфигурации.
Частые вопросы
Что такое Mem0 простыми словами?
Это слой памяти для приложений с ИИ. Он вытаскивает отдельные факты из переписки, хранит их и возвращает по запросу. Документация проекта описывает его как память, которая сохраняется между сессиями, инструментами и запусками.
Чем Platform отличается от open-source версии?
Open-source версия — тот же движок памяти, работающий на вашей инфраструктуре. Platform — управляемый вариант без собственной инфраструктуры. Библиотека и self-hosted server различаются умолчаниями хранилища и моделей.
Как подключить Mem0 к своему агенту на Python?
Установите SDK, задайте ключ из переменной окружения, вызовите add с сообщениями и user_id, затем search с фильтром. Документация проекта показывает этот порядок в быстром старте на Python, JavaScript, cURL и в CLI.
Почему поиск возвращает пустой результат?
Пустая выдача означает, что этот поиск не вернул воспоминаний. Проверьте сохранение нужного факта и фильтр пользователя. Вопрос без подтверждённого ответа может вернуть другие факты того же пользователя; приложение должно сообщить, что запрошенное значение неизвестно.
Можно ли запустить Mem0 на своём сервере?
Да, self-hosted server — это Docker-стек с панелью, ключами на пользователя и журналом аудита. README проекта приводит запуск через make bootstrap, который поднимает сервер, панель и первый ключ. Авторизация включена по умолчанию.
