Dela via


Vektorsökning i Azure Cosmos DB för NoSQL

Azure Cosmos DB for NoSQL erbjuder nu effektiv vektorindexering och sökning. Den här funktionen är utformad för att hantera högdimensionella vektorer, vilket möjliggör effektiv och korrekt vektorsökning i valfri skala. Nu kan du lagra vektorer direkt i dokumenten tillsammans med dina data. Varje dokument i databasen kan inte bara innehålla traditionella schemafria data, utan även högdimensionella vektorer som andra egenskaper för dokumenten. Den här samlokaliseringen av data och vektorer möjliggör effektiv indexering och sökning, eftersom vektorerna lagras i samma logiska enhet som de data de representerar. Att hålla ihop vektorer och data förenklar datahantering, AI-programarkitekturer och effektiviteten för vektorbaserade åtgärder.

Azure Cosmos DB for NoSQL erbjuder den flexibilitet som erbjuds när du väljer vektorindexeringsmetod:

  • En "platt" eller k-närmaste granne exakt sökning (kallas ibland brute-force) kan ge 100% hämtningsåterkallelse för mindre, fokuserade vektorsökningar. särskilt när de kombineras med frågefilter och partitionsnycklar.
  • Ett kvantiserat platt index som komprimerar vektorer med hjälp av DiskANN-baserade kvantiseringsmetoder för bättre effektivitet i kNN-sökningen.
  • DiskANN, en uppsättning toppmoderna vektorindexeringsalgoritmer som utvecklats av Microsoft Research för att driva effektiv vektorsökning med hög noggrannhet i valfri skala.

Läs mer om vektorindexering här

Vektorsökning i Azure Cosmos DB kan kombineras med alla andra Azure Cosmos DB NoSQL-frågefilter och -index som stöds med hjälp av WHERE satser. På så sätt kan dina vektorsökningar vara de mest relevanta data för dina program.

Den här funktionen förbättrar kärnfunktionerna i Azure Cosmos DB, vilket gör den mer mångsidig för hantering av vektordata och sökkrav i AI-program.


Vad är ett vektorlager?

Ett vektorlager eller en vektordatabas är en databas som är utformad för att lagra och hantera inbäddningar av vektorer, som är matematiska representationer av data i ett högdimensionellt utrymme. I det här utrymmet motsvarar varje dimension en funktion i data och tiotusentals dimensioner kan användas för att representera avancerade data. En vektors position i det här utrymmet representerar dess egenskaper. Ord, fraser eller hela dokument och bilder, ljud och andra typer av data kan alla vektoriseras.

Hur fungerar ett vektorlager?

I ett vektorlager används algoritmer för vektorsökning för att indexera och fråga inbäddningar. Några välkända vektorsökningsalgoritmer är HNSW (Hierarchical Navigable Small World), Inverted File (IVF), DiskANN osv. Vektorsökning är en metod som hjälper dig att hitta liknande objekt baserat på deras dataegenskaper i stället för exakta matchningar i ett egenskapsfält. Den här tekniken är användbar i program som att söka efter liknande text, hitta relaterade bilder, göra rekommendationer eller till och med identifiera avvikelser. Den används för att köra frågor mot vektorinbäddningar av dina data som du skapade med hjälp av en maskininlärningsmodell med hjälp av ett inbäddnings-API. Exempel på API:er för inbäddningar är Azure OpenAI-inbäddningar eller Hugging Face på Azure. Vektorsökning mäter avståndet mellan datavektorerna och frågevektorn. De datavektorer som är närmast din frågevektor är de som är mest lika semantiskt.

I den integrerade vektordatabasen i Azure Cosmos DB för NoSQL kan inbäddningar lagras, indexeras och efterfrågas tillsammans med de ursprungliga data. Den här metoden eliminerar den extra kostnaden för att replikera data i en separat ren vektordatabas. Dessutom håller den här arkitekturen samman vektorbäddningar och ursprungliga data, vilket bättre underlättar multimodala dataåtgärder och ger bättre datakonsekvens, skalning och prestanda.

Aktivera vektorindexerings- och sökfunktionen

Vektorindexering och sökning i Azure Cosmos DB för NoSQL kräver aktivering på sidan Funktioner i Azure Cosmos DB. 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 funktionen "Vector Search in Azure Cosmos DB for NoSQL".

  4. Läs beskrivningen av funktionen för att bekräfta att du vill aktivera den.

  5. Välj "Aktivera" för att aktivera vektorindexerings- och sökfunktionen.

    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 aktivera kontot fullt ut.

Principer för containervektor

Om du utför vektorsökning med Azure Cosmos DB för NoSQL måste du definiera en vektorprincip för containern. Detta ger viktig information för databasmotorn för att utföra effektiv likhetssökning efter vektorer som finns i containerns dokument. 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": egenskapen som innehåller vektorn (krävs).
  • "datatype": datatypen för vektoregenskapen (standard float32). 
  • "dimensions": Dimensioniteten eller längden på varje vektor i sökvägen. Alla vektorer i en sökväg bör ha samma antal dimensioner. (standard 1536).
  • "distanceFunction": Måttet som används för att beräkna avstånd/likhet. Mått som stöds är:
    • cosinin, som har värden från -1 (minst lika) till +1 (mest liknande).
    • dot-produkt, som har värden från -inf (minst liknande) till +inf (mest liknande).
    • euclidean, som har värden från 0 (mest liknande) till +inf) (minst lika).

Kommentar

Varje unik sökväg kan ha högst en princip. Flera principer kan dock anges förutsatt att de alla riktar in sig på en annan sökväg.

Containervektorprincipen kan beskrivas som JSON-objekt. Här är två exempel på giltiga principer för containervektorer:

En princip med en enda vektorsökväg

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        }
    ]
}

En princip med två vektorsökvägar

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        },
        {
            "path":"/vector2",
            "dataType":"int8",
            "distanceFunction":"dotproduct",
            "dimensions":100
        }
    ]
}

Principer för vektorindexering

Vektorindex ökar effektiviteten när du utför vektorsökningar med hjälp av VectorDistance systemfunktionen. Vektorsökningar har lägre svarstid, högre dataflöde och mindre RU-förbrukning när du använder ett vektorindex. Du kan ange följande typer av vektorindexprinciper:

Typ Beskrivning Maximalt antal dimensioner
flat Lagrar vektorer i samma index som andra indexerade egenskaper. 505
quantizedFlat Kvantifierar (komprimerar) vektorer innan de lagras i indexet. Detta kan förbättra svarstiden och dataflödet på bekostnad av en liten mängd noggrannhet. 4096
diskANN Skapar ett index baserat på DiskANN för snabb och effektiv ungefärlig sökning. 4096

Kommentar

Indexen quantizedFlat och diskANN kräver att minst 1 000 vektorer infogas. Detta för att säkerställa noggrannheten i kvantiseringsprocessen. Om det finns färre än 1 000 vektorer körs en fullständig genomsökning i stället och leder till högre RU-avgifter för en vektorsökningsfråga.

Några punkter att notera:

  • Indextyperna flat och quantizedFlat använder Azure Cosmos DB:s index för att lagra och läsa varje vektor när du utför en vektorsökning. Vektorsökningar med ett flat index är råstyrkesökningar och ger 100 % noggrannhet eller återkallande. Det vill: det är garanterat att hitta de mest liknande vektorerna i datamängden. Det finns dock en begränsning av 505 dimensioner för vektorer i ett platt index.

  • Indexet quantizedFlat lagrar kvantiserade (komprimerade) vektorer i indexet. Vektorsökningar med quantizedFlat index är också råstyrkesökningar, men deras noggrannhet kan vara något mindre än 100 % eftersom vektorerna kvantifieras innan de läggs till i indexet. Vektorsökningar med quantized flat bör dock ha lägre svarstid, högre dataflöde och lägre RU-kostnad än vektorsökningar i ett flat index. Det här är ett bra alternativ för mindre scenarier eller scenarier där du använder frågefilter för att begränsa vektorsökningen till en relativt liten uppsättning vektorer. quantizedFlat rekommenderas när antalet vektorer som ska indexeras är någonstans runt 50 000 eller färre per fysisk partition. Detta är dock bara en allmän riktlinje och faktiska prestanda bör testas eftersom varje scenario kan skilja sig åt.

  • Indexet diskANN är ett separat index som definierats specifikt för vektorer som använder DiskANN, en uppsättning vektorindexeringsalgoritmer med höga prestanda som utvecklats av Microsoft Research. DiskANN-index kan erbjuda några av de lägsta svarstiderna, det högsta dataflödet och de lägsta RU-kostnadsfrågorna, samtidigt som hög noggrannhet bibehålls. I allmänhet är DiskANN den mest högpresterande av alla indextyper om det finns fler än 50 000 vektorer per fysisk partition.

Här är exempel på giltiga principer för vektorindex:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        },
        {
            "path": "/vector1/*"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "diskANN"
        }
    ]
}
{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        },
        {
            "path": "/vector1/*",
        },
        {
            "path": "/vector2/*",
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "quantizedFlat"
        },
        {
            "path": "/vector2",
            "type": "diskANN"
        }
    ]
}

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!

Jokertecken (*, []) stöds för närvarande inte i vektorprincipen eller vektorindexet.

Utföra vektorsökning med frågor med VectorDistance()

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. Ett exempel på en NoSQL-fråga som projicerar likhetspoängen som alias SimilarityScoreoch sorterar i den ordning som mest liknar minst lika:

SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3])   

Viktigt!

Använd alltid en TOP N sats i instruktionen för SELECT en fråga. Annars försöker vektorsökningen returnera många fler resultat och frågan kostar fler RU:er och har högre svarstid än nödvändigt.

Aktuella begränsningar

Vektorindexering och sökning i Azure Cosmos DB för NoSQL har vissa begränsningar.

  • quantizedFlat och diskANN index kräver att minst 1 000 vektorer indexeras för att säkerställa att kvantiseringen är korrekt. Om färre än 1 000 vektorer indexeras används en fullständig genomsökning i stället och RU-avgifterna kan vara högre.
  • Vektorer som indexeras med flat indextypen kan vara högst 505 dimensioner. Vektorer som indexeras med quantizedFlat indextypen eller DiskANN kan vara högst 4 096 dimensioner.
  • Indexet quantizedFlat använder samma kvantiseringsmetod som DiskANN.
  • Vektorinfogningshastigheten bör begränsas. Mycket stor inmatning (utöver 5M-vektorer) kan kräva ytterligare indexgenereringstid.
  • Databaser för delat dataflöde stöds inte.
  • För närvarande stöds inte vektorindexering och sökning på konton med Analysarkiv (och Synapse Link) och Delat dataflöde.
  • När vektorindexering och sökning har aktiverats i en container kan den inte inaktiveras.

Gå vidare