Dela via


Vektordatabaser

En vektordatabas lagrar och hanterar data i form av vektorer, som är numeriska matriser med datapunkter.

Användningen av vektorer möjliggör komplexa frågor och analyser, eftersom vektorer kan jämföras och analyseras med hjälp av avancerade tekniker som vektorlikhetssökning, kvantisering och klustring. Traditionella databaser lämpar sig inte för hantering av högdimensionella data som blir allt vanligare inom dataanalys. Vektordatabaser är dock utformade för att hantera högdimensionella data, till exempel text, bilder och ljud, genom att representera dem som vektorer. Vektordatabaser är användbara för uppgifter som maskininlärning, bearbetning av naturligt språk och bildigenkänning, där målet är att identifiera mönster eller likheter i stora datamängder.

Den här artikeln ger lite bakgrund om vektordatabaser och förklarar konceptuellt hur du kan använda en Eventhouse som en vektordatabas i Realtidsinformation i Microsoft Fabric. Ett praktiskt exempel finns i Självstudie: Använda en Eventhouse som en vektordatabas.

Nyckelbegrepp

Följande viktiga begrepp används i vektordatabaser:

Vektorlikhet

Vektorlikhet är ett mått på hur olika (eller liknande) två eller flera vektorer är. Vektorlikhetssökning är en teknik som används för att hitta liknande vektorer i en datamängd. Vektorer jämförs med ett avståndsmått, till exempel Euklidiska avstånd eller cosinuslikhet. Ju närmare två vektorer är, desto mer lika är de.

Inbäddningar

Inbäddningar är ett vanligt sätt att representera data i ett vektorformat för användning i vektordatabaser. En inbäddning är en matematisk representation av ett datastycke, till exempel ett ord, textdokument eller en bild, som är utformad för att fånga dess semantiska betydelse. Inbäddningar skapas med hjälp av algoritmer som analyserar data och genererar en uppsättning numeriska värden som representerar dess viktigaste funktioner. En inbäddning för ett ord kan till exempel representera dess innebörd, dess kontext och dess relation till andra ord. Processen att skapa inbäddningar är enkel. De kan skapas med python-standardpaket (till exempel spaCy, sent2vec, Gensim), men LLM (Large Language Models) genererar inbäddningar av högsta kvalitet för semantisk textsökning. Du kan till exempel skicka text till en inbäddningsmodell i Azure OpenAI och generera en vektorrepresentation som kan lagras för analys. Mer information finns i Förstå inbäddningar i Azure OpenAI-tjänsten.

Allmänt arbetsflöde

Schema för hur du bäddar in, lagrar och frågar efter text som lagras som vektorer.

Det allmänna arbetsflödet för att använda en vektordatabas är följande:

  1. Bädda in data: Konvertera data till vektorformat med hjälp av en inbäddningsmodell. Du kan till exempel bädda in textdata med en OpenAI-modell.
  2. Lagra vektorer: Lagra de inbäddade vektorerna i en vektordatabas. Du kan skicka inbäddade data till ett Eventhouse för att lagra och hantera vektorerna.
  3. Inbäddningsfråga: Konvertera frågedata till vektorformat med samma inbäddningsmodell som används för att bädda in lagrade data.
  4. Frågevektorer: Använd vektorlikhetssökning för att hitta poster i databasen som liknar frågan.

Eventhouse som en vektordatabas

Kärnan i Vector Similarity Search är möjligheten att lagra, index och frågevektordata. Eventhouses är en lösning för hantering och analys av stora mängder data, särskilt i scenarier som kräver analys och utforskning i realtid, vilket gör det till ett utmärkt val för lagring och sökning av vektorer.

Följande komponenter i aktivera användningen av Eventhouse en vektordatabas:

  • Den dynamiska datatypen, som kan lagra ostrukturerade data, till exempel matriser och egenskapspåsar. Datatypen rekommenderas därför för lagring av vektorvärden. Du kan utöka vektorvärdet ytterligare genom att lagra metadata relaterade till det ursprungliga objektet som separata kolumner i tabellen.
  • Kodningstypen Vector16 som är utformad för att lagra vektorer med flyttalsnummer med 16 bitars precision, som använder Bfloat16 i stället för standardvärdet 64 bitar. Den här kodningen rekommenderas för lagring av ML-vektorinbäddningar eftersom den minskar lagringskraven med en faktor på fyra och påskyndar vektorbearbetningsfunktioner som series_dot_product() och series_cosine_similarity() efter storleksordning.
  • Funktionen series_cosine_similarity , som kan utföra vektorlikhetssökningar ovanpå de vektorer som lagras i Eventhouse.

Optimera för skalning

Mer information om hur du optimerar vektorlikhetssökning finns i bloggen.

Följ följande steg för att maximera prestanda och de resulterande söktiderna:

  1. Ange kodningen för kolumnen embeddings till Vector16, 16-bitarskodning av vektorkoefficienterna (i stället för standardvärdet 64-bitars).
  2. Lagra tabellen inbäddningsvektorer på alla klusternoder med minst en shard per processor, vilket görs med följande steg:
    1. Begränsa antalet inbäddningsvektorer per shard genom att ändra ShardEngineMaxRowCount för partitioneringsprincipen. Partitioneringsprincipen balanserar data på alla noder med flera omfattningar per nod så att sökningen kan använda alla tillgängliga processorer.
    2. Ändra RowCountUpperBoundForMerge för sammanslagningsprincipen. Sammanslagningsprincipen krävs för att förhindra sammanslagningsfunktioner efter inmatning.

Exempel på optimeringssteg

I följande exempel definieras en statisk vektortabell för lagring av 1M-vektorer. Inbäddningsprincipen definieras som Vector16 och principerna för horisontell partitionering och sammanslagning är inställda för att optimera tabellen för vektorlikhetssökning. För detta antar vi att klustret har 20 noder var och en har 16 processorer. Tabellens shards bör innehålla högst 1000000/(20*16)=3125 rader.

  1. Följande KQL-kommandon körs en i taget för att skapa den tomma tabellen och ange nödvändiga principer och kodning:

    .create table embedding_vectors(vector_id:long, vector:dynamic)                                  //  This is a sample selection of columns, you can add more columns
    
    .alter column embedding_vectors.vector policy encoding type = 'Vector16'                         // Store the coefficients in 16 bits instead of 64 bits accelerating calculation of dot product, suppress redundant indexing
    
    .alter-merge table embedding_vectors policy sharding '{ "ShardEngineMaxRowCount" : 3125 }'       // Balanced data on all nodes and, multiple extents per node so the search can use all processors 
    
    .alter-merge table embedding_vectors policy merge '{ "RowCountUpperBoundForMerge" : 3125 }'      // Suppress merging extents after ingestion
    
  2. Mata in data till tabellen som skapades och definierades i föregående steg.

Gå vidare