Premiers pas avec Mem0 et Milvus
Mem0 est une couche de mémoire intelligente pour les applications d'IA, conçue pour offrir des interactions personnalisées et efficaces en conservant les préférences de l'utilisateur et en s'adaptant continuellement au fil du temps. Idéal pour les chatbots et les outils pilotés par l'IA, Mem0 crée des expériences transparentes et conscientes du contexte.
Dans ce tutoriel, nous aborderons les opérations essentielles de gestion de la mémoire de Mem0 - ajout, récupération, mise à jour, recherche, suppression et suivi de l'historique de la mémoire - en utilisant Milvus, une base de données vectorielle open-source haute performance qui permet un stockage et une récupération efficaces. Cette introduction pratique vous guidera à travers les opérations de mémoire fondamentales pour vous aider à créer des interactions d'IA personnalisées avec Mem0 et Milvus.
Préparation
Télécharger les bibliothèques nécessaires
$ pip install mem0ai pymilvus
Si vous utilisez Google Colab, pour activer les dépendances qui viennent d'être installées, vous devrez peut-être redémarrer le runtime (cliquez sur le menu "Runtime" en haut de l'écran, et sélectionnez "Restart session" dans le menu déroulant).
Configurer Mem0 avec Milvus
Nous utiliserons OpenAI comme LLM dans cet exemple. Vous devez préparer la clé api OPENAI_API_KEY
en tant que variable d'environnement.
import os
os.environ["OPENAI_API_KEY"] = "sk-***********"
Maintenant, nous pouvons configurer Mem0 pour qu'il utilise Milvus comme magasin de vecteurs
# 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 vous n'avez besoin d'une base de données vectorielle locale que pour les données à petite échelle ou le prototypage, définir l'uri comme un fichier local, par exemple
./milvus.db
, est la méthode la plus pratique, car elle utilise automatiquement Milvus Lite pour stocker toutes les données dans ce fichier.- Si vous disposez de données à grande échelle, par exemple plus d'un million de vecteurs, vous pouvez configurer un serveur Milvus plus performant sur Docker ou Kubernetes. Dans cette configuration, veuillez utiliser l'adresse et le port du serveur comme uri, par exemple
http://localhost:19530
. Si vous activez la fonction d'authentification sur Milvus, utilisez "<votre_nom_d'utilisateur>:<votre_mot_de_passe>" comme jeton, sinon ne définissez pas le jeton.- Si vous utilisez Zilliz Cloud, le service en nuage entièrement géré pour Milvus, réglez les paramètres
uri
ettoken
, qui correspondent au point de terminaison public et à la clé API dans Zilliz Cloud.
Gestion des mémoires d'utilisateur avec Mem0 et Milvus
Ajout d'une mémoire
La fonction add
stocke du texte non structuré dans Milvus en tant que mémoire, en l'associant à un utilisateur spécifique et à des métadonnées facultatives.
Ici, nous ajoutons à Milvus le souvenir d'Alice, "Je travaille à améliorer mes compétences en tennis", ainsi que des métadonnées pertinentes pour le contexte.
# 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': []}
Mise à jour d'un souvenir
Nous pouvons utiliser la valeur de retour de la fonction add
pour récupérer l'ID de la mémoire, ce qui nous permet de mettre à jour cette mémoire avec de nouvelles informations via 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!'}
Obtenir toutes les mémoires d'un utilisateur
La fonction get_all
permet d'afficher toutes les mémoires insérées ou de les filtrer par user_id
dans Milvus.
Notez que nous pouvons voir que la mémoire est passée de "Travailler à améliorer ses compétences en tennis" à "Aime jouer au tennis le week-end".
# 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'}]}
Afficher l'historique des mises à jour des mémoires
Nous pouvons également consulter l'historique des mises à jour de la mémoire en spécifiant l'identifiant de la mémoire qui nous intéresse via la fonction 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'}]
Rechercher une mémoire
Nous pouvons utiliser la fonction search
pour rechercher la mémoire la plus proche de l'utilisateur.
Commençons par ajouter une nouvelle mémoire pour Alice.
new_mem = m.add(
"I have a linear algebra midterm exam on November 20",
user_id="alice",
metadata={"category": "task"},
)
Nous appelons maintenant get_all
en spécifiant l'identifiant de l'utilisateur pour vérifier que nous avons bien deux entrées de mémoire pour l'utilisateur 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'}]}
Nous pouvons maintenant exécuter search
en fournissant query
et user_id
. Notez que nous utilisons par défaut la métrique L2
pour la recherche de similarité, de sorte qu'une petite valeur de score
signifie une plus grande similarité.
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'}]}
Supprimer une mémoire
Nous pouvons également delete
un souvenir en fournissant le memory_id
correspondant.
Nous allons supprimer le souvenir "Aime jouer au tennis le week-end" car son memory_id
a déjà été récupéré, et appeler get_all
pour vérifier que la suppression est réussie.
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'}]}