Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln beskriver hur du skapar vektordata, indexar data och sedan frågar efter data i en container.
Innan du använder vektorindexering och sökning måste du först aktivera vektorsökning i Azure Cosmos DB för NoSQL. När du har konfigurerat Azure Cosmos DB-containern för vektorsökning skapar du en inbäddningsprincip för vektorer. Därefter lägger du till vektorindex i containerindexeringsprincipen. Sedan skapar du en container med vektorindex och en inbäddningsprincip för vektorer. Slutligen utför du en vektorsökning på lagrade data.
Förutsättningar
- Ett befintligt Azure Cosmos DB för NoSQL-konto.
- Om du inte har en Azure-prenumeration kan du skapa en kostnadsfritt.
- Om du har en befintlig Azure-prenumeration skapar du ett nytt Azure Cosmos DB för NoSQL-konto.
- Den senaste versionen av Azure Cosmos DB Java SDK.
Aktivera funktionen
Följ dessa steg för att aktivera vektorsökning för Azure Cosmos DB för NoSQL:
- Gå till resurssidan för Azure Cosmos DB för NoSQL.
- I den vänstra rutan, under Inställningar, väljer du Funktioner.
- Välj Vektorsökning för NoSQL API.
- Läs beskrivningen av funktionen för att bekräfta att du vill aktivera den.
- Välj Aktivera för att aktivera vektorsökning i Azure Cosmos DB för NoSQL.
Tips
Du kan också använda Azure CLI för att uppdatera funktionerna i ditt konto för att stödja Azure Cosmos DB för NoSQL-vektorsökning.
az cosmosdb update \
--resource-group <resource-group-name> \
--name <account-name> \
--capabilities EnableNoSQLVectorSearch
Registreringsbegäran godkänns automatiskt, men det kan ta 15 minuter att börja gälla.
Förstå stegen i vektorsökning
Följande steg förutsätter att du vet hur du konfigurerar ett Azure Cosmos DB för NoSQL-konto och skapar en databas. Vektorsökningsfunktionen stöds för närvarande inte på befintliga containrar. Du måste skapa en ny container. När du skapar containern anger du inbäddningsprincipen för vektorinbäddning på containernivå och vektorindexeringsprincipen.
Låt oss ta ett exempel på hur du skapar en databas för en internetbaserad bokhandel. Du vill lagra information om titel, författare, ISBN och beskrivning för varje bok. Du måste också definiera följande två egenskaper som ska innehålla inbäddningar av vektorer:
- Egenskapen
contentVectorinnehåller text inbäddningar som genereras från textinnehållet i boken. Till exempel sammanfogar du egenskapernatitle,author,isbnochdescriptioninnan du skapar inbäddningen. - Egenskapen
coverImageVectorgenereras från bilder av bokens omslag.
Om du vill utföra en vektorsökning:
- Skapa och lagra vektorinbäddningar för de fält där du vill utföra vektorsökning.
- Ange sökvägarna för vektorinbäddning i vektorinbäddningsprincipen.
- Inkludera eventuella vektorindex som du vill använda i indexeringsprincipen för containern.
För efterföljande avsnitt i den här artikeln bör du överväga följande struktur för de objekt som lagras i containern:
{
"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]
}
CosmosContainerProperties Skapa först objektet.
CosmosContainerProperties collectionDefinition = new CosmosContainerProperties(UUID.randomUUID().toString(), "Partition_Key_Def");
Skapa en vektorinbäddningsprincip för din container
Nu måste du definiera en containervektorprincip. Den här principen innehåller information som informerar Azure Cosmos DB-frågemotorn om hur du hanterar vektoregenskaper i systemfunktionerna VectorDistance . Den här principen ger också nödvändig information till vektorindexeringsprincipen om du väljer att ange en.
Följande information ingår i containervektorprincipen:
| Parameter | Beskrivning |
|---|---|
path |
Egenskapssökvägen som innehåller vektorer. |
datatype |
Typ av element i vektorn. Standardvärdet är Float32. |
dimensions |
Längden på varje vektor i sökvägen. Standardvärdet är 1536. |
distanceFunction |
Måttet som används för att beräkna avstånd/likhet. Standardvärdet är Cosine. |
I exemplet med bokinformation kan vektorprincipen se ut som i följande exempel:
// 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);
Skapa ett vektorindex i indexeringsprincipen
När du har bestämt dig för sökvägarna för inbäddning av vektorer måste du lägga till vektorindex i indexeringsprincipen. För närvarande stöds vektorsökningsfunktionen för Azure Cosmos DB for NoSQL endast i nya containrar. När du skapar containern tillämpar du vektorprincipen. Du kan inte ändra principen senare. Indexeringsprincipen ser ut ungefär som i följande exempel:
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);
Skapa slutligen containern med containerindexprincipen och vektorindexprincipen.
database.createContainer(collectionDefinition).block();
Viktigt!
Vektorsökvägen läggs till i excludedPaths avsnittet i indexeringsprincipen för att säkerställa optimerad prestanda för infogning. Att inte lägga till vektorsökvägen till excludedPaths resulterar i en högre kostnad och latens för vektorinfogningar.
Köra en vektorlikhetssökningsfråga
När du har skapat en container med den vektorprincip som du vill använda och infogat vektordata i containern använder du systemfunktionen VectorDistance i en fråga för att utföra en vektorsökning.
Anta att du vill söka efter böcker om matrecept genom att titta på beskrivningen. Du måste först hämta inbäddningarna för frågetexten. I det här fallet kanske du vill generera inbäddningar för frågetexten food recipe. När du har bäddat in för din sökfråga kan du använda den i VectorDistance funktionen i vektorsökningsfrågan för att hämta alla objekt som liknar din fråga:
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])
Den här frågan hämtar boktitlarna tillsammans med likhetspoäng med avseende på din fråga. Här är ett exempel i 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()));
}