Wektorowe bazy danych
Wektorowa baza danych przechowuje dane i zarządza nimi w postaci wektorów, które są tablicami liczbowymi punktów danych.
Użycie wektorów umożliwia wykonywanie złożonych zapytań i analiz, ponieważ wektory mogą być porównywane i analizowane przy użyciu zaawansowanych technik, takich jak wyszukiwanie podobieństwa wektorów, kwantyzacja i klastrowanie. Tradycyjne bazy danych nie nadają się do obsługi danych o wysokim wymiarach, które stają się coraz bardziej powszechne w analizie danych. Jednak wektorowe bazy danych są przeznaczone do obsługi danych o wysokim wymiarach, takich jak tekst, obrazy i dźwięk, reprezentując je jako wektory. Bazy danych wektorów są przydatne w przypadku zadań takich jak uczenie maszynowe, przetwarzanie języka naturalnego i rozpoznawanie obrazów, gdzie celem jest identyfikowanie wzorców lub podobieństw w dużych zestawach danych.
W tym artykule przedstawiono podstawowe informacje na temat wektorowych baz danych i wyjaśniono koncepcyjnie, jak można użyć bazy danych eventhouse jako wektorowej bazy danych w analizie czasu rzeczywistego w usłudze Microsoft Fabric. Aby zapoznać się z praktycznym przykładem, zobacz Samouczek: używanie usługi Eventhouse jako wektorowej bazy danych.
Najważniejsze pojęcia
W bazach danych wektorów są używane następujące kluczowe pojęcia:
Podobieństwo wektorów
Podobieństwo wektorów to miara różnicy (lub podobnych) co najmniej dwóch wektorów. Wyszukiwanie podobieństwa wektorów to technika używana do znajdowania podobnych wektorów w zestawie danych. Wektory są porównywane przy użyciu metryki odległości, takiej jak odległość euklidesowa lub podobieństwo cosinusu. Im bliżej znajdują się dwa wektory, tym bardziej podobne są.
Osadzanie
Osadzanie to typowy sposób reprezentowania danych w formacie wektorowym do użycia w wektorowych bazach danych. Osadzanie to matematyczna reprezentacja elementu danych, takiego jak słowo, dokument tekstowy lub obraz, który jest przeznaczony do przechwytywania jego znaczenia semantycznego. Osadzanie są tworzone przy użyciu algorytmów, które analizują dane i generują zestaw wartości liczbowych reprezentujących jego kluczowe funkcje. Na przykład osadzanie wyrazu może reprezentować jego znaczenie, kontekst i relację z innymi słowami. Proces tworzenia osadzania jest prosty. Można je tworzyć przy użyciu standardowych pakietów języka Python (na przykład spaCy, sent2vec, Gensim), duże modele językowe (LLM) generują najwyższej jakości osadzanie na potrzeby wyszukiwania tekstu semantycznego. Można na przykład wysłać tekst do modelu osadzania w usłudze Azure OpenAI i wygenerować reprezentację wektorową, która może być przechowywana na potrzeby analizy. Aby uzyskać więcej informacji, zobacz Omówienie osadzania w usłudze Azure OpenAI Service.
Ogólny przepływ pracy
Ogólny przepływ pracy do używania wektorowej bazy danych jest następujący:
- Osadzanie danych: konwertowanie danych na format wektorowy przy użyciu modelu osadzania. Można na przykład osadzić dane tekstowe przy użyciu modelu OpenAI.
- Wektory magazynowe: przechowuj osadzone wektory w bazie danych wektorów. Osadzone dane można wysłać do usługi Eventhouse, aby przechowywać wektory i zarządzać nimi.
- Zapytanie osadzania: przekonwertuj dane zapytania na format wektorowy przy użyciu tego samego modelu osadzania używanego do osadzania przechowywanych danych.
- Wektory zapytań: użyj wyszukiwania podobieństwa wektorów, aby znaleźć wpisy w bazie danych podobne do zapytania.
Eventhouse jako wektorowa baza danych
Podstawowym elementem wyszukiwania podobieństwa wektorów jest możliwość przechowywania, indeksowania i danych wektorów zapytań. Eventhouses stanowią rozwiązanie do obsługi i analizowania dużych ilości danych, szczególnie w scenariuszach wymagających analizy i eksploracji w czasie rzeczywistym, dzięki czemu jest to doskonały wybór do przechowywania i wyszukiwania wektorów.
Następujące składniki umożliwiają korzystanie z bazy danych wektorów eventhouse:
- Dynamiczny typ danych, który może przechowywać dane bez struktury, takie jak tablice i torby właściwości. W związku z tym typ danych jest zalecany do przechowywania wartości wektorów. Możesz dodatkowo rozszerzyć wartość wektora, przechowując metadane powiązane z oryginalnym obiektem jako oddzielne kolumny w tabeli.
- Typ
Vector16
kodowania przeznaczony do przechowywania wektorów liczb zmiennoprzecinkowych w 16-bitowej precyzji, która używaBfloat16
wartości zamiast domyślnych 64 bitów. To kodowanie jest zalecane do przechowywania osadzania wektorów uczenia maszynowego, ponieważ zmniejsza wymagania dotyczące magazynu przez współczynnik czterech i przyspiesza funkcje przetwarzania wektorów, takie jak series_dot_product() i series_cosine_similarity() według wielkości. - Funkcja series_cosine_similarity, która może wykonywać wyszukiwania podobieństwa wektorów na podstawie wektorów przechowywanych w usłudze Eventhouse.
Optymalizowanie pod kątem skalowania
Aby uzyskać więcej informacji na temat optymalizacji wyszukiwania podobieństwa wektorów, przeczytaj blog.
Aby zmaksymalizować wydajność i wynikowe czasy wyszukiwania, wykonaj następujące kroki:
- Ustaw kodowanie kolumny osadzania na Vector16, kodowanie 16-bitowe współczynników wektorów (zamiast domyślnego 64-bitowego).
- Zapisz tabelę wektorów osadzania na wszystkich węzłach klastra z co najmniej jednym fragmentem na procesor, co jest wykonywane w następujących krokach:
- Ogranicz liczbę wektorów osadzania na fragmenty, zmieniając element ShardEngineMaxRowCount zasad fragmentowania. Zasady fragmentowania równoważą dane na wszystkich węzłach z wieloma zakresami na węzeł, dzięki czemu wyszukiwanie może używać wszystkich dostępnych procesorów.
- Zmień element RowCountUpperBoundForMerge zasad scalania. Zasady scalania są potrzebne do pomijania scalania zakresów po pozyskiwaniu.
Przykładowe kroki optymalizacji
W poniższym przykładzie zdefiniowano statyczną tabelę wektorów do przechowywania wektorów 1M. Zasady osadzania są zdefiniowane jako Vector16, a zasady fragmentowania i scalania są ustawione w celu zoptymalizowania tabeli pod kątem wyszukiwania podobieństwa wektorów. W tym celu załóżmy, że klaster ma 20 węzłów, z których każdy ma 16 procesorów. Fragmenty tabeli powinny zawierać najwyżej 10000000/(20*16)=3125 wierszy.
Następujące polecenia języka KQL są uruchamiane pojedynczo, aby utworzyć pustą tabelę i ustawić wymagane zasady i kodowanie:
.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
Pozyskiwanie danych do tabeli utworzonej i zdefiniowanej w poprzednim kroku.