Vektoritietokannat

Vektoritietokanta tallentaa ja hallitsee tietoja vektoreina, jotka ovat arvopisteiden numeerisia matriiseja.

Vektoreiden käyttö mahdollistaa monimutkaiset kyselyt ja analyysit, koska vektoreita voi vertailla ja analysoida edistyneillä tekniikoilla, joilla löydetään samankaltaisia kohteita ja järjestää data ryhmiin, kuten klusterointi, kvantisointi ja vektorien samankaltaisuushaku.

Perinteiset tietokannat eivät sovellu hyvin käsittelemään korkean ulottuvuuden dataa, joka on yhä yleisemmässä data-analytiikassa. Vektoritietokannat on kuitenkin suunniteltu käsittelemään suuriulotteisia tietoja, kuten tekstiä, kuvia ja ääntä, edustamalla niitä vektoreina. Vektoritietokannat ovat hyödyllisiä tehtävissä, kuten koneoppimisessa, luonnollisen kielen käsittelyssä ja kuvantunnistuksessa, joissa pyritään tunnistamaan toistuvuuksia tai samankaltaisuuksia suurissa tietojoukoissa.

Tämä artikkeli antaa taustatietoa vektoritietokannoista ja selittää käsitteellisesti, miten voit käyttää Eventhouse vektoritietokantana Real-Time Intelligencessa vuonna Microsoft Fabric. Katso käytännön esimerkki kohdasta Opetusohjelma: Eventhousen käyttäminen vektoritietokantana.

Keskeiset käsitteet

Vektoritietokannoissa käytetään seuraavia avainkäsitteitä:

Vektorien samankaltaisuus

Vektorien samankaltaisuus on mittari siitä, kuinka erilaisia (tai samankaltaisia) kaksi tai useampia vektoreita ovat. Vektorien samankaltaisuushaku on tekniikka, jota käytetään samankaltaisten vektorien löytämiseen tietojoukosta. Vektoreita verrataan etäisyysmetriikalla, kuten euklidisella etäisyydellä tai kosini-samankaltaisuudella. Mitä lähempänä kaksi vektoria ovat, sitä samankaltaisia ne ovat.

Upotus

Upotus on yleinen tapa edustaa tietoja vektorimuodossa, jota käytetään vektoritietokannoissa. Upottaminen on tietopalan, kuten sanan, tekstiasiakirjan tai kuvan, matemaattinen esitys, joka on suunniteltu sieppaamaan sen semanttinen merkitys. Upotuksia luodaan algoritmeilla, jotka analysoivat dataa ja tuottavat joukon numeerisia arvoja, jotka edustavat sen keskeisiä ominaisuuksia. Esimerkiksi sanan upottaminen voi edustaa sen merkitystä, kontekstia ja yhteyttä muihin sanoihin. Upotusten luontiprosessi on yksinkertainen. Vaikka niitä voi luoda käyttämällä perinteisiä Python-paketteja (esim. spaCy, sent2vec, Gensim), suuret kielimallit (LLM) tuottavat korkealaatuisia upotuksia semanttiseen tekstihakuun. Esimerkiksi voit lähettää tekstiä upotusmalliin Azure OpenAI, ja se tuottaa vektoriesityksen, jonka voit tallentaa analyysiä varten. Lisätietoja löytyy osoitteesta Understand embeddings in Azure OpenAI Service.

Yleinen työnkulku

Kaavio vektoreiksi tallennetun tekstin upottamisesta, tallentamisesta ja kyselystä.

Vektoritietokannan käyttämisen yleinen työnkulku on seuraava:

  1. Upota tiedot: Muunna tiedot vektorimuotoon upotusmallin avulla. Voit esimerkiksi upottaa tekstitietoja OpenAI-mallin avulla.
  2. Tallenna vektorit: Tallenna upotetut vektorit vektoritietokantaan. Voit lähettää upotetut tiedot Eventhouseen, jossa voit tallentaa ja hallita vektoreita.
  3. Upota kysely: muunna kyselytiedot vektorimuotoon käyttämällä samaa upotusmallia, jota käytetään tallennettujen tietojen upottamiseen.
  4. Kyselyvektorit: käytä vektorien samankaltaisuushakua etsiäksesi tietokannasta merkintöjä, jotka muistuttavat kyselyä.

Eventhouse vektoritietokantana

Vektorien samankaltaisuushaun ytimessä on kyky tallentaa, indeksoida ja kysyä vektoridataa. Tapahtumatalot tarjoavat ratkaisun suurten tietomäärien käsittelyyn ja analysointiin erityisesti tilanteissa, jotka edellyttävät reaaliaikaista analysointia ja tutkimista. Tämä ominaisuus tekee Eventhousesta erinomaisen valinnan vektorien tallentamiseen ja etsimiseen.

Seuraavat Eventhousen osat mahdollistavat sen käytön vektoritietokantana:

  • Dynaaminen tietotyyppi, johon voidaan tallentaa jäsentämättömiä tietoja, kuten matriiseja ja ominaisuussäilöjä. Käytä tätä tietotyyppiä vektoriarvojen tallentamiseen. Voit laajentaa vektoriarvoa tallentamalla alkuperäiseen objektiin liittyviä metatietoja taulukon erillisinä sarakkeina.
  • KoodaustyyppiVector16, joka on suunniteltu liukulukuvektorien tallentamiseen 16-bittisen tarkkuudella. Tässä koodauksessa käytetään Bfloat16 oletus-64 bittiä sen sijaan. Käytä tätä koodausta koneoppimisen vektoriupotusten tallentamiseen, koska se vähentää tallennustarvetta nelinkertaiseksi ja nopeuttaa vektoriprosessointifunktioita kuten series_dot_product() ja series_cosine_similarity() moninkertaisesti.
  • series_cosine_similarity-funktio, jota voit käyttää vektorien samankaltaisuushakujen tekemiseen Eventhouseen tallennettujen vektorien päälle.

Optimoi skaalausta varten

Lisätietoja vektorien samankaltaisuushaun optimoinnista löytyy blogista.

Suorituskyvyn ja hakuaikojen maksimoimiseksi seuraa seuraavia vaiheita:

  1. Määritä Upottamissarakkeen koodaus -arvoksi Vector16. Se on vektoreiden 16-bittinen koodaus (oletusarvoisen 64-bittisen sijaan).
  2. Tallenna upotusvektoritaulu kaikille klusterisolmuille, joissa on vähintään yksi sirpale per prosessori. Tämän tavoitteen saavuttamiseksi noudata seuraavia vaiheita:
    1. Rajoita sirpaleille upotettavien vektoreiden määrää muuttamalla sirpalekäytännön ShardEngineMaxRowCount-arvoa. Tämä asetus jakaa datasi kaikkiin saatavilla oleviin laskentaresursseihin nopeampia hakuja varten.
    2. Muuta yhdistämiskäytännön RowCountUpperBoundForMerge-arvoa. Yhdistämiskäytäntöä tarvitaan, jotta kokoon yhdistämisen jälkeiset laajennukset voidaan estää.

Esimerkkejä optimointivaiheista

Seuraavassa esimerkissä määritellään staattinen vektoritaulu 1M vektorin tallentamiseen. Määrittelet upotuspolitiikan Vector16:ksi ja asetat sharding- ja merging-käytännöt optimoimaan taulukon vektorien samankaltaisuushakua varten. Tässä esimerkissä oletetaan, että klustereissa on 20 solmua ja jokaisessa solmussa on 16 prosessoria. Taulukon sirpaleissa tulisi olla enintään 1 000 000/(20*16)=3 125 riviä.

  1. Suorita seuraavat KQL-komennot yksi kerrallaan luodaksesi tyhjän taulun ja asettaaksesi tarvittavat käytännöt ja koodauksen:

    .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. Käytä edellisessä vaiheessa luodun ja määritetyn taulukon tietoja.

Seuraava vaihe