Vektorové databáze
Vektorová databáze ukládá a spravuje data ve formě vektorů, což jsou číselná pole datových bodů.
Použití vektorů umožňuje komplexní dotazy a analýzy, protože vektory je možné porovnat a analyzovat pomocí pokročilých technik, jako je hledání vektorové podobnosti, kvantování a shlukování. Tradiční databáze nejsou vhodné pro zpracování vysoce dimenzionálních dat, která jsou v analýze dat stále častější. Vektorové databáze jsou však navrženy tak, aby zpracovávaly vysoce dimenzionální data, jako je text, obrázky a zvuk, jejich reprezentací jako vektorů. Vektorové databáze jsou užitečné pro úlohy, jako je strojové učení, zpracování přirozeného jazyka a rozpoznávání obrázků, kde je cílem identifikovat vzory nebo podobnosti ve velkých datových sadách.
Tento článek obsahuje určité pozadí o vektorových databázích a vysvětluje koncepční způsob použití eventhouse jako vektorové databáze v sadě Microsoft Fabric v reálném čase. Praktický příklad najdete v tématu Kurz: Použití eventhouse jako vektorové databáze.
Klíčové koncepty
V databázích vektorů se používají následující klíčové koncepty:
Podobnost vektorů
Podobnost vektorů je míra, jak jsou různé (nebo podobné) dva nebo více vektorů. Hledání vektorové podobnosti je technika použitá k vyhledání podobných vektorů v datové sadě. Vektory se porovnávají pomocí metriky vzdálenosti, například euklidovské vzdálenosti nebo kosinusové podobnosti. Čím blíž jsou dva vektory, tím více jsou podobné.
Vkládání
Vkládání představuje běžný způsob reprezentace dat ve vektorovém formátu pro použití v databázích vektorů. Vložení je matematická reprezentace části dat, například slova, textového dokumentu nebo obrázku, která je navržená tak, aby zachytila jeho sémantický význam. Vkládání se vytváří pomocí algoritmů, které analyzují data a generují sadu číselných hodnot, které představují jeho klíčové funkce. Vložení slova může například představovat jeho význam, jeho kontext a vztah k jiným slovům. Proces vytváření vkládání je jednoduchý. I když je možné je vytvořit pomocí standardních balíčků Pythonu (například spaCy, sent2vec, Gensim), vygenerují velké jazykové modely (LLM) pro sémantické vyhledávání textu nejvyšší kvalitu vkládání. Můžete například odeslat text do modelu vkládání v Azure OpenAI a vygeneruje vektorovou reprezentaci, která se dá uložit pro analýzu. Další informace najdete v tématu Vysvětlení vkládání ve službě Azure OpenAI.
Obecný pracovní postup
Obecný pracovní postup pro použití vektorové databáze je následující:
- Vložení dat: Převod dat do formátu vektoru pomocí modelu pro vložení Textová data můžete například vložit pomocí modelu OpenAI.
- Ukládat vektory: Uložte vložené vektory do vektorové databáze. Vložená data můžete odeslat do eventhouse pro ukládání a správu vektorů.
- Dotaz pro vložení: Převeďte data dotazu na vektorový formát pomocí stejného modelu vkládání, který se používá k vložení uložených dat.
- Vektory dotazu: Hledání vektorové podobnosti slouží k vyhledání položek v databázi, které jsou podobné dotazu.
Eventhouse jako vektorová databáze
Jádrem hledání vektorové podobnosti je schopnost ukládat, indexovat a dotazovat vektorová data. Eventhouses poskytují řešení pro zpracování a analýzu velkých objemů dat, zejména ve scénářích vyžadujících analýzu a průzkum v reálném čase, což je skvělou volbou pro ukládání a vyhledávání vektorů.
Následující komponenty umožňují použití vektorové databáze Eventhouse:
- Dynamický datový typ, který může ukládat nestrukturovaná data, jako jsou pole a kontejnery vlastností. Proto se pro ukládání vektorových hodnot doporučuje datový typ. Hodnotu vektoru můžete dále rozšířit uložením metadat souvisejících s původním objektem jako samostatných sloupců v tabulce.
- Typ
Vector16
kódování určený pro ukládání vektorů čísel s plovoucí desetinnou čárkou do 16bitové přesnosti, která používáBfloat16
místo výchozích 64 bitů. Toto kódování se doporučuje pro ukládání vložených vektorů ML, protože snižuje požadavky na úložiště faktorem čtyř a urychluje funkce zpracování vektorů, jako jsou series_dot_product() a series_cosine_similarity(). - Funkce series_cosine_similarity , která může provádět vyhledávání vektorové podobnosti nad vektory uloženými v Eventhouse.
Optimalizace pro škálování
Další informace o optimalizaci vyhledávání podobnosti vektorů najdete v blogu.
Pokud chcete maximalizovat výkon a výsledné doby hledání, postupujte následovně:
- Nastavte kódování sloupce embeddings na Vector16, 16bitové kódování vektorů koeficientů (místo výchozí 64bitové).
- Uložte tabulku vektorů vkládání na všechny uzly clusteru s alespoň jedním horizontálním oddílem na procesor, který provádí následující kroky:
- Omezte počet vektorů vkládání na horizontální oddíl změnou hodnoty ShardEngineMaxRowCount zásad horizontálního dělení. Zásada horizontálního dělení vyrovnává data na všech uzlech s několika rozsahy na jeden uzel, aby vyhledávání bylo možné použít všechny dostupné procesory.
- Změňte RowCountUpperBoundForMerge zásady sloučení. Zásady sloučení je potřeba k potlačení slučování rozsahů po ingestování.
Příklady kroků optimalizace
V následujícím příkladu je pro ukládání vektorů 1M definována tabulka statických vektorů. Zásady vkládání jsou definovány jako Vector16 a zásady horizontálního dělení a slučování jsou nastaveny tak, aby optimalizovaly tabulku pro vyhledávání vektorové podobnosti. V tomto případě předpokládejme, že cluster má 20 uzlů, z nichž každý má 16 procesorů. Horizontální oddíly tabulky by měly obsahovat maximálně 1 000000/(20*16)=3125 řádků.
Následující příkazy KQL jsou spouštěné jedním po druhém, které vytvoří prázdnou tabulku a nastaví požadované zásady a kódování:
.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
Ingestování dat do tabulky vytvořené a definované v předchozím kroku