Erste Schritte mit Mem0 und Milvus
Mem0 ist eine intelligente Speicherebene für KI-Anwendungen, die personalisierte und effiziente Interaktionen ermöglicht, indem sie Benutzerpräferenzen speichert und sich im Laufe der Zeit kontinuierlich anpasst. Mem0 ist ideal für Chatbots und KI-gesteuerte Tools und schafft nahtlose, kontextbezogene Erlebnisse.
In diesem Tutorial werden wir die grundlegenden Mem0-Speicherverwaltungsvorgänge - Hinzufügen, Abrufen, Aktualisieren, Suchen, Löschen und Verfolgen des Speicherverlaufs - unter Verwendung von Milvus, einer leistungsstarken Open-Source-Vektordatenbank, die eine effiziente Speicherung und Abfrage ermöglicht, behandeln. Diese praktische Einführung führt Sie durch die grundlegenden Speicheroperationen und hilft Ihnen, personalisierte KI-Interaktionen mit Mem0 und Milvus zu erstellen.
Vorbereitung
Download der erforderlichen Bibliotheken
$ pip install mem0ai pymilvus
Wenn Sie Google Colab verwenden, müssen Sie möglicherweise die Runtime neu starten, um die soeben installierten Abhängigkeiten zu aktivieren (klicken Sie auf das Menü "Runtime" am oberen Rand des Bildschirms und wählen Sie "Sitzung neu starten" aus dem Dropdown-Menü).
Mem0 mit Milvus konfigurieren
Wir werden in diesem Beispiel OpenAI als LLM verwenden. Sie sollten den Api-Schlüssel OPENAI_API_KEY
als Umgebungsvariable vorbereiten.
import os
os.environ["OPENAI_API_KEY"] = "sk-***********"
Nun können wir Mem0 so konfigurieren, dass es Milvus als Vektorspeicher verwendet
# 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)
- Wenn Sie nur eine lokale Vektordatenbank für kleine Datenmengen oder Prototypen benötigen, ist die Einstellung der Uri als lokale Datei, z. B.
./milvus.db
, die bequemste Methode, da sie automatisch Milvus Lite verwendet, um alle Daten in dieser Datei zu speichern.- Wenn Sie große Datenmengen haben, z. B. mehr als eine Million Vektoren, können Sie einen leistungsfähigeren Milvus-Server auf Docker oder Kubernetes einrichten. Bei dieser Einrichtung verwenden Sie bitte die Serveradresse und den Port als Uri, z. B.
http://localhost:19530
. Wenn Sie die Authentifizierungsfunktion auf Milvus aktivieren, verwenden Sie "<Ihr_Benutzername>:<Ihr_Passwort>" als Token, andernfalls setzen Sie das Token nicht.- Wenn Sie Zilliz Cloud, den vollständig verwalteten Cloud-Service für Milvus, verwenden, passen Sie
uri
undtoken
an, die dem öffentlichen Endpunkt und dem API-Schlüssel in Zilliz Cloud entsprechen.
Verwaltung von Benutzerspeichern mit Mem0 und Milvus
Hinzufügen eines Speichers
Die Funktion add
speichert unstrukturierten Text in Milvus als Speicher und verknüpft ihn mit einem bestimmten Benutzer und optionalen Metadaten.
Hier fügen wir Alices Erinnerung "Ich arbeite an der Verbesserung meiner Tennisfähigkeiten" zusammen mit relevanten Metadaten für den Kontext zu Milvus hinzu.
# 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': []}
Aktualisieren einer Erinnerung
Wir können den Rückgabewert der Funktion add
verwenden, um die Speicher-ID abzurufen, so dass wir diesen Speicher mit neuen Informationen über update
aktualisieren können.
# 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!'}
Alle Speicher für einen Benutzer abrufen
Mit der Funktion get_all
können wir alle eingefügten Speicher anzeigen oder nach user_id
in Milvus filtern.
Wie wir sehen, hat sich die Erinnerung von "Ich arbeite daran, meine Tennisfähigkeiten zu verbessern" in "Ich spiele am Wochenende gerne Tennis" geändert.
# 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'}]}
Verlauf der Speicheraktualisierung anzeigen
Wir können uns auch den Verlauf der Speicheraktualisierung ansehen, indem wir mit der Funktion history
angeben, an welcher memory_id wir interessiert sind.
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'}]
Speicher suchen
Mit der Funktion search
können wir nach dem für den Benutzer relevantesten Speicherplatz suchen.
Beginnen wir mit dem Hinzufügen eines weiteren Speichers für Alice.
new_mem = m.add(
"I have a linear algebra midterm exam on November 20",
user_id="alice",
metadata={"category": "task"},
)
Nun rufen wir get_all
unter Angabe der user_id auf, um zu überprüfen, ob wir tatsächlich 2 Speichereinträge für den Benutzer Alice haben.
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'}]}
Wir können nun search
ausführen, indem wir query
und user_id
bereitstellen. Beachten Sie, dass wir standardmäßig die Metrik L2
für die Ähnlichkeitssuche verwenden, so dass eine kleinere score
eine größere Ähnlichkeit bedeutet.
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'}]}
Speicher löschen
Wir können auch delete
einen Speicher löschen, indem wir die entsprechende memory_id
angeben.
Wir löschen den Speicher "Spielt am Wochenende gerne Tennis", da sein memory_id
bereits abgerufen wurde, und rufen get_all
auf, um zu überprüfen, ob die Löschung erfolgreich war.
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'}]}