Vektorspeicher in Azure Cosmos DB for MongoDB (vCore)
Verwenden Sie die integrierte Vektordatenbank in Azure Cosmos DB for MongoDB (vCore), um Ihre KI-basierten Anwendungen nahtlos mit Ihren in Azure Cosmos DB gespeicherten Daten zu verbinden. Diese Integration kann Apps umfassen, die Sie mithilfe von Azure OpenAI-Einbettungen erstellt haben. Mithilfe der nativ integrierten Vektordatenbank können Sie hochdimensionale Vektordaten, die direkt in Azure Cosmos DB for MongoDB (vCore) gespeichert sind, effizient speichern, indizieren und abfragen. Dadurch müssen Sie Ihre Daten nicht in alternative Vektorspeicher übertragen, was zusätzliche Kosten verursachen würde.
Was ist ein Vektorspeicher?
Ein Vektorspeicher oder eine Vektordatenbank ist eine Datenbank zum Speichern und Verwalten von Vektoreinbettungen, mathematischen Darstellungen von Daten in einem hochdimensionalen Raum. In diesem Raum entspricht jede Dimension einem Merkmal der Daten, und zehntausende Dimensionen können verwendet werden, um komplexe Daten darzustellen. Die Position eines Vektors in diesem Raum stellt seine Merkmale dar. Wörter, Ausdrücke oder ganze Dokumente sowie Bilder, Audioinhalte und andere Datentypen können vektorisiert werden.
Wie funktioniert ein Vektorspeicher?
In einem Vektorspeicher werden Vektorsuchalgorithmen verwendet, um Einbettungen zu indizieren und abzufragen. Zu den bekannten Vektorsuchalgorithmen zählen unter anderem „Hierarchical Navigable Small World“ (HNSW), „Inverted File“ (IVF), „DiskANN“ usw. Die Vektorsuche ist eine Methode, mit der Sie ähnliche Elemente basierend auf ihren Datenmerkmalen anstatt exakter Übereinstimmungen in einem Eigenschaftenfeld finden können. Diese Technik ist nützlich für Anwendungsfälle wie die Suche nach ähnlichem Text, das Suchen ähnlicher Bilder, das Abgeben von Empfehlungen oder sogar das Erkennen von Anomalien. Sie wird zum Abfragen der Vektoreinbettungen (Zahlenlisten) Ihrer Daten verwendet, die Sie mit einem Machine Learning-Modell unter Verwendung einer Einbettungs-API erstellt haben. Beispiele für Einbettungs-APIs sind Azure OpenAI Embeddings oder Hugging Face in Azure. Anschließend misst die Vektorsuche den Abstand zwischen den Datenvektoren und Ihrem Abfragevektor. Die Datenvektoren, die Ihrem Abfragevektor am nächsten liegen, sind semantisch am ähnlichsten.
In der integrierten Vektordatenbank in Azure Cosmos DB for MongoDB (vCore) können Einbettungen zusammen mit den ursprünglichen Daten gespeichert, indiziert und abgefragt werden. So vermeiden Sie zusätzliche Kosten für die Replikation der Daten in einer separaten reinen Vektordatenbank. Außerdem bleiben Ihre Vektoreinbettungen und Ihre Originaldaten in dieser Architektur zusammen, was multimodale Datenvorgänge erleichtert und eine höhere Datenkonsistenz, Skalierbarkeit und Leistung ermöglicht.
Durchführen einer Vektorähnlichkeitssuche
Azure Cosmos DB for MongoDB (vCore) bietet robuste Vektorsuchfunktionen, sodass Sie schnell Ähnlichkeitssuchen in komplexen Datasets durchführen können. Um die Vektorsuche in Azure Cosmos DB for MongoDB durchzuführen, müssen Sie zuerst einen Vektorindex erstellen. Azure Cosmos DB unterstützt derzeit drei Typen von Indizes:
- DiskANN (Empfohlen): Ideal für große Datasets, wobei SSDs für eine effiziente Speicherauslastung genutzt werden und gleichzeitig ein hoher Abruf in ANN-Suchen (Approximate Nearest Neighbor) beibehalten wird.
- HNSW: Geeignet für mittelgroße Datasets, die einen hohen Abruf erfordern, mit einer graphbasierten Struktur, die Genauigkeit und Ressourceneffizienz ausgleicht.
- IVF: Verwendet Clustering, um die Suchgeschwindigkeit in umfangreichen Datasets zu optimieren, wobei der Fokus auf Suchen in Zielclustern liegt, um die Leistung zu beschleunigen.
DiskANN-Indizes sind auf M40-Ebenen und höher verfügbar. Um den DiskANN-Index zu erstellen, legen Sie den "kind"
-Parameter auf "vector-diskann"
gemäß folgender Vorlage fest:
{
"createIndexes": "<collection_name>",
"indexes": [
{
"name": "<index_name>",
"key": {
"<path_to_property>": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": <integer_value>,
"similarity": <string_value>,
"maxDegree" : <integer_value>,
"lBuild" : <integer_value>,
}
}
]
}
Feld | Typ | Beschreibung |
---|---|---|
index_name |
Zeichenfolge | Eindeutiger Name des Indexes |
path_to_property |
Zeichenfolge | Pfad zur Eigenschaft, die den Vektor enthält. Dieser Pfad kann eine allgemeine Eigenschaft oder ein Punktnotationspfad zur Eigenschaft sein. Vektoren müssen vom Typ number[] sein, damit sie indiziert und in den Vektorsuchergebnissen verwendet werden. Die Verwendung eines anderen Typs wie double[] verhindert, dass das Dokument indiziert wird. Nicht indizierte Dokumente werden im Ergebnis einer Vektorsuche nicht zurückgegeben. |
kind |
Zeichenfolge | Art des zu erstellenden Vektorindexes. Als Optionen sind vector-ivf , vector-hnsw und vector-diskann verfügbar. |
dimensions |
integer | Anzahl der Dimensionen für Vektorähnlichkeit. DiskANN unterstützt bis zu 2.000 Dimensionen, wobei die zukünftige Unterstützung für 40.000+ geplant ist. |
similarity |
Zeichenfolge | Ähnlichkeitsmetrik, die mit dem Index verwendet werden soll. Mögliche Optionen sind COS (Kosinusabstand), L2 (euklidischer Abstand) oder IP (inneres Produkt). |
maxDegree |
integer | Maximale Anzahl von Kanten pro Knoten im Graph. Dieser Parameter liegt zwischen 20 und 2.048 (Standardwert ist 32). Höhere maxDegree -Werte eignen sich für Datasets mit hohen Dimensionalitäts- und/oder hohen Genauigkeitsanforderungen. |
lBuild |
integer | Legt die Anzahl der in Frage kommenden Nachbarn fest, die während der DiskANN-Indexerstellung ausgewertet werden. Dieser Parameter, der zwischen 10 und 500 liegt (Standardwert ist 50), gleicht Genauigkeit und Rechenaufwand aus: Höhere Werte verbessern die Indexqualität und Genauigkeit, erhöhen aber die Buildzeit. |
Durchführen einer Vektorsuche mit DiskANN
Um eine Vektorsuche durchzuführen, verwenden Sie die $search
-Phase der Aggregationspipeline und führen Sie eine Abfrage mit dem cosmosSearch
-Operator aus. DiskANN ermöglicht leistungsstarke Suchen in umfangreichen Datasets mit optionalen Filtern wie räumlichen oder textbasierten Filtern.
{
"$search": {
"cosmosSearch": {
"path": "<path_to_property>",
"query": "<query_vector>",
"k": <num_results_to_return>,
"filter": {"$and": [
{ "<attribute_1>": { "$eq": <value> } },
{"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
]}
}
}
},
Feld | Typ | Beschreibung |
---|---|---|
lSearch |
integer | Gibt die Größe der dynamischen Kandidatenliste für die Suche an. Der Standardwert ist 40 , mit einem konfigurierbaren Bereich von 10 bis 1000 . Das Erhöhen des Werts verbessert den Abruf, kann jedoch die Suchgeschwindigkeit verringern. |
k |
integer | Definiert die Anzahl der zurückzugebenden Suchergebnisse. Der k -Wert muss kleiner oder gleich lSearch sein. |
Aktivieren von DiskANN in einem neuen Cluster
Um den Vektorindex DiskANN für einen neu bereitgestellten Cluster mit Azure Cosmos DB for MongoDB (vCore) zu aktivieren, führen Sie die folgenden Schritte aus, um eine Registrierung auf Clusterebene über die Azure-Befehlszeilenschnittstelle durchzuführen:
- Anmelden bei der Azure CLI
az login
- Rufen Sie die aktuellen Einstellungen für die Featureflags in Ihrem Cluster ab. Dadurch wird sichergestellt, dass beim Hinzufügen des neuen Features vorhandene Flags beibehalten werden.
az resource show --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version>
- Fügen Sie das Flag
DiskANNIndex
der Liste der Previewfunktionen hinzu, ohne vorhandene zu entfernen.
az resource patch --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version> --properties "{\"previewFeatures\": [\"GeoReplicas\", \"DiskANNIndex\"]}"
Beispiel für die Verwendung eines DiskANN-Index mit Filtern
Hinzufügen von Vektoren zu Ihrer Datenbank
Um die Vektorsuche mit räumlichen Filtern zu verwenden, fügen Sie Dokumente hinzu, die sowohl Vektoreinbettungen als auch Standortkoordinaten enthalten. Sie können die Einbettungen erstellen, indem Sie Ihr eigenes Modell, Azure OpenAI Embeddings oder eine andere API (z. B. Hugging Face on Azure) verwenden.
from pymongo import MongoClient
client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]
documents = [
{"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
{"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
{"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
{"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]
collection.insert_many(documents)
Erstellen eines DiskANN-Vektorindex
Im folgenden Beispiel wird veranschaulicht, wie Sie einen DiskANN-Vektorindex mit Filterfunktionen einrichten. Dies umfasst das Erstellen des Vektorindex für die Ähnlichkeitssuche, das Hinzufügen von Dokumenten mit Vektor- und Geoeigenschaften sowie das Indizieren von Feldern für eine zusätzliche Filterung.
db.command({
"createIndexes": "testCollection",
"indexes": [
{
"name": "DiskANNVectorIndex",
"key": {
"contentVector": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": 3,
"similarity": "COS",
"maxDegree": 32,
"lBuild": 64
}
},
{
"name": "is_open",
"key": {
"is_open": 1
}
},
{
"name": "locationIndex",
"key": {
"location": 1
}
}
]
})
Mit diesem Befehl wird ein DiskANN-Vektorindex für das contentVector
-Feld in exampleCollection
erstellt, wodurch Ähnlichkeitssuchen aktiviert werden. Außerdem wird Folgendes hinzugefügt:
- Ein Index für das
is_open
-Feld, sodass Sie Ergebnisse basierend auf dem Öffnungsstatus von Unternehmen filtern können. - Ein räumlicher Index für das
location
-Feld, um nach geografischer Nähe zu filtern.
Durchführen einer Vektorsuche
Um Dokumente mit ähnlichen Vektoren innerhalb eines bestimmten geografischen Radius zu finden, geben Sie queryVector
für die Ähnlichkeitssuche an, und fügen Sie einen räumlichen Filter ein.
query_vector = [0.52, 0.28, 0.12]
pipeline = [
{
"$search": {
"cosmosSearch": {
"path": "contentVector",
"vector": query_vector,
"k": 5,
"filter": {
"$and": [
{"is_open": {"$eq": 1}},
{"location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
]
}
}
}
}
]
results = list(collection.aggregate(pipeline))
for result in results:
print(result)
In diesem Beispiel gibt die Vektorähnlichkeitssuche die obersten k
nächstgelegenen Vektoren basierend auf der angegebenen COS
-Ähnlichkeitsmetrik zurück und filtert Ergebnisse, um nur geöffnete Unternehmen innerhalb eines Radius von 100 Meilen einzuschließen.
[
{
similarityScore: 0.9745354109084544,
document: {
_id: ObjectId("645acb54413be5502badff94"),
name: 'Eugenia Lopez',
bio: 'CEO of AdventureWorks',
is_open: 1,
location: [-118.9865, 34.0145],
contentVector: [0.52, 0.20, 0.23]
}
},
{
similarityScore: 0.9006955671333992,
document: {
_id: ObjectId("645acb54413be5502badff97"),
name: 'Rory Nguyen',
bio: 'President of Our Planet initiative',
is_open: 1,
location: [-119.7302, 34.4005],
contentVector: [0.91, 0.76, 0.83]
}
}
]
Dieses Ergebnis zeigt die Dokumente, die queryVector
am ähnlichsten sind, in einem Radius von 100 Meilen und auf geöffnete Unternehmen beschränkt. Jedes Ergebnis enthält den Ähnlichkeitswert und Metadaten, die zeigen, wie DiskANN in Cosmos DB for MongoDB kombinierte Vektor- und Geoabfragen für erweiterte, standortabhängige Sucherfahrungen unterstützt.
Abrufen von Vektorindexdefinitionen
Verwenden Sie den Befehl listIndexes
, um Ihre Vektorindexdefinition aus der Sammlung abzurufen:
db.exampleCollection.getIndexes();
In diesem Beispiel wird vectorIndex
mit allen cosmosSearch
-Parametern zurückgegeben, die zum Erstellen des Index verwendet wurden:
[
{ v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
{
v: 2,
key: { vectorContent: 'cosmosSearch' },
name: 'vectorSearchIndex',
cosmosSearch: {
kind: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
numLists: 3,
similarity: 'COS',
dimensions: 3
},
ns: 'test.exampleCollection'
}
]
Gefilterte Vektorsuche (Vorschau)
Sie können jetzt Vektorsuchen mit jedem unterstützten Abfragefilter wie $lt
, $lte
, $eq
, $gte
$neq
, $gt
, $in
, $nin
und $regex
durchführen. Aktivieren Sie das Feature "Filtervektorsuche" auf der Registerkarte "Vorschaufeatures" Ihres Azure-Abonnements. Weitere Informationen zu Previewfunktionen finden Sie hier.
Zunächst müssen Sie zusätzlich zu einem Vektorindex einen Index für Ihren Filter definieren. Sie können z. B. den Filterindex für eine Eigenschaft definieren
db.runCommand({
"createIndexes": "<collection_name",
"indexes": [ {
"key": {
"<property_to_filter>": 1
},
"name": "<name_of_filter_index>"
}
]
});
Als Nächstes können Sie ihrer Vektorsuche den "filter"
Begriff wie unten gezeigt hinzufügen. In diesem Beispiel sucht der Filter nach Dokumenten, bei denen sich die "title"
Eigenschaft nicht in der Liste der ["not in this text", "or this text"]
vorkommt.
db.exampleCollection.aggregate([
{
'$search': {
"cosmosSearch": {
"vector": "<query_vector>",
"path": <path_to_vector>,
"k": num_results,
"filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
},
"returnStoredSource": True }},
{'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);
Wichtig
Während die Filtervektorsuche in der Vorschau angezeigt wird, müssen Sie ihre Vektorindexparameter möglicherweise anpassen, um eine höhere Genauigkeit zu erzielen. Wenn Sie beispielsweise m
, efConstruction
, oder efSearch
erhöhen, wenn Sie HNSW verwenden, oder numLists
, oder nProbes
wenn Sie IVF verwenden, kann dies zu besseren Ergebnissen führen. Sie sollten Ihre Konfiguration von der Anwendung testen, um sicherzustellen, dass die Ergebnisse zufriedenstellend sind.
Verwenden von LLM-Orchestrierungstools
Verwenden als Vektordatenbank mit semantischem Kernel
Verwenden Sie Semantic Kernel, um Ihren Informationsabruf von Azure Cosmos DB für MongoDB vCore und Ihre LLM zu koordinieren. Hiererhalten Sie weitere Informationen.
Verwenden als Vektordatenbank mit LangChain
Verwenden Si LangChain verwenden, um Ihren Informationsabruf von Azure Cosmos DB für MongoDB vCore und Ihre LLM zu koordinieren. Hiererhalten Sie weitere Informationen.
Verwenden als semantischer Cache mit LangChain
Verwenden Sie LangChain und Azure Cosmos DB for MongoDB (vCore), um das semantische Zwischenspeichern zu orchestrieren, indem Sie zuvor aufgezeichnete LLM-Antworten verwenden, mit denen Sie die Kosten der LLM-API einsparen und die Latenz für Antworten reduzieren können. Hier erhalten Sie weitere Informationen.
Features und Einschränkungen
- Unterstützte Abstandsmetriken: L2 (euklidisch), inneres Produkt und Kosinus.
- Unterstützte Indizierungsmethoden: IVFFLAT, HNSW und DiskANN (Vorschau)
- Indizierungsvektoren mit bis zu 2.000 Dimensionen sind möglich.
- Die Indizierung gilt nur für einen Vektor pro Dokument.
- Pro Vektorpfad kann nur ein Index erstellt werden.
Zusammenfassung
In diesem Leitfaden wurde veranschaulicht, wie Sie einen Vektorindex erstellen, Dokumente mit Vektordaten hinzufügen, eine Ähnlichkeitssuche durchführen und die Indexdefinition abrufen. Mithilfe unserer integrierten Vektordatenbank können Sie hochdimensionale Vektordaten effizient direkt im virtuellen Kern von Azure Cosmos DB for MongoDB speichern, indizieren und abfragen. Sie ermöglicht es Ihnen, das volle Potenzial Ihrer Daten mithilfe von Vektoreinbettungen zu nutzen und präzisere, effizientere und leistungsfähigere Anwendungen zu erstellen.
Zugehöriger Inhalt
- .NET RAG Pattern Referenzlösung
- .NET-Tutorial: Chatbot für Rezepte
- C#-RAG-Muster: Integrieren von OpenAI Services mit Cosmos
- Python RAG-Muster: Azure-Produktchatbot
- Tutorial für Python-Notebook – Integration der Vektordatenbank über LangChain
- Tutorial für Python-Notebook – LLM-Caching-Integration über LangChain
- Python – Llamaindex-Integration
- Python – Integration des semantischen Kernelspeichers