Primeros pasos con Mem0 y Milvus
Mem0 es una capa de memoria inteligente para aplicaciones de IA, diseñada para ofrecer interacciones personalizadas y eficientes reteniendo las preferencias del usuario y adaptándose continuamente a lo largo del tiempo. Ideal para chatbots y herramientas basadas en IA, Mem0 crea experiencias fluidas y conscientes del contexto.
En este tutorial, cubriremos las operaciones esenciales de gestión de memoria de Mem0 (añadir, recuperar, actualizar, buscar, eliminar y realizar un seguimiento del historial de memoria) utilizando Milvus, una base de datos vectorial de código abierto y alto rendimiento que permite un almacenamiento y una recuperación eficientes. Esta introducción práctica le guiará a través de las operaciones básicas de memoria para ayudarle a crear interacciones de IA personalizadas con Mem0 y Milvus.
Preparación
Descarga de las bibliotecas necesarias
$ pip install mem0ai pymilvus
Si utilizas Google Colab, para habilitar las dependencias que acabas de instalar, es posible que tengas que reiniciar el tiempo de ejecución (haz clic en el menú "Tiempo de ejecución" en la parte superior de la pantalla y selecciona "Reiniciar sesión" en el menú desplegable).
Configurar Mem0 con Milvus
En este ejemplo utilizaremos OpenAI como LLM. Deberías preparar la clave api OPENAI_API_KEY
como variable de entorno.
import os
os.environ["OPENAI_API_KEY"] = "sk-***********"
Ahora, podemos configurar Mem0 para usar Milvus como almacén de vectores
# 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)
- Si sólo necesitas una base de datos de vectores local para datos a pequeña escala o prototipado, configurar la uri como un archivo local, por ejemplo
./milvus.db
, es el método más conveniente, ya que automáticamente utiliza Milvus Lite para almacenar todos los datos en este archivo.- Si tiene una gran escala de datos, digamos más de un millón de vectores, puede configurar un servidor Milvus más eficiente en Docker o Kubernetes. En esta configuración, por favor utilice la dirección del servidor y el puerto como su uri, por ejemplo
http://localhost:19530
. Si habilita la función de autenticación en Milvus, utilice "<su_nombre_de_usuario>:<su_contraseña>" como token, de lo contrario no configure el token.- Si utiliza Zilliz Cloud, el servicio en la nube totalmente gestionado para Milvus, ajuste
uri
ytoken
, que corresponden al punto final público y a la clave API en Zilliz Cloud.
Gestión de memorias de usuario con Mem0 y Milvus
Añadir una memoria
La función add
almacena texto no estructurado en Milvus como una memoria, asociándolo con un usuario específico y metadatos opcionales.
Aquí, estamos añadiendo la memoria de Alice, "trabajando en mejorar mis habilidades de tenis", junto con metadatos relevantes para el contexto de 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': []}
Actualizar una memoria
Podemos utilizar el valor de retorno de la función add
para recuperar el ID de la memoria, lo que nos permite actualizar esta memoria con nueva información a través de 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!'}
Obtener todas las memorias de un usuario
Podemos utilizar la función get_all
para ver todas las memorias insertadas o filtrar por user_id
en Milvus.
Observe que la memoria ha cambiado de "Trabajando para mejorar sus habilidades tenísticas" a "Le gusta jugar al tenis los fines de semana".
# 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'}]}
Ver el historial de actualizaciones de la memoria
También podemos ver el historial de actualización de la memoria especificando qué memory_id nos interesa a través de la función 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'}]
Buscar memoria
Podemos utilizar la función search
para buscar la memoria más relacionada con el usuario.
Empecemos añadiendo otra memoria para Alice.
new_mem = m.add(
"I have a linear algebra midterm exam on November 20",
user_id="alice",
metadata={"category": "task"},
)
Ahora, llamamos a get_all
especificando el user_id para verificar que efectivamente tenemos 2 entradas de memoria para el usuario 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'}]}
Ahora podemos realizar search
proporcionando query
y user_id
. Ten en cuenta que por defecto estamos utilizando la métrica L2
para la búsqueda de similitud, por lo que un score
más pequeño significa mayor similitud.
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'}]}
Borrar memoria
También podemos delete
una memoria proporcionando la correspondiente memory_id
.
Eliminaremos la memoria "Le gusta jugar al tenis los fines de semana", ya que su memory_id
ya ha sido recuperada, y llamaremos a get_all
para verificar que la eliminación se ha realizado correctamente.
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'}]}