Начало работы с Mem0 и Milvus
Mem0 - это интеллектуальный слой памяти для приложений ИИ, предназначенный для обеспечения персонализированного и эффективного взаимодействия за счет сохранения пользовательских предпочтений и непрерывной адаптации с течением времени. Идеально подходящий для чат-ботов и инструментов, управляемых искусственным интеллектом, Mem0 создает бесшовные, учитывающие контекст взаимодействия.
В этом уроке мы рассмотрим основные операции управления памятью Mem0 - добавление, извлечение, обновление, поиск, удаление и отслеживание истории памяти - с использованием Milvus, высокопроизводительной векторной базы данных с открытым исходным кодом, которая обеспечивает эффективное хранение и извлечение информации. Это практическое введение проведет вас через основные операции с памятью, чтобы помочь вам создать персонализированное взаимодействие ИИ с Mem0 и Milvus.
Подготовка
Загрузите необходимые библиотеки
$ pip install mem0ai pymilvus
Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).
Настройка Mem0 с помощью Milvus
В этом примере мы будем использовать OpenAI в качестве LLM. Вы должны подготовить api ключ OPENAI_API_KEY
в качестве переменной окружения.
import os
os.environ["OPENAI_API_KEY"] = "sk-***********"
Теперь мы можем настроить Mem0 на использование Milvus в качестве векторного хранилища.
# Define Config
from mem0 import Memory
config = {
"vector_store": {
"provider": "milvus",
"config": {
"collection_name": "quickstart_mem0_with_milvus",
"embedding_model_dims": "1536",
"url": "./milvus.db", # Use local vector database for demo purpose
},
},
"version": "v1.1",
}
m = Memory.from_config(config)
- Если вам нужна локальная база данных векторов только для небольших данных или прототипирования, установка uri в качестве локального файла, например,
./milvus.db
, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.- Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае используйте адрес и порт сервера в качестве uri, например,
http://localhost:19530
. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае не задавайте токен.- Если вы используете Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте
uri
иtoken
, которые соответствуют публичной конечной точке и ключу API в Zilliz Cloud.
Управление пользовательскими воспоминаниями с помощью Mem0 и Milvus
Добавление памяти
Функция add
сохраняет неструктурированный текст в Milvus в виде памяти, связывая его с конкретным пользователем и дополнительными метаданными.
Здесь мы добавляем в Milvus воспоминание Алисы "работаю над улучшением своих навыков игры в теннис" вместе с соответствующими метаданными для контекста.
# Add a memory to user: Working on improving tennis skills
res = m.add(
messages="I am working on improving my tennis skills.",
user_id="alice",
metadata={"category": "hobbies"},
)
res
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Working on improving tennis skills',
'event': 'ADD'}],
'relations': []}
Обновление воспоминания
Мы можем использовать возвращаемое значение функции add
для получения идентификатора памяти, что позволит нам обновить эту память новой информацией с помощью update
.
# Get memory_id
memory_id = res["results"][0]["id"]
# Update this memory with new information: Likes to play tennis on weekends
m.update(memory_id=memory_id, data="Likes to play tennis on weekends")
{'message': 'Memory updated successfully!'}
Получить всю память для пользователя
Мы можем использовать функцию get_all
для просмотра всех вставленных воспоминаний или фильтрации по user_id
в Milvus.
Обратите внимание, что память теперь изменилась с "Работает над улучшением навыков игры в теннис" на "Любит играть в теннис по выходным".
# Get all memory for the user Alice
m.get_all(user_id="alice")
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Likes to play tennis on weekends',
'hash': '4c3bc9f87b78418f19df6407bc86e006',
'metadata': None,
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00',
'user_id': 'alice'}]}
Просмотр истории обновления памяти
Мы также можем просмотреть историю обновления воспоминаний, указав интересующий нас memory_id с помощью функции history
.
m.history(memory_id=memory_id)
[{'id': '71ed3cec-5d9a-4fa6-a009-59802450c0b9',
'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'old_memory': None,
'new_memory': 'Working on improving tennis skills',
'event': 'ADD',
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': None},
{'id': 'db2b003c-ffb7-42e4-bd8a-b9cf56a02bb9',
'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'old_memory': 'Working on improving tennis skills',
'new_memory': 'Likes to play tennis on weekends',
'event': 'UPDATE',
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00'}]
Поиск памяти
Мы можем использовать функцию search
для поиска наиболее связанного с пользователем воспоминания.
Для начала добавим еще одну память для Алисы.
new_mem = m.add(
"I have a linear algebra midterm exam on November 20",
user_id="alice",
metadata={"category": "task"},
)
Теперь мы вызываем get_all
, указывая user_id, чтобы убедиться, что у нас действительно есть 2 записи памяти для пользователя Alice.
m.get_all(user_id="alice")
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Likes to play tennis on weekends',
'hash': '4c3bc9f87b78418f19df6407bc86e006',
'metadata': None,
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00',
'user_id': 'alice'},
{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
'memory': 'Has a linear algebra midterm exam on November 20',
'hash': '575182f46965111ca0a8279c44920ea2',
'metadata': {'category': 'task'},
'created_at': '2024-11-01T19:33:57.271657-07:00',
'updated_at': None,
'user_id': 'alice'}]}
Теперь мы можем выполнить search
, предоставив query
и user_id
. Обратите внимание, что по умолчанию мы используем метрику L2
для поиска сходства, поэтому меньшее значение score
означает большее сходство.
m.search(query="What are Alice's hobbies", user_id="alice")
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
'memory': 'Likes to play tennis on weekends',
'hash': '4c3bc9f87b78418f19df6407bc86e006',
'metadata': None,
'score': 1.2807445526123047,
'created_at': '2024-11-01T19:33:44.116920-07:00',
'updated_at': '2024-11-01T19:33:47.619857-07:00',
'user_id': 'alice'},
{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
'memory': 'Has a linear algebra midterm exam on November 20',
'hash': '575182f46965111ca0a8279c44920ea2',
'metadata': {'category': 'task'},
'score': 1.728922724723816,
'created_at': '2024-11-01T19:33:57.271657-07:00',
'updated_at': None,
'user_id': 'alice'}]}
Удаление памяти
Мы также можем delete
память, предоставив соответствующее memory_id
.
Мы удалим память "Любит играть в теннис по выходным", поскольку ее memory_id
уже была получена, и вызовем get_all
, чтобы убедиться, что удаление прошло успешно.
m.delete(memory_id=memory_id)
m.get_all("alice")
{'results': [{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
'memory': 'Has a linear algebra midterm exam on November 20',
'hash': '575182f46965111ca0a8279c44920ea2',
'metadata': {'category': 'task'},
'created_at': '2024-11-01T19:33:57.271657-07:00',
'updated_at': None,
'user_id': 'alice'}]}