Dela via


Index- och frågevektorer i Azure Cosmos DB för NoSQL i Python.

GÄLLER FÖR: NoSQL

Vektorsökning i Azure Cosmos DB för NoSQL är för närvarande en förhandsversionsfunktion. Du måste registrera dig för förhandsversionen innan du använder den. Den här artikeln beskriver följande steg:

  1. Registrera dig för förhandsversionen av Vector Search i Azure Cosmos DB för NoSQL
  2. Konfigurera Azure Cosmos DB-containern för vektorsökning
  3. Redigeringsvektor för inbäddningsprincip
  4. Lägga till vektorindex i containerindexeringsprincipen
  5. Skapa en container med vektorindex och inbäddningsprincip för vektorer
  6. Utföra en vektorsökning på lagrade data.
  7. 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

Registrera dig för förhandsversionen

Vektorsökning för Azure Cosmos DB för NoSQL kräver förhandsversion av funktionsregistrering. Följ stegen nedan för att registrera dig:

  1. Gå till resurssidan för Azure Cosmos DB for NoSQL.

  2. Välj fönstret "Funktioner" under menyalternativet "Inställningar".

  3. Välj "Vector Search in Azure Cosmos DB for NoSQL".

  4. Läs beskrivningen av funktionen för att bekräfta att du vill registrera dig i förhandsversionen.

  5. Välj "Aktivera" för att registrera dig i förhandsversionen.

Kommentar

Registreringsbegäran godkänns automatiskt, men det kan ta flera minuter att börja gälla.

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.

  1. Skapa och lagra vektorinbäddningar för de fält där du vill utföra vektorsökning.
  2. Ange vektorbäddningssökvägarna i inbäddningsprincipen för vektorer.
  3. 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 containern.

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\"/?" 
        } 
    ], 
    "vectorIndexes": [ 
        {"path": "/coverImageVector", 
         "type": "quantizedFlat" 
        }, 
        {"path": "/contentVector", 
         "type": "quantizedFlat" 
        } 
    ] 
} 

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. Båda principerna kommer att kunna ändras i en framtida förbättring av förhandsversionsfunktionen.

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 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))