Index- och frågevektorer i Azure Cosmos DB för NoSQL i Python
Innan du använder vektorindexering och sökning måste du först aktivera funktionen. Den här artikeln beskriver följande steg:
- Aktivera vektorsökning i Azure Cosmos DB för NoSQL-funktionen
- Konfigurera Azure Cosmos DB-containern för vektorsökning
- Redigeringsvektor för inbäddningsprincip
- Lägga till vektorindex i containerindexeringsprincipen
- Skapa en container med vektorindex och inbäddningsprincip för vektorer
- Utföra en vektorsökning på lagrade data
Den här guiden går igenom processen med att skapa vektordata, indexera data och sedan köra frågor mot data i en container.
Förutsättningar
- Ett befintligt Azure Cosmos DB för NoSQL-konto.
- Om du inte har en Azure-prenumeration kan du prova Azure Cosmos DB utan kostnad för NoSQL.
- Om du har en befintlig Azure-prenumeration skapar du ett nytt Azure Cosmos DB för NoSQL-konto.
- Senaste versionen av Azure Cosmos DB Python SDK.
Aktivera funktionen
Vektorsökning för Azure Cosmos DB för NoSQL kräver aktivering av funktionen genom att utföra följande steg:
- Gå till resurssidan för Azure Cosmos DB for NoSQL.
- Välj fönstret "Funktioner" under menyalternativet "Inställningar".
- Välj "Vector Search in Azure Cosmos DB for NoSQL" (Vektorsökning i Azure Cosmos DB för NoSQL).
- 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.
Dricks
Du kan också använda Azure CLI för att uppdatera funktionerna i ditt konto för att stödja NoSQL-vektorsökning.
az cosmosdb update \
--resource-group <resource-group-name> \
--name <account-name> \
--capabilities EnableNoSQLVectorSearch
Kommentar
Registreringsbegäran godkänns automatiskt. Det kan dock 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 Cosmos DB NoSQL-konto och skapar en databas. Vektorsökningsfunktionen stöds för närvarande inte på befintliga containrar, så du måste skapa en ny container och ange inbäddningsprincipen för vektor på containernivå och vektorindexeringsprincipen när containern skapas.
Låt oss ta ett exempel på hur du skapar en databas för en internetbaserad bokhandel och du lagrar Title, Author, ISBN och Description för varje bok. Vi definierar också två egenskaper som ska innehålla inbäddningar av vektorer. Den första är egenskapen "contentVector", som innehåller textbäddningar som genereras från textinnehållet i boken (till exempel att sammanfoga egenskaperna "title" "author" "isbn" och "description" innan du skapar inbäddningen). Den andra är "coverImageVector", som genereras från bilder av bokens omslag.
- Skapa och lagra vektorinbäddningar för de fält där du vill utföra vektorsökning.
- Ange vektorbäddningssökvägarna i inbäddningsprincipen för vektorer.
- Inkludera önskade vektorindex i indexeringsprincipen för containern.
För efterföljande avsnitt i den här artikeln överväger vi strukturen nedan 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]
}
Skapa en vektorinbäddningsprincip för din container
Därefter måste du definiera en containervektorprincip. Den här principen innehåller information som används för att informera Azure Cosmos DB-frågemotorn om hur vektoregenskaper i VectorDistance-systemfunktionerna ska hanteras. Detta informerar också vektorindexeringsprincipen om nödvändig information, om du väljer att ange en. Följande information ingår i policyn för inneslutna vektorer:
- "path": Egenskapssökvägen som innehåller vektorer
- "datatype": Typen av element i vektorn (standard float32)
- "dimensions": Längden på varje vektor i sökvägen (standard 1536)
- "distanceFunction": Måttet som används för att beräkna avstånd/likhet (standard cosiné)
I vårt exempel med bokinformation kan vektorprincipen se ut som JSON-exemplet:
vector_embedding_policy = {
"vectorEmbeddings": [
{
"path": "/coverImageVector",
"dataType": "float32",
"distanceFunction": "dotproduct",
"dimensions": 8
},
{
"path": "/contentVector",
"dataType": "float32",
"distanceFunction": "cosine",
"dimensions": 10
}
]
}
Skapa ett vektorindex i indexeringsprincipen
När vektorbäddningsvägarna har bestämts måste vektorindex läggas till i indexeringsprincipen. I det här exemplet skulle indexeringsprincipen se ut ungefär så här:
indexing_policy = {
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/\"_etag\"/?",
"path": "/coverImageVector/*",
"path": "/contentVector/*"
}
],
"vectorIndexes": [
{"path": "/coverImageVector",
"type": "quantizedFlat"
},
{"path": "/contentVector",
"type": "quantizedFlat"
}
]
}
Viktigt!
Vektorsökvägen har lagts till i avsnittet "excludedPaths" i indexeringsprincipen för att säkerställa optimerad prestanda för infogning. Om du inte lägger till vektorsökvägen till "excludedPaths" resulterar det i högre RU-laddning och svarstid för vektorinfogningar.
Viktigt!
För närvarande stöds endast vektorsökning i Azure Cosmos DB för NoSQL på nya containrar. Du måste ange både containervektorprincipen och valfri vektorindexeringsprincip när containern skapas eftersom den inte kan ändras senare.
Skapa container med vektorprincip
För närvarande stöds vektorsökningsfunktionen för Azure Cosmos DB for NoSQL endast på nya containrar, så du måste tillämpa vektorprincipen när containern skapas och den kan inte ändras senare.
try:
container = db.create_container_if_not_exists(
id=CONTAINER_NAME,
partition_key=PartitionKey(path='/id'),
indexing_policy=indexing_policy,
vector_embedding_policy=vector_embedding_policy)
print('Container with id \'{0}\' created'.format(id))
except exceptions.CosmosHttpResponseError:
raise
Köra vektorlikhetssökningsfråga
När du har skapat en container med önskad vektorprincip och infogat vektordata i containern kan du utföra en vektorsökning med hjälp av systemfunktionen Vektoravstånd i en fråga. 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 – "matrecept". När du har bäddat in för sökfrågan kan du använda den i funktionen VectorDistance i vektorsökningsfrågan och hämta alla objekt som liknar din fråga som du ser här:
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 Python:
query_embedding = [1,2,3,4,5,6,7,8,9,10]
# Query for items
for item in container.query_items(
query='SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)',
parameters=[
{"name": "@embedding", "value": query_embedding}
],
enable_cross_partition_query=True):
print(json.dumps(item, indent=True))