Kurs
Die Vektorindizierung ist zu einem super Tool für die Entwicklung moderner Anwendungen geworden. Damit kannst du schnelle und effizienteÄhnlichkeitssuchen mit Vektor-Einbettungen ( ) für hochdimensionale Daten durchführen, die oft als Vektor-Einbettungenbezeichnet werden. Diese Funktion ist jetzt direkt in MongoDB eingebaut, sodass Entwickler komplexe Features direkt in ihren Datenbanken erstellen können.
Dieser Artikel ist ein praktischer Leitfaden zum Einrichten und Verwenden der Vektorindizierung in MongoDB. Wir gehen den Prozess Schritt für Schritt durch, von der Erstellung deines ersten Index bis zur Ausführung komplexer Abfragen. Du lernst auch bewährte Methoden kennen und schaust dir ein echtes Beispiel für die Entwicklung eines Produktempfehlungssystems für einen E-Commerce-Shop an.
Was ist Vektorindizierung?
Im Grunde istdie Vektorindizierung eine Technik, um Vektor-Einbettungen zu organisieren und so die Suche nach Ähnlichkeiten schneller zu machen. Im Gegensatz zu herkömmlichen Indizes, die mit Skalarwerten (wie Zahlen oder Zeichenfolgen) arbeiten, ist ein Vektorindex darauf ausgelegt, „benachbarte” Vektoren in einem mehrdimensionalen Raum zu finden.
Vektoreinbettungen sind numerische Darstellungen komplexer Daten, wie zum Beispiel Text, Bilder und Audio. Zum Beispiel kann eine Produktbeschreibung in einen Vektor umgewandelt werden, wobei ähnliche Produkte Vektoren haben, die räumlich näher beieinander liegen. Diese Nähe ermöglicht coole Anwendungen wie:
- Semantische Suche: Produkte finden, die auf der Bedeutung einer Suchanfrage basieren, nicht nur auf Keyword-Übereinstimmungen.
- Empfehlungssysteme: Leuten Produkte oder Inhalte vorschlagen, die zu ihren Vorlieben passen.
- Bilderkennung: Ähnliche Bilder in einer riesigen Datenbank finden.
Einrichten der Vektorindizierung in MongoDB
Um loszulegen, brauchst du einen MongoDB Atlas-Cluster. Die Vektorsuche ist eine Cloud-native Funktion. Du kannst diese Funktion entweder auf MongoDB Atlas oder in der kostenlosen Community Editionausprobieren. In diesem Artikel nutzen wir MongoDB Atlas.
Schritt 1: Erstelle einen MongoDB Atlas-Cluster
Mach einen neuen Cluster in MongoDB Atlas. Die kostenlose M0-Stufe reicht für Testzwecke völlig aus.
Schritt 2: Erstell eine Sammlung und füge Daten ein
Verbinde dich zuerst über die MongoDB-Shell (mongosh) oder deinen bevorzugten Treiber mit deinem Cluster. Dann mach eine neue Sammlung namens„ -Produkte“ und füge Dokumente mit einem Vektorfeld ein. Jedes Dokument sollte ein Produkt darstellen und eineingebettetes Feld„ “ haben, das die Vektordarstellung des Produkts enthält.
Hier ist ein ausführlicheres Beispiel mit drei verschiedenen Produktdokumenten, jedes mit einem zufällig generierten Vektor, um zu zeigen, wie die Daten aussehen könnten. In der Praxis würdest du diese durch Einbettungen ersetzen, die von einem KI-Modell generiert werden.
db.products.insertMany([
{
"name": "Wireless Noise-Canceling Headphones",
"category": "Electronics",
"description": "Premium over-ear headphones with active noise cancellation and a 30-hour battery life.",
"price": 249.99,
"embedding": [0.012, 0.054, 0.089, -0.031, 0.067, 0.021, -0.045, 0.098, 0.011, -0.076, 0.033, -0.015, -0.087, 0.059, 0.009, 0.042]
},
{
"name": "Smart Coffee Maker",
"category": "Home Goods",
"description": "Programmable coffee machine that can be controlled from your smartphone. Brews up to 12 cups.",
"price": 129.99,
"embedding": [0.056, 0.023, 0.011, 0.078, -0.029, 0.041, 0.087, -0.019, 0.065, 0.002, -0.093, 0.018, 0.057, -0.041, 0.022, 0.064]
},
{
"name": "Ultra-light Backpack",
"category": "Travel",
"description": "Durable and lightweight backpack with multiple compartments, perfect for hiking or daily commutes.",
"price": 79.99,
"embedding": [-0.072, 0.034, 0.019, 0.068, -0.055, 0.081, 0.004, -0.025, 0.039, 0.016, -0.044, 0.062, 0.008, 0.071, -0.013, 0.053]
}
]);
Jedes Dokument hat einen Namen, eine Kategorie, eine Beschreibung und einen Preis, zusammen mit dem wichtigen Feld„Einbettungs “. Die„ -Einbettung“ ist ein Array mit einer festen Anzahl von Zahlen, das die Bedeutung der Produktbeschreibung zeigt. Die Größe dieses Arrays, oderdie Dimensionalität von „ “ (), hängt vom Modell ab, das zum Erstellen der Einbettungen verwendet wurde. In diesem Beispiel beträgt die Dimensionalität 128.
Das sind die Daten, auf denen wir unseren Vektorindex aufbauen werden, um eine semantische Suche zu ermöglichen. semantische Suche und Produktempfehlungen.
Schritt 3: Erstell einen Vektorindex
Sobald du deine Daten mit den Einbettungen in einer Sammlung hast, musst du als Nächstes einen Vektorindex erstellen. Dieser Index ist super wichtig, um schnelle und effiziente Ähnlichkeitssuchen zu ermöglichen. Der folgende Befehl nutzt createSearchIndex, um einen Vektorindex für das Einbettungsfeld zu erstellen .
db.products.createSearchIndex({
"name": "vector_index",
"definition": {
"mappings": {
"dynamic": true,
"fields": [
{
"type": "vector",
"path": "embedding",
"numDimensions": 128,
"similarity": "cosine"
}
]
},
}
});
Die Konfiguration verstehen
Die Indexkonfiguration wird in den Feldern des Definitionsobjekts „ “ festgelegt . Diese Struktur ist der Plan, wie MongoDB Atlas deine Vektoren für einen schnellen Abruf organisiert.
Die wichtigsten Parameter für die Vektorindizierung sind:
- Pfad: Hier wird der genaue Name des Feldes in deinen Dokumenten angegeben, das das Vektorarray enthält, in diesem Beispiel „ „embedding ”.
- numDimensions: Das ist der wichtigste Parameter. Die Anzahl der Elemente in der Eingabe ( ) muss genau mit der Anzahl der Elemente im Vektorarrayübereinstimmen, das dein Einbettungsmodell erzeugt (z. B. 128, 768, 1536).
- Ähnlichkeits: Das legt die mathematische Metrik fest, die benutzt wird, um die „Nähe“ zwischen zwei Vektoren während einer Suche zu berechnen.
- Kosinus wird normalerweise für die semantische Suche empfohlen, weil es den Winkel zwischen Vektoren misst und sich dabei auf die semantische Richtung konzentriert.
- Andere Optionen sind euklidische (Geradenabstand) und dotProduct.
Optionale Leistungsparameter
Für fortgeschrittene Leistungsoptimierungkannst du bei MongoDB Atlas optionale Parameter angeben, um Speicherplatz und Arbeitsspeicher zu optimieren:
- Quantisierungs: Dieser Parameter wird benutzt, um deine Vektoren zu komprimieren, was die Indexgröße und den Speicherbedarf deutlich reduziert.
- skalar oder binär kann angegeben werden, um die Vektoren zu quantisieren, wobei ein kleiner Teil der Wiederauffindbarkeit gegen erhebliche Vorteile bei Speicherplatz und Geschwindigkeit eingetauscht wird.
Vektorsuchabfragen durchführen
Sobald der Index erstellt ist, kannst du die Funktion $vectorSearch Aggregation , um Ähnlichkeitsabfragen durchzuführen.
Lass uns die Produkte finden, die einem Suchvektor am ähnlichsten sind. Diese Abfrage kommt normalerweise von der Suche, die ein Nutzer eingibt.
// A sample query vector, generated from a user's search for "wireless audio device"
const queryVector = [0.11, 0.22, 0.33, ...];
db.products.aggregate([
{
"$vectorSearch": {
"queryVector": queryVector,
"path": "embedding",
"numCandidates": 100, // Number of documents to scan
"limit": 5 // Number of results to return
}
},
{
"$project": {
"name": 1,
"description": 1,
"_id": 0
}
}
]);
- queryVector: Der Vektor, den du suchst.
- Pfad: Der Name des Feldes, das die Vektor-Einbettungen enthält.
- Anzahl der Kandidaten: Die Anzahl der Dokumente, die du in den Index einscannen willst. Eine höhere Zahl macht es genauer, aber die Wartezeit wird länger.
- limit: Die Anzahl der besten Ergebnisse, die zurückgegeben werden sollen.
Das $project ist optional, aber nützlich, um die Ausgabe zu gestalten und die Vektordaten aus dem Ergebnis rauszunehmen.
Tipps für die Vektorindizierung
Wenn du deinen Vektorindex für optimale Leistung anpasst, musst du Genauigkeit und Geschwindigkeitabwägen . Der Schlüssel liegt darin, die Parameter des Indexes an deinen spezifischen Datensatz und deine Leistungsziele anzupassen.
Die richtige Ähnlichkeitsmetrik auswählen
Die Wahl der Metrik ist echt wichtig, weil sie bestimmt, wie „ähnlich“ zwei Vektoren sind. Du kannst die MongoDB-Dokumentation, um mehr über die Felder zu erfahren.
- Kosinus: Am besten für semantische Ähnlichkeit, vor allem bei Texten. Es misst den Winkel zwischen Vektoren, ohne auf ihre Länge zu achten. Das ist echt wichtig für Modelle, bei denen die Vektorlänge nicht so wichtig ist.
- Euklidische: Misst die Entfernung in gerader Linie zwischen zwei Vektoren. Benutz das, wenn die Größe (oder Länge) der Vektoren für ihre Bedeutung wichtig ist, wie zum Beispiel bei bestimmten Datentypen, bei denen ein größerer Wert ein stärkeres Merkmal bedeutet.
- dotProduct: Berechnet das Skalarprodukt zweier Vektoren. Diese Kennzahl wird oft für Empfehlungssysteme benutzt. Wenn Vektoreinbettungen auf eine Länge von 1 normalisiert werden, ist das Skalarprodukt funktional gleichbedeutend mit der Kosinusähnlichkeit.
Einbettungsdimensionen verwalten
Der Parameter „Dimensions“ ist super wichtig und muss genau mit der Ausgabe deines Einbettungsmodellsübereinstimmen. Ein häufiger Fehler ist, eine Zahl zu wählen, die nicht mit dem Ergebnis des Modells übereinstimmt. Ein Modell mit mehr Dimensionen kann mehr Details erfassen, führt aber zu einem größeren Index und möglicherweise langsameren Abfragen. Schau immer in der Dokumentation deines Modells nach, um die Dimensionen zu checken (z. B. gibt OpenAI's text-embedding-ada-002 1536 Dimensionen aus).
Indexoptimierung
Die Parameter „numCandidates“ und „numLists“ sind echt wichtig, um Geschwindigkeit und Genauigkeit zu balancieren . Eine gute Faustregel ist, mit einem niedrigenWert für numCandidates zu starten und ihn zu erhöhen, bis du eine zufriedenstellende Genauigkeit erreichst. Du kannst auch mit verschiedenen Werten fürnumLists in für ivf-Indizes rumprobieren, um den optimalen Wert für deinen Datensatz zu finden.
Beispiel für einen Anwendungsfall: Ein einfaches Empfehlungssystem aufbauen
Lass uns diese Konzepte mal auf ein praktisches Beispiel anwenden: ein Produktempfehlungssystem für den E-Commerce.
Schritt 1: Produktdaten mit Einbettungen speichern
Zuerst speichern wir Produktnamen, Kategorien und eine Vektoreinbettung für jedes Produkt. Die Einbettung kann aus der Beschreibung oder den Funktionen des Produkts gemacht werden.
db.products.insertMany([
{
"name": "Smart Speaker",
"category": "Electronics",
"embedding": [0.8, 0.9, 0.1, ...]
},
{
"name": "Wireless Earbuds",
"category": "Electronics",
"embedding": [0.7, 0.8, 0.2, ...]
},
{
"name": "Leather Wallet",
"category": "Fashion",
"embedding": [0.1, 0.2, 0.9, ...]
}
]);
Schritt 2: Erstelle einen Vektorindex fürdie Einbettung „ “
db.products.createSearchIndex({
"name": "vector_index",
"definition": {
"mappings": {
"fields": [
{
"type": "vector",
"path": "embedding", // The field containing the vectors
"numDimensions": 128, // The correct field name is 'numDimensions'
"similarity": "cosine" // The correct field name is 'similarity'
// Index algorithm (like HNSW) is managed automatically by Atlas
}
]
}
}
});
Schritt 3: Nachfrage nach ähnlichen Produkten
Jetzt schauen wir mal nach Produkten, die dem Smart Speaker ähnlich sind. Wir nehmen die Einbettung für Smart Speaker als unseren Abfragevektor.
const smartSpeakerEmbedding = [0.8, 0.9, 0.1, ...];
db.products.aggregate([
{
"$vectorSearch": {
"queryVector": smartSpeakerEmbedding,
"path": "embedding",
"numCandidates": 50,
"limit": 3
}
},
{
"$project": {
"name": 1,
"category": 1,
"_id": 0
}
}
]);
Diese Abfrage zeigt die drei Produkte an, deren Vektor-Einbettungen der Einbettung des Smart Speakers am nächsten sind, und empfiehlt so ähnliche Artikel wie kabellose Ohrhörer.
Fazit
Die Vektorsuchfunktionen von MongoDB eröffnen neue Möglichkeiten für die Entwicklung intelligenter und personalisierter Anwendungen. Durch die direkte Integration der Vektorindizierung in die Datenbank macht MongoDB die Architektur einfacher, sodass man Daten leichter verwalten und schnelle Ähnlichkeitssuchen durchführen kann.
Mit der Kraft der Vektorsuche kannst du über das einfache Abgleichen von Schlüsselwörtern hinausgehen und Funktionen erstellen, die den Kontext und die Bedeutung deiner Daten verstehen. Probier doch mal die kostenlose Version von MongoDB Atlas aus. kostenlosen Version von MongoDB Atlas und zu sehen, wie Vektorindizierung deine Anwendungen verbessern kann.
Häufig gestellte Fragen
Was ist eine Vektoreinbettung und warum braucht man sie für die Vektorsuche?
Eine Vektoreinbettung ist eine numerische Darstellung von Daten wie Text oder Bildern. Es wird für die Vektorsuche gebraucht, weil es der Datenbank ermöglicht, die semantische Ähnlichkeit zwischen Elementen zu messen, indem es den Abstand zwischen ihren Vektoren berechnet und so über den einfachen Abgleich von Schlüsselwörtern hinausgeht.
Brauche ich eine bestimmte MongoDB-Version, um die Vektorsuche zu nutzen?
Ja. Die Vektorsuche ist eine integrierte Funktion von MongoDB Atlas, der Cloud-basierten Version von MongoDB. Es ist nicht in der Community- oder On-Premise-Edition der Datenbank verfügbar.
Muss ich Vektor-Einbettungen selbst erstellen?
Ja, du musst die Vektor-Einbettungen für deine Daten erstellen, bevor du sie in MongoDB speichern und einen Vektorindex erstellen kannst. MongoDB macht diese Einbettungen nicht für dich. Normalerweise nutzt man einen Drittanbieter-Dienst oder ein vortrainiertes Modell von einer Plattform wie OpenAI, Hugging Face oder Google AI, um Texte, Bilder oder andere Daten in numerische Vektoren umzuwandeln.
Kann ich die Vektorsuche mit anderen MongoDB-Abfragen kombinieren?
Ja, das kannst du. Die Vektorsuche ist eine Aggregationsstufe ($vectorSearch), was heißt, dass du sie in einer größeren MongoDB-Aggregationspipeline verwenden kannst. Damit kannst du die Vektorsuche mit anderen coolen Funktionen wie $match, $project, $limit und $lookup kombinieren, um komplexe Abfragen zu erstellen, die Filtern, Sortieren und Datenanreicherung in einem einzigen Vorgang erledigen. Diese Funktion heißt Hybridsuche und ist super wichtig, um echte Anwendungen zu entwickeln.
Was ist der Unterschied zwischen den Indextypen IVF und HNSW?
Sowohl IVF als auch HNSW sind Algorithmen, die für die Suche nach dem ungefähren nächsten Nachbarn (ANN) verwendet werden. Der Hauptunterschied ist, wie sie die Daten organisieren.
Karen ist eine Dateningenieurin mit einer Leidenschaft für den Aufbau skalierbarer Datenplattformen. Sie hat Erfahrung mit der Automatisierung von Infrastrukturen mit Terraform und freut sich darauf, ihre Erfahrungen in Blogbeiträgen und Tutorials zu teilen. Karen ist eine Community-Builderin und setzt sich leidenschaftlich für die Förderung von Verbindungen zwischen Datenexperten ein.