Vektorspeicher in Azure Cosmos DB for MongoDB (vCore)
GILT FÜR: MongoDB-vCore
Verwenden Sie die integrierte Vektordatenbank im virtuellen Kern von Azure Cosmos DB for MongoDB, 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 im virtuellen Kern von Azure Cosmos DB for MongoDB 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 im virtuellen Kern von Azure Cosmos DB for MongoDB 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.
Erstellen eines Vektorindexes
Um die Vektor-Ähnlichkeitssuche über Vektoreigenschaften in Ihren Dokumenten durchzuführen, müssen Sie zuerst einen Vektorindexerstellen.
Erstellen eines Vektorindexes mit HNSW
Sie können (hierarchische Navigable Small World)-Indizes auf M40-Clusterebenen und höher erstellen. Um den HSNW-Index zu erstellen, müssen Sie einen Vektorindex mit dem "kind"
Parameter erstellen, der auf "vector-hnsw"
folgende Vorlage festgelegt ist:
{
"createIndexes": "<collection_name>",
"indexes": [
{
"name": "<index_name>",
"key": {
"<path_to_property>": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-hnsw",
"m": <integer_value>,
"efConstruction": <integer_value>,
"similarity": "<string_value>",
"dimensions": <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. Wenn ein Punktnotationspfad verwendet wird, dürfen alle inneren Elemente keine Arrays sein. Vektoren müssen ein number[] sein, damit sie indiziert werden und in den Suchergebnissen der Vektorsuche erscheinen. |
kind |
Zeichenfolge | Art des zu erstellenden Vektorindexes. Die Optionen sind vector-ivf und vector-hnsw . Hinweis vector-ivf ist auf allen Clusterebenen verfügbar und vector-hnsw ist auf M40-Clusterebenen und höher verfügbar. |
m |
integer | Die maximale Anzahl von Verbindungen pro Ebene (16 ist der Standardwert, 2 ist der Mindestwert, 100 ist der Maximalwert). Höhere m eignen sich für Datasets mit hoher Dimensionalität und/oder hohen Genauigkeitsanforderungen. |
efConstruction |
integer | die Größe der dynamischen Kandidatenliste zum Erstellen des Diagramms (64 ist der Standardwert, 4 ist der Mindestwert, 1000 ist der Maximalwert). Höhere efConstruction führt zu einer besseren Indexqualität und einer höheren Genauigkeit, erhöht aber auch die Zeit, die zum Erstellen des Indexes erforderlich ist. efConstruction muss mindestens 2 * m sein |
similarity |
Zeichenfolge | Ähnlichkeitsmetrik, die mit dem Index verwendet werden soll. Mögliche Optionen sind COS (Kosinusabstand), L2 (euklidischer Abstand) oder IP (inneres Produkt). |
dimensions |
integer | Anzahl der Dimensionen für Vektorähnlichkeit. Es werden maximal 2000 Dimensionen unterstützt. |
Durchführen einer Vektorsuche mit HNSW
Verwenden Sie zum Ausführen einer Vektorsuche die Aggregationspipelinephase $search
der Abfrage mit dem cosmosSearch
-Operator.
{
"$search": {
"cosmosSearch": {
"vector": <query_vector>,
"path": "<path_to_property>",
"k": <num_results_to_return>,
"efSearch": <integer_value>
},
}
}
}
Feld | Typ | Beschreibung |
---|---|---|
efSearch |
integer | Die Größe der dynamischen Kandidatenliste für die Suche (40 ist der Standardwert). Ein höherer Wert bietet einen besseren Abruf auf Kosten der Geschwindigkeit. |
k |
integer | Die Anzahl von Ergebnissen, die zurückgegeben werden sollen. sie sollte kleiner oder gleich efSearch sein |
Hinweis
Das Erstellen eines HSNW-Indexes mit großen Datasets kann dazu führen, dass Ihre Azure Cosmos DB für MongoDB vCore-Ressource nicht genügend Arbeitsspeicher hat, oder dass die Leistung anderer Vorgänge, die in Ihrer Datenbank ausgeführt werden, eingeschränkt wird. Wenn solche Probleme auftreten, können diese verringert werden, indem Sie Ihre Ressource auf eine höhere Clusterebene skalieren oder die Größe des Datasets verringern.
Erstellen eines Vektorindexes mithilfe von IVF
Verwenden Sie zum Erstellen eines Vektorindexes mithilfe des IVF-Algorithmus (Invertierte Datei) die folgende createIndexes
Vorlage, und legen Sie den "kind"
Parameter auf "vector-ivf"
fest:
{
"createIndexes": "<collection_name>",
"indexes": [
{
"name": "<index_name>",
"key": {
"<path_to_property>": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-ivf",
"numLists": <integer_value>,
"similarity": "<string_value>",
"dimensions": <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. Wenn ein Punktnotationspfad verwendet wird, dürfen alle inneren Elemente keine Arrays sein. Vektoren müssen ein number[] sein, damit sie indiziert werden und in den Suchergebnissen der Vektorsuche erscheinen. |
kind |
Zeichenfolge | Art des zu erstellenden Vektorindexes. Die Optionen sind vector-ivf und vector-hnsw . Hinweis vector-ivf ist auf allen Clusterebenen verfügbar und vector-hnsw ist auf M40-Clusterebenen und höher verfügbar. |
numLists |
integer | Dieser Integerwert steht für die Anzahl der Cluster, die der Index der invertierten DAtei (IVF) zum Gruppieren der Vektordaten verwendet. Es empfiehlt sich, numLists für bis zu einer Million Dokumente auf documentCount/1000 und ab einer Million Dokumente auf sqrt(documentCount) festzulegen. Die Verwendung des numLists -Werts 1 ähnelt einer Brute-Force-Suche, weist also nur eine eingeschränkte Leistung auf. |
similarity |
Zeichenfolge | Ähnlichkeitsmetrik, die mit dem Index verwendet werden soll. Mögliche Optionen sind COS (Kosinusabstand), L2 (euklidischer Abstand) oder IP (inneres Produkt). |
dimensions |
integer | Anzahl der Dimensionen für Vektorähnlichkeit. Es werden maximal 2000 Dimensionen unterstützt. |
Wichtig
Das richtige Festlegen des numLists-Parameters ist wichtig, um eine gute Genauigkeit und Leistung zu erzielen. Es empfiehlt sich, numLists
für bis zu einer Million Dokumente auf documentCount/1000
und ab einer Million Dokumente auf sqrt(documentCount)
festzulegen.
Wenn die Anzahl der Elemente in Ihrer Datenbank zunimmt, sollten Sie numLists so optimieren, dass es größer ist, um eine gute Latenzleistung für die Vektorsuche zu erzielen.
Wenn Sie mit einem neuen Szenario experimentieren oder eine kleine Demo erstellen, können Sie numLists
zunächst auf 1
festlegen, um eine Brute-Force-Suche über alle Vektoren hinweg durchzuführen. Damit sollten Sie bei der Vektorsuche die genauesten Ergebnisse erzielen. Beachten Sie jedoch, dass die Suchgeschwindigkeit langsam und die Latenz hoch ist. Nach der ersten Einrichtung sollten Sie den numLists
-Parameter mithilfe der obigen Anleitung optimieren.
Durchführen einer Vektorsuche mit IVF
Verwenden Sie zum Durchführen einer Vektorsuche die Aggregationspipelinephase $search
in einer MongoDB-Abfrage. Verwenden Sie den cosmosSearch
-Operator, um den cosmosSearch
-Index zu verwenden.
{
{
"$search": {
"cosmosSearch": {
"vector": <query_vector>,
"path": "<path_to_property>",
"k": <num_results_to_return>,
},
"returnStoredSource": True }},
{
"$project": { "<custom_name_for_similarity_score>": {
"$meta": "searchScore" },
"document" : "$$ROOT"
}
}
}
Um den Ähnlichkeitswert (searchScore
) zusammen mit den von der Vektorsuche gefundenen Dokumenten abzurufen, verwenden Sie den $project
-Operator, um searchScore
einzuschließen und in <custom_name_for_similarity_score>
in den Ergebnissen umzubenennen. Anschließend wird das Dokument auch als geschachteltes Objekt projiziert. Beachten Sie, dass der Ähnlichkeitswert mit der im Vektorindex definierten Metrik berechnet wird.
Wichtig
Vektoren müssen ein number[]
sein, um indiziert zu 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.
Beispiel für die Verwendung eines HNSW-Indexes.
In den folgenden Beispielen wird gezeigt, wie Sie Vektoren indizieren, Dokumente mit Vektoreigenschaften hinzufügen, eine Vektorsuche durchführen und die Indexkonfiguration abrufen.
use test;
db.createCollection("exampleCollection");
db.runCommand({
"createIndexes": "exampleCollection",
"indexes": [
{
"name": "VectorSearchIndex",
"key": {
"contentVector": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-hnsw",
"m": 16,
"efConstruction": 64,
"similarity": "COS",
"dimensions": 3
}
}
]
});
Dieser Befehl erstellt einen HNSW-Index anhand der Eigenschaft contentVector
in den Dokumenten, die in der angegebenen Sammlung exampleCollection
gespeichert sind. Die cosmosSearchOptions
-Eigenschaft gibt die Parameter für den HNSW-Vektorindex an. Wenn in Ihrem Dokument der Vektor in einer geschachtelten Eigenschaft gespeichert ist, können Sie diese Eigenschaft mithilfe eines Punktnotationspfads festlegen. Verwenden Sie beispielsweise text.contentVector
, wenn contentVector
eine Untereigenschaft von text
ist.
Hinzufügen von Vektoren zu Ihrer Datenbank
Um der Sammlung Ihrer Datenbank Vektoren hinzuzufügen, müssen Sie zunächst die Einbettungen erstellen, indem Sie Ihr eigenes Modell, Azure OpenAI-Einbettungen oder eine andere API (z. B. Hugging Face in Azure) verwenden. In diesem Beispiel werden neue Dokumente mithilfe von Beispieleinbettungen hinzugefügt:
db.exampleCollection.insertMany([
{name: "Eugenia Lopez", bio: "Eugenia is the CEO of AdvenureWorks.", vectorContent: [0.51, 0.12, 0.23]},
{name: "Cameron Baker", bio: "Cameron Baker CFO of AdvenureWorks.", vectorContent: [0.55, 0.89, 0.44]},
{name: "Jessie Irwin", bio: "Jessie Irwin is the former CEO of AdventureWorks and now the director of the Our Planet initiative.", vectorContent: [0.13, 0.92, 0.85]},
{name: "Rory Nguyen", bio: "Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.", vectorContent: [0.91, 0.76, 0.83]},
]);
Durchführen einer Vektorsuche
Fahren Sie mit dem letzten Beispiel fort, und erstellen Sie einen weiteren Vektor: queryVector
. Die Vektorsuche misst den Abstand zwischen queryVector
und den Vektoren im contentVector
-Pfad Ihrer Dokumente. Sie können die Anzahl der von der Suche zurückgegebenen Ergebnisse festlegen, indem Sie den Parameter k
festlegen. Hier ist er auf 2
festgelegt. Sie können auch eine ganze Zahl, efSearch
, festlegen, die die Größe der Kandidatenvektorliste steuert. Ein höherer Wert kann die Genauigkeit verbessern, die Suche wird dadurch jedoch langsamer. Dies ist ein optionaler Parameter mit dem Standardwert 40.
const queryVector = [0.52, 0.28, 0.12];
db.exampleCollection.aggregate([
{
"$search": {
"cosmosSearch": {
"vector": "queryVector",
"path": "contentVector",
"k": 2,
"efSearch": 40
},
}
}
}
]);
In diesem Beispiel wird eine Vektorsuche mithilfe von queryVector
als Eingabe über die Mongo-Shell durchgeführt. Das Suchergebnis ist eine Liste aus zwei Elemente, die dem Abfragevektor am ähnlichsten sind, sortiert nach ihren Ähnlichkeitswerten.
[
{
similarityScore: 0.9465376,
document: {
_id: ObjectId("645acb54413be5502badff94"),
name: 'Eugenia Lopez',
bio: 'Eugenia is the CEO of AdvenureWorks.',
vectorContent: [ 0.51, 0.12, 0.23 ]
}
},
{
similarityScore: 0.9006955,
document: {
_id: ObjectId("645acb54413be5502badff97"),
name: 'Rory Nguyen',
bio: 'Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.',
vectorContent: [ 0.91, 0.76, 0.83 ]
}
}
]
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: { contentVector: 'cosmosSearch' },
name: 'vectorSearchIndex',
cosmosSearch: {
kind: 'vector-hnsw',
m: 40,
efConstruction: 64,
similarity: 'COS',
dimensions: 3
},
ns: 'test.exampleCollection'
}
]
Beispiel für die Verwendung eines IVF-Indexes
Invertierte Dateiindizierung (IVF) ist eine Methode, die Vektoren in Clustern organisiert. Während einer Vektorsuche wird der Abfragevektor zuerst mit den Mittelpunkten dieser Cluster verglichen. Die Suche wird dann innerhalb des Clusters durchgeführt, dessen Mittelpunkt dem Abfragevektor am nächsten liegt.
Der Parameter numList
s bestimmt die Anzahl der zu erstellenden Cluster. Ein einzelner Cluster impliziert, dass die Suche für alle Vektoren in der Datenbank durchgeführt wird, ähnlich einer Brute-Force- oder kNN-Suche. Diese Einstellung bietet die höchste Genauigkeit, aber auch die größte Latenz.
Das Erhöhen des Werts numLists
resultiert in mehr Clustern, die jeweils weniger Vektoren enthalten. Wenn er beispielsweise numLists=2
lautet, enthält jeder Cluster mehr Vektoren als wenn er numLists=3
lautet usw. Weniger Vektoren pro Cluster beschleunigen die Suche (niedrigere Latenz, höhere Anzahl von Abfragen pro Sekunde). Dies erhöht jedoch die Wahrscheinlichkeit, dass der dem Abfragevektor ähnlichste Vektor in Ihrer Datenbank übersehen wird. Dies ist auf die unvollkommene Natur der Clusterbildung zurückzuführen, bei der sich die Suche auf einen Cluster konzentrieren kann, während sich der tatsächlich „nächstgelegene“ Vektor in einem anderen Cluster befindet.
Der Parameter nProbes
steuert die Anzahl der zu durchsuchenden Cluster. Standardmäßig ist er auf 1 festgelegt, d. h. es wird nur der Cluster mit dem Mittelpunkt durchsucht, der dem Abfragevektor am nächsten liegt. Durch das Erhöhen dieses Werts kann die Suche mehr Cluster abdecken, wodurch die Genauigkeit verbessert, aber auch die Latenz erhöht wird (wodurch Anzahl von Abfragen pro Sekunde verringert wird), da mehr Cluster und Vektoren durchsucht werden.
In den folgenden Beispielen wird gezeigt, wie Sie Vektoren indizieren, Dokumente mit Vektoreigenschaften hinzufügen, eine Vektorsuche durchführen und die Indexkonfiguration abrufen.
Erstellen eines Vektorindexes
use test;
db.createCollection("exampleCollection");
db.runCommand({
createIndexes: 'exampleCollection',
indexes: [
{
name: 'vectorSearchIndex',
key: {
"vectorContent": "cosmosSearch"
},
cosmosSearchOptions: {
kind: 'vector-ivf',
numLists: 3,
similarity: 'COS',
dimensions: 3
}
}
]
});
Dieser Befehl erstellt einen vector-ivf
-Index anhand der Eigenschaft vectorContent
in den Dokumenten, die in der angegebenen Sammlung (exampleCollection
) gespeichert sind. Die cosmosSearchOptions
-Eigenschaft gibt die Parameter für den IVF-Vektorindex an. Wenn in Ihrem Dokument der Vektor in einer geschachtelten Eigenschaft gespeichert ist, können Sie diese Eigenschaft mithilfe eines Punktnotationspfads festlegen. Verwenden Sie beispielsweise text.vectorContent
, wenn vectorContent
eine Untereigenschaft von text
ist.
Hinzufügen von Vektoren zu Ihrer Datenbank
Um der Sammlung Ihrer Datenbank Vektoren hinzuzufügen, müssen Sie zunächst die Einbettungen erstellen, indem Sie Ihr eigenes Modell, Azure OpenAI-Einbettungen oder eine andere API (z. B. Hugging Face in Azure) verwenden. In diesem Beispiel werden neue Dokumente mithilfe von Beispieleinbettungen hinzugefügt:
db.exampleCollection.insertMany([
{name: "Eugenia Lopez", bio: "Eugenia is the CEO of AdvenureWorks.", vectorContent: [0.51, 0.12, 0.23]},
{name: "Cameron Baker", bio: "Cameron Baker CFO of AdvenureWorks.", vectorContent: [0.55, 0.89, 0.44]},
{name: "Jessie Irwin", bio: "Jessie Irwin is the former CEO of AdventureWorks and now the director of the Our Planet initiative.", vectorContent: [0.13, 0.92, 0.85]},
{name: "Rory Nguyen", bio: "Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.", vectorContent: [0.91, 0.76, 0.83]},
]);
Durchführen einer Vektorsuche
Verwenden Sie zum Durchführen einer Vektorsuche die Aggregationspipelinephase $search
in einer MongoDB-Abfrage. Verwenden Sie den cosmosSearch
-Operator, um den cosmosSearch
-Index zu verwenden.
{
{
"$search": {
"cosmosSearch": {
"vector": <vector_to_search>,
"path": "<path_to_property>",
"k": <num_results_to_return>,
},
"returnStoredSource": True }},
{
"$project": { "<custom_name_for_similarity_score>": {
"$meta": "searchScore" },
"document" : "$$ROOT"
}
}
}
Um den Ähnlichkeitswert (searchScore
) zusammen mit den von der Vektorsuche gefundenen Dokumenten abzurufen, verwenden Sie den $project
-Operator, um searchScore
einzuschließen und in <custom_name_for_similarity_score>
in den Ergebnissen umzubenennen. Anschließend wird das Dokument auch als geschachteltes Objekt projiziert. Beachten Sie, dass der Ähnlichkeitswert mit der im Vektorindex definierten Metrik berechnet wird.
Abfragevektoren und Vektordistanzen (auch bekannt als Ähnlichkeitswerte) mit $search"
Fahren Sie mit dem letzten Beispiel fort, und erstellen Sie einen weiteren Vektor: queryVector
. Die Vektorsuche misst den Abstand zwischen queryVector
und den Vektoren im vectorContent
-Pfad Ihrer Dokumente. Sie können die Anzahl der von der Suche zurückgegebenen Ergebnisse festlegen, indem Sie den Parameter k
festlegen. Hier ist er auf 2
festgelegt. Sie können auch den Integerwert nProbes
festlegen, der die Anzahl der sich in der Nähe befindlichen Cluster steuert, die in den einzelnen Suchvorgängen überprüft werden. Ein höherer Wert kann die Genauigkeit verbessern, die Suche wird dadurch jedoch langsamer. Dies ist ein optionaler Parameter mit einem Standardwert von 1, der nicht größer als der Wert von numLists
im Vektorindex sein darf.
const queryVector = [0.52, 0.28, 0.12];
db.exampleCollection.aggregate([
{
$search: {
"cosmosSearch": {
"vector": queryVector,
"path": "vectorContent",
"k": 2
},
"returnStoredSource": true }},
{
"$project": { "similarityScore": {
"$meta": "searchScore" },
"document" : "$$ROOT"
}
}
]);
In diesem Beispiel wird eine Vektorsuche mithilfe von queryVector
als Eingabe über die Mongo-Shell durchgeführt. Das Suchergebnis ist eine Liste aus zwei Elemente, die dem Abfragevektor am ähnlichsten sind, sortiert nach ihren Ähnlichkeitswerten.
[
{
similarityScore: 0.9465376,
document: {
_id: ObjectId("645acb54413be5502badff94"),
name: 'Eugenia Lopez',
bio: 'Eugenia is the CEO of AdvenureWorks.',
vectorContent: [ 0.51, 0.12, 0.23 ]
}
},
{
similarityScore: 0.9006955,
document: {
_id: ObjectId("645acb54413be5502badff97"),
name: 'Rory Nguyen',
bio: 'Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.',
vectorContent: [ 0.91, 0.76, 0.83 ]
}
}
]
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: 'vector-ivf',
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 für MongoDB (vCore), um die semantische Zwischenspeicherung zu orchestrieren, indem Sie zuvor aufgezeichnete LLM Antworten verwenden, mit denen Sie DIE KOSTEN der LLM-API sparen 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 (GA) und HSNW (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 Open AI Services in 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