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]},
]);

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 numLists 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.

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.

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory/azure_cosmosdb

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.

Nächster Schritt