Come iniziare con Mem0 e Milvus
Mem0 è un livello di memoria intelligente per applicazioni AI, progettato per offrire interazioni personalizzate ed efficienti conservando le preferenze dell'utente e adattandosi continuamente nel tempo. Ideale per i chatbot e gli strumenti basati sull'intelligenza artificiale, Mem0 crea esperienze senza soluzione di continuità e consapevoli del contesto.
In questo tutorial, verranno illustrate le operazioni essenziali di gestione della memoria di Mem0: inserimento, recupero, aggiornamento, ricerca, cancellazione e tracciamento della cronologia della memoria, utilizzando Milvus, un database vettoriale open source ad alte prestazioni che consente di memorizzare e recuperare in modo efficiente. Questa introduzione pratica vi guiderà attraverso le operazioni di memoria fondamentali per aiutarvi a costruire interazioni AI personalizzate con Mem0 e Milvus.
Preparazione
Scaricare le librerie necessarie
$ pip install mem0ai pymilvus milvus-lite
Se si utilizza Google Colab, per abilitare le dipendenze appena installate potrebbe essere necessario riavviare il runtime (fare clic sul menu "Runtime" nella parte superiore dello schermo e selezionare "Restart session" dal menu a discesa).
Configurare Mem0 con Milvus
In questo esempio utilizzeremo OpenAI come LLM. È necessario preparare la chiave api OPENAI_API_KEY come variabile d'ambiente.
import os
os.environ["OPENAI_API_KEY"] = "sk-***********"
Ora possiamo configurare Mem0 per utilizzare Milvus come archivio vettoriale.
# 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)
- Se si ha bisogno di un database vettoriale locale solo per dati su piccola scala o per la prototipazione, impostare l'uri come un file locale, ad esempio
./milvus.db, è il metodo più conveniente, poiché utilizza automaticamente Milvus Lite per memorizzare tutti i dati in questo file.- Se si dispone di una grande quantità di dati, ad esempio più di un milione di vettori, è possibile configurare un server Milvus più performante su Docker o Kubernetes. In questa configurazione, utilizzare l'indirizzo e la porta del server come uri, ad esempio
http://localhost:19530. Se si attiva la funzione di autenticazione su Milvus, utilizzare ": " come token, altrimenti non impostare il token. - Se si utilizza Zilliz Cloud, il servizio cloud completamente gestito per Milvus, impostare
urietoken, che corrispondono all'endpoint pubblico e alla chiave API di Zilliz Cloud.
Gestione delle memorie utente con Mem0 e Milvus
Aggiunta di una memoria
La funzione add memorizza un testo non strutturato in Milvus come memoria, associandolo a un utente specifico e a metadati opzionali.
In questo caso, stiamo aggiungendo a Milvus la memoria di Alice, "sto lavorando per migliorare le mie capacità tennistiche", insieme ai metadati rilevanti per il contesto.
# 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': []}
Aggiornare una memoria
Possiamo usare il valore di ritorno della funzione add per recuperare l'ID della memoria, in modo da aggiornare questa memoria con nuove informazioni tramite 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!'}
Ottenere tutte le memorie di un utente
È possibile utilizzare la funzione get_all per visualizzare tutte le memorie inserite o per filtrare user_id in Milvus.
Si noti che la memoria è cambiata da "Lavora per migliorare le sue capacità tennistiche" a "Ama giocare a tennis nei fine settimana".
# 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'}]}
Visualizzazione della cronologia degli aggiornamenti della memoria
È possibile visualizzare la cronologia degli aggiornamenti della memoria specificando l'ID memoria che ci interessa tramite la funzione 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'}]
Ricerca nella memoria
Possiamo usare la funzione search per cercare la memoria più correlata all'utente.
Iniziamo aggiungendo un'altra memoria per Alice.
new_mem = m.add(
"I have a linear algebra midterm exam on November 20",
user_id="alice",
metadata={"category": "task"},
)
Ora chiamiamo get_all specificando l'ID utente per verificare che ci siano effettivamente 2 voci di memoria per l'utente 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'}]}
Ora possiamo eseguire search fornendo query e user_id. Si noti che per impostazione predefinita si utilizza la metrica L2 per la ricerca della somiglianza, quindi una score più piccola significa una maggiore somiglianza.
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'}]}
Cancellare la memoria
Possiamo anche delete una memoria fornendo il corrispondente memory_id.
Cancelleremo la memoria "Likes to play tennis on weekends", poiché il suo memory_id è già stato recuperato, e chiameremo get_all per verificare che la cancellazione sia avvenuta con successo.
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'}]}