Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird erläutert, wie Sie Vektordaten erstellen, die Daten indizieren und dann die Daten in einem Container abfragen.
Bevor Sie Vektorindizierung und Suche verwenden, müssen Sie zuerst die Vektorsuche in Azure Cosmos DB für NoSQL aktivieren. Nachdem Sie den Azure Cosmos DB-Container für die Vektorsuche eingerichtet haben, erstellen Sie eine Vektoreinbettungsrichtlinie. Als Nächstes fügen Sie der Containerindizierungsrichtlinie Vektorindizes hinzu. Anschließend erstellen Sie einen Container mit Vektorindizes und einer Vektoreinbettungsrichtlinie. Schließlich führen Sie eine Vektorsuche für die gespeicherten Daten durch.
Voraussetzungen
- Ein vorhandenes Azure Cosmos DB for NoSQL-Konto.
- Falls Sie über kein Azure-Abonnement verfügen, können Sie ein kostenloses Konto erstellen.
- Wenn Sie über ein Azure-Abonnement verfügen, erstellen Sie ein neues Azure Cosmos DB for NoSQL-Konto.
- Die neueste Version des Azure Cosmos DB Java SDK.
Aktivieren des Features
Führen Sie die folgenden Schritte aus, um die Vektorsuche für Azure Cosmos DB für NoSQL zu aktivieren:
- Wechseln Sie zur Ressourcenseite von Azure Cosmos DB für NoSQL.
- Wählen Sie im linken Bereich unter "Einstellungen" die Option "Features" aus.
- Wählen Sie die Vektorsuche für die NoSQL-API aus.
- Lesen Sie die Beschreibung des Features, um zu bestätigen, dass Sie es aktivieren möchten.
- Wählen Sie "Aktivieren" aus, um die Vektorsuche in Azure Cosmos DB für NoSQL zu aktivieren.
Tipp
Alternativ können Sie die Azure CLI verwenden, um die Funktionen Ihres Kontos zu aktualisieren, um die Azure Cosmos DB für die NoSQL-Vektorsuche zu unterstützen.
az cosmosdb update \
--resource-group <resource-group-name> \
--name <account-name> \
--capabilities EnableNoSQLVectorSearch
Die Registrierungsanforderung wird automatisch genehmigt, es kann jedoch 15 Minuten dauern, bis sie wirksam wird.
Grundlegendes zu den Schritten bei der Vektorsuche
Bei den folgenden Schritten wird davon ausgegangen, dass Sie wissen, wie Sie ein Azure Cosmos DB für NoSQL-Konto einrichten und eine Datenbank erstellen. Das Vektorsuchfeature wird derzeit für die vorhandenen Container nicht unterstützt. Sie müssen einen neuen Container erstellen. Wenn Sie den Container erstellen, geben Sie die Richtlinie zum Einbetten von Vektoren auf Containerebene und die Vektorindizierungsrichtlinie an.
Sehen wir uns ein Beispiel für das Erstellen einer Datenbank für eine internetbasierte Buchhandlung an. Sie möchten Titel-, Autor-, ISBN- und Beschreibungsinformationen für jedes Buch speichern. Außerdem müssen Sie die folgenden beiden Eigenschaften definieren, um Vektoreinbettungen zu enthalten:
- Die
contentVectorEigenschaft enthält Texteinbettungen , die aus dem Textinhalt des Buchs generiert werden. Sie verketten z. B. dietitle,author, ,isbnunddescriptionEigenschaften, bevor Sie die Einbettung erstellen. - Die
coverImageVectorEigenschaft wird aus Bildern des Bucheinbands generiert.
Um eine Vektorsuche durchzuführen, führen Sie folgendes aus:
- Erstellen und speichern Sie Vektoreinbettungen für die Felder, für die Sie die Vektorsuche ausführen möchten.
- Geben Sie die Pfade zum Einbetten von Vektoren in die Vektoreinbettungsrichtlinie an.
- Fügen Sie alle gewünschten Vektorindizes in die Indizierungsrichtlinie für den Container ein.
Berücksichtigen Sie für nachfolgende Abschnitte dieses Artikels die folgende Struktur für die in Ihrem Container gespeicherten Elemente:
{
"title": "book-title",
"author": "book-author",
"isbn": "book-isbn",
"description": "book-description",
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1],
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78]
}
Erstellen Sie zunächst das Objekt CosmosContainerProperties.
CosmosContainerProperties collectionDefinition = new CosmosContainerProperties(UUID.randomUUID().toString(), "Partition_Key_Def");
Erstellen einer Vektoreinbettungsrichtlinie für Ihren Container
Jetzt müssen Sie eine Containervektorrichtlinie definieren. Diese Richtlinie enthält Informationen, die das Azure Cosmos DB-Abfragemodul darüber informieren, wie Vektoreigenschaften in den VectorDistance Systemfunktionen behandelt werden. Diese Richtlinie enthält auch erforderliche Informationen für die Vektorindizierungsrichtlinie, wenn Sie eine angeben.
Die folgenden Informationen sind in der Containervektorrichtlinie enthalten:
| Parameter | Description |
|---|---|
path |
Der Eigenschaftspfad, der Vektoren enthält. |
datatype |
Der Typ der Elemente des Vektors. Der Standardwert lautet Float32. |
dimensions |
Die Länge jedes Vektors im Pfad. Der Standardwert lautet 1536. |
distanceFunction |
Die Metrik, die zum Berechnen der Entfernung/Ähnlichkeit verwendet wird. Der Standardwert lautet Cosine. |
Für das Beispiel mit Buchdetails könnte die Vektorrichtlinie wie im folgenden Beispiel aussehen:
// Creating vector embedding policy
CosmosVectorEmbeddingPolicy cosmosVectorEmbeddingPolicy = new CosmosVectorEmbeddingPolicy();
CosmosVectorEmbedding embedding1 = new CosmosVectorEmbedding();
embedding1.setPath("/coverImageVector");
embedding1.setDataType(CosmosVectorDataType.FLOAT32);
embedding1.setDimensions(8L);
embedding1.setDistanceFunction(CosmosVectorDistanceFunction.COSINE);
CosmosVectorEmbedding embedding2 = new CosmosVectorEmbedding();
embedding2.setPath("/contentVector");
embedding2.setDataType(CosmosVectorDataType.FLOAT32);
embedding2.setDimensions(10L);
embedding2.setDistanceFunction(CosmosVectorDistanceFunction.DOT_PRODUCT);
cosmosVectorEmbeddingPolicy.setCosmosVectorEmbeddings(Arrays.asList(embedding1, embedding2, embedding3));
collectionDefinition.setVectorEmbeddingPolicy(cosmosVectorEmbeddingPolicy);
Erstellen eines Vektorindexes in der Indizierungsrichtlinie
Nachdem Sie sich für die Vektoreinbettungspfade entschieden haben, müssen Sie der Indizierungsrichtlinie Vektorindizes hinzufügen. Derzeit wird das Vektorsuchfeature für Azure Cosmos DB für NoSQL nur für neue Container unterstützt. Wenn Sie den Container erstellen, wenden Sie die Vektorrichtlinie an. Sie können die Richtlinie später nicht ändern. Die Indizierungsrichtlinie sieht ungefähr wie im folgenden Beispiel aus:
IndexingPolicy indexingPolicy = new IndexingPolicy();
indexingPolicy.setIndexingMode(IndexingMode.CONSISTENT);
ExcludedPath excludedPath1 = new ExcludedPath("/coverImageVector/*");
ExcludedPath excludedPath2 = new ExcludedPath("/contentVector/*");
indexingPolicy.setExcludedPaths(ImmutableList.of(excludedPath1, excludedPath2));
IncludedPath includedPath1 = new IncludedPath("/*");
indexingPolicy.setIncludedPaths(Collections.singletonList(includedPath1));
// Creating vector indexes
CosmosVectorIndexSpec cosmosVectorIndexSpec1 = new CosmosVectorIndexSpec();
cosmosVectorIndexSpec1.setPath("/coverImageVector");
cosmosVectorIndexSpec1.setType(CosmosVectorIndexType.QUANTIZED_FLAT.toString());
CosmosVectorIndexSpec cosmosVectorIndexSpec2 = new CosmosVectorIndexSpec();
cosmosVectorIndexSpec2.setPath("/contentVector");
cosmosVectorIndexSpec2.setType(CosmosVectorIndexType.DISK_ANN.toString());
indexingPolicy.setVectorIndexes(Arrays.asList(cosmosVectorIndexSpec1, cosmosVectorIndexSpec2, cosmosVectorIndexSpec3));
collectionDefinition.setIndexingPolicy(indexingPolicy);
Erstellen Sie schließlich den Container mit der Containerindexrichtlinie und der Vektorindexrichtlinie.
database.createContainer(collectionDefinition).block();
Wichtig
Der Vektorpfad wird dem excludedPaths Abschnitt der Indizierungsrichtlinie hinzugefügt, um eine optimierte Leistung für die Einfügung sicherzustellen. Wenn Sie den Vektorpfad nicht zu excludedPaths hinzufügen, erhalten Sie eine höhere Anforderungseinheitsladung und Latenz für Vektoreinfügungen.
Ausführen einer Suchabfrage für Vektorähnlichkeiten
Nachdem Sie einen Container mit der gewünschten Vektorrichtlinie erstellt und Vektordaten in den Container eingefügt haben, verwenden Sie die VectorDistance-Systemfunktion in einer Abfrage, um eine Vektorsuche durchzuführen.
Angenommen, Sie möchten nach Büchern über Lebensmittelrezepte suchen, indem Sie sich die Beschreibung ansehen. Sie müssen zuerst die Einbettungen für den Abfragetext erhalten. In diesem Fall möchten Sie möglicherweise Einbettungen für den Abfragetext food recipegenerieren. Nachdem Sie die Einbettung für Ihre Suchabfrage vorgenommen haben, können Sie sie in der Funktion in der VectorDistance Vektorsuchabfrage verwenden, um alle Elemente abzurufen, die Ihrer Abfrage ähneln:
SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore
FROM c
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])
Diese Abfrage ruft die Buchtitel zusammen mit Ähnlichkeitsbewertungen in Bezug auf Ihre Abfrage ab. Hier ist ein Beispiel in Java:
float[] embedding = new float[10];
for (int i = 0; i < 10; i++) {
array[i] = i + 1;
}
ArrayList<SqlParameter> paramList = new ArrayList<SqlParameter>();
paramList.add(new SqlParameter("@embedding", embedding));
SqlQuerySpec querySpec = new SqlQuerySpec("SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)", paramList);
CosmosPagedIterable<Family> filteredFamilies = container.queryItems(querySpec, new CosmosQueryRequestOptions(), Family.class);
if (filteredFamilies.iterator().hasNext()) {
Family family = filteredFamilies.iterator().next();
logger.info(String.format("First query result: Family with (/id, partition key) = (%s,%s)",family.getId(),family.getLastName()));
}
Verwandte Inhalte
- VectorDistance-Systemfunktion
- Indexing policies in Azure Cosmos DB (Indizierungsrichtlinien in Azure Cosmos DB)
- Vektordatenbank