Come iniziare con Mem0 e Milvus
Mem0 è un livello di memoria intelligente per applicazioni di intelligenza artificiale, 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: aggiunta, recupero, aggiornamento, ricerca, cancellazione e tracciamento della cronologia della memoria, utilizzando Milvus, un database vettoriale open source ad alte prestazioni che consente una memorizzazione e un recupero efficienti. 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
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 "<nome_utente>:<password>" come token, altrimenti non impostare il token.- Se si utilizza Zilliz Cloud, il servizio cloud completamente gestito per Milvus, regolare
uri
etoken
, 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'}]}