Jak działa baza danych wektorowych: embeddingi, wyszukiwanie wektorowe i pamięć ludzka
Model mentalny oparty na pamięci do wyszukiwania wektorowego: jak działają embeddingi, podobieństwo, indeksy najbliższych sąsiadów oraz filtry metadanych w bazie danych wektorowych do RAG.
Źródła: Your Brain Is a Vector Database. It Just Doesn’t Call Itself That.
Mogą minąć lata bez żadnego wspomnienia o nauczycielu z dzieciństwa. Nagle zapach kurzu od kredy, woń stołówki szkolnej lub piosenka grająca w autobusie w drodze do domu natychmiast i żywo przywołują tę osobę. Nic nie było szukane pod konkretnym nazwiskiem – pojawiło się coś podobnego, a wspomnienie samo się ujawniło.
To właśnie zachowanie stara się odtworzyć semantyczne wyszukiwanie, generowanie wzbogacone o dane z zewnętrznych źródeł (RAG) oraz systemy rekomendacji oparte na AI, choć nie doskonale, ale z powagą; elementem umożliwiającym to jest baza danych wektorowych. Mechanizm przywoływania informacji poprzez powiązania stanowi dobry model mentalny do wyjaśnienia, czym są wektory, jak mierzy się podobieństwo, jak skaluje się wyszukiwanie najbliższego sąsiada oraz jak poszczególne elementy tworzą proces pozyskiwania informacji. Wskazuje on również, gdzie analogia przestaje być trafna, ponieważ to właśnie w tych miejscach systemy produkcyjne najczęściej popełniają błędy.
Zapisywanie według znaczenia, a nie nazwy
Pamięć ludzka nie posiada indeksu alfabetycznego. Nie istnieje żadna mentalna folder o nazwie „Jedzenie”, zawierająca podfolder „Włoskie”, który z kolei zawierałby plik o nazwie „Pizza”. To ścisła hierarchia jest sposobem, w jaki tradycyjne bazy danych organizują dane: każda rekord znajduje się pod znanym adresem i można ją odnaleźć za pomocą dokładnego klucza.
Pamięć jest natomiast organizowana według znaczenia i powiązań: na podstawie kontekstu, uczuć oraz sposobu, w jaki jedna rzecz jest powiązana z innymi. Idea pizzy łączy się z piątkowymi wieczorami, wycieczką do Neapolu, jedzeniem kojącym, rozciągającymi się pasami sera, zapachem oregano, a może także z kolegą z akademika, który zepsuł każdą partię domowego ciasta. Myślenie o pizzy nie otwiera pojedynczego pliku – aktywuje całą grupę powiązanych wspomnień, przy czym najsilniej powiązane pojawiają się najpierw.
Baza danych wektorowych wykorzystuje dokładnie tę zasadę. Elementy są przechowywane według tego, co oznaczają, a są wyodrębniane na podstawie tego, jak bardzo są podobne do zapytania, a nie na podstawie tego, czy klucz pasuje dokładnie.
Co koduje wektor embeddingu
Aby zrozumieć bazę danych, najpierw trzeba zrozumieć, co w niej przechowywane jest. Wektor w tym kontekście to po prostu uporządkowana lista liczb reprezentująca znaczenie.
Maszyna nie ma żywego pojęcia o tym, czym jest pizza. To, czego może nauczyć się model embeddingu poprzez przetwarzanie ogromnych ilości tekstu, to kontekst, w którym występuje dane słowo. „Pizza” pojawia się w pobliżu słów takich jak „ser”, „włoski”, „ciasto”, „piec” i „kawałek”. Ten kontekst różni się od kontekstu słowa „sushi”, ale mocno pokrywa się z kontekstem słów „chleb płaski” lub „calzone”.
Model sprowadza te wzorce do listy liczb o stałej długości, zwykle składającej się z kilkuset do kilku tysięcy wartości; typowymi rozmiarami są 384 i 1 536. Żadna pojedyncza liczba nie ma czytelnego oznaczenia, jednak razem umożliwiają one dokładne umieszczenie elementu w przestrzeni wysokowymiarowej. Kluczową właściwością jest ta: dane o podobnym znaczeniu uzyskują wektory znajdujące się blisko siebie. „Pizza” znajduje się w pobliżu „chleba płaskiego”, a bardzo daleko od „kwartalnego raportu finansowego”.
Innymi słowy, znaczenie przekształca się w odległość. Wszystko inne wynika z tego jednego kroku.
Podobieństwo jako spektrum, a nie dopasowanie
Klasyczne zapytanie ma charakter binarny: wiersz albo spełnia warunek, albo go nie spełnia. Jeśli zastosujesz filtr na „psa”, otrzymasz wiersze zawierające dokładnie słowo „psa”, natomiast żadne wyniki dla „szczeniaka”, „golden retrievera” czy „wiernego czworonogowego towarzysza”.
Podobieństwo semantyczne zastępuje tę odpowiedź typu tak/nie wynikiem, który pokazuje, jak bliskie są dwa znaczenia. Na przykład na skali od 0 do 1 „szczeniak” mógłby uzyskać ocenę 0,94 w porównaniu z „psem”, „wilkiem” około 0,71, a „fakturą” około 0,08. Metryką jest zazwyczaj podobieństwo kosinowe lub powiązana z nim odległość, tak jak iloczyn skalarny lub odległość euklidesowa, a właściwy wybór zależy od sposobu szkolenia modelu embeddingowego.
To odzwierciedla efekt pyłu kredowego: nie jest to dokładne dopasowanie, lecz sygnał aktywujący pobliskie wspomnienia, które z kolei aktywują te obok nich. W bazie danych wektorowych mechanizm jest liczbowy. Zapytanie jest przekształcane w wektor, a baza zwraca przechowywane elementy, których wektory znajdują się najbliżej niego. „Bliskość” oznacza podobieństwo znaczenia.
Dlatego też wyszukiwanie frazy „jak naprawić wolne zapytanie do bazy danych” może przywołać dokument zatytułowany „optymalizacja wydajności zapytań na dużą skalę”, mimo że obie frazy ledwo mają wspólne słowo. Ich wektory są blisko siebie, ponieważ wyrażają ten sam zamiar.
Uwaga dotycząca liczb
Wskaźniki podobieństwa są względne, a nie bezwzględne. Wartość 0,8 uzyskana przy użyciu jednego modelu embeddingu nie może być porównywana z wartością 0,8 uzyskaną przy użyciu innego modelu, a nawet w obrębie jednego modelu typowy zakres zależy od dziedziny. Traktuj wskaźniki jako sposób na rankowanie kandydatów, a jeśli stosujesz próg, dostosuj go na podstawie własnych danych, zamiast wybierać liczbę zaokrągloną.
Korekta: zwykły SQL oparty na słowach kluczowych nie może wyrazić podobieństwa semantycznego, ale to nie oznacza, że bazy danych SQL są wykluczone. Rozszerzenia takie jak pgvector, omówione poniżej, dodają kolumny wektorowe i operatorzy podobieństwa do Postgresa, dzięki czemu ta funkcjonalność może istnieć wewnątrz bazy danych relacyjnej.
Poszukiwanie najbliższego sąsiada w skali
W jaki sposób baza danych faktycznie znajduje najbliższe wektory? Podstawową operacją jest poszukiwanie najbliższego sąsiada, a jej przyspieszenie jest głównym powodem istnienia baz danych wektorowych.
Wyobraź sobie każdy przechowywany element jako gwiazdę w galaktyce, umieszczoną zgodnie z jej znaczeniem, przy czym powiązane elementy gromadzą się w tej samej strefie. Zapytanie dodaje nową gwiazdę do tej galaktyki i pyta, które pięć istniejących gwiazd jest najbliżej.
Prosty podejście mierzy odległość od zapytania do każdego przechowywanego wektora, sortuje wyniki i zwraca te najlepsze. W przypadku tysięcy wektorów jest to szybkie i w pełni wystarczające. Jednak przy milionach lub miliardach porównywanie ze wszystkimi elementami bardzo szybko staje się kosztowne.
Z tego powodu systemy produkcyjne opierają się na algorytmach przybliżonego najbliższego sąsiada (ANN). Zamiast sprawdzać każdą gwiazdę, wykorzystują indeks, który ogranicza poszukiwania do obiecujących obszarów, akceptując niewielką stratę dokładności w zamian za znaczny wzrost szybkości. Najczęściej używanym obecnie algorytmem jest HNSW, skrót od Hierarchical Navigable Small World. Aby korzystać z bazy danych wektorowej, nie musisz znać jej wewnętrznych mechanizmów, ale powinieneś wiedzieć, że to właśnie dzięki niemu wyszukiwanie wśród setek milionów wektorów może odbywać się w ułamku sekundy.
Słowo „prawdopodobny” zasługuje na uwagę. Indeks ANN może czasami pominąć prawdziwego najbliższego sąsiada, a szybkość, z jaką znajduje rzeczywiście najlepsze wyniki – zwana powrotem (recall) – zależy od parametrów indeksu, które kompromitują się pomiędzy pamięcią i opóźnieniem a dokładnością. Jeśli jakość wyszukiwania wydaje się niewytłumaczalnie nieregularna w dużych skali, warto sprawdzić ustawienia indeksu; nasz przewodnik dostosowywania indeksów HNSW do produkcji RAG szczegółowo omawia te ustawienia.
Wewnątrz bazy danych wektorowej
W swojej istocie baza danych wektorowej to system przechowywania zoptymalizowany pod jedno zadanie: przechowywanie wektorów oraz bardzo szybkie przeprowadzanie wyszukiwań najbliższych sąsiadów wśród nich.
Załóżmy bibliotekę, która ignoruje System Dziesiętny Deweya i układa książki według tego, jak się czują. Książki o smutku znajdują się obok książek o stratie, które z kolei są obok książek o samotności, potem izolacji, a następnie wspomnień z samotnych wypraw. Nikt nie ustalał tych kategorii ręcznie; taki układ powstał dlatego, że czytelnicy przyciągnięci jedną grupą książek zazwyczaj chcą też pozostałych.
Pinecone, Weaviate, Chroma i Qdrant to przykłady takiej biblioteki. Załadowujesz do nich embeddingi dokumentów, opisy produktów, obrazy przekształcone w wektory lub wzorce zachowań użytkowników, a one utrzymują indeks, dzięki czemu wyszukiwania pozostają szybkie w miarę rozrastania się kolekcji.
Każdy przechowywany rekord składa się zazwyczaj z trzech części:
- ID, który jednoznacznie identyfikuje daną pozycję.
- Wektora reprezentującego jej znaczenie.
- Opcjonalnych metadanych, takich jak tytuł, data, kategoria lub adres URL źródłowego, które mogą być użyte do filtrowania wyników.
Metadane są cenniejsze, niż się na pierwszy rzut oka wydaje. Realistyczna prośba wygląda tak: znaleźć pięć dokumentów najbardziej podobnych do zapytania, ale tylko te z ostatnich 30 dni i wyłącznie z bazy wiedzy zespołu inżynieryjnego. To połączenie wyszukiwania wektorowego z filtrem metadanych, od którego zależą większość systemów produkcyjnych. Ważne jest również to, w jaki sposób stosowany jest filtr: filtrowanie po wyszukiwaniu podobieństwa może przynieść mniej wyników, niż prosiłeś, więc sprawdź, czy twoja baza danych filtrowała dane już podczas samego wyszukiwania.
Całkowity proces pobierania danych w RAG
Niezależnie od tego, czy znajduje się on w systemie RAG, funkcji wyszukiwania semantycznego, czy w dowolnej aplikacji wykorzystującej przechowywaną wiedzę, proces pobierania danych przebiega według tych samych czterech kroków.
- Wbuduj treść. Każdy dokument, artykuł, opis produktu lub zapis, który ma być dostępny do wyszukiwania, przechodzi przez model wbudowywania, a uzyskany wektor jest przechowywany obok oryginalnej treści. Długie dokumenty zazwyczaj najpierw są dzielone na fragmenty, ponieważ jeden wektor dla całego podręcznika łączy ze sobą zbyt wiele idei.
- Wbuduj zapytanie za pomocą tego samego modelu. To nie jest opcjonalne. Różne modele wbudowywania tworzą wektory w niespowiązanych przestrzeniach, więc porównywanie zapytania z jednego modelu z dokumentami z innego daje bezsensowne odległości. Zmiana modelu oznacza ponowne wbudowanie całej kolekcji.
- Wyszukuj. Wektor zapytania trafia do bazy danych, wyszukiwanie najbliższego sąsiada znajduje najbliższe przechowywane wektory, a jako wyniki powracają najważniejsze rezultaty, zazwyczaj wraz z ocenami podobieństwa.
Z punktu widzenia użytkownika istotna odpowiedź pojawia się w ciągu chwili. W tle znaczenie tekstów zostało przekształcone w liczby, te liczby porównano z milionami przechowywanych elementów, zwrócono najbliższe dopasowania, a odpowiedź została utworzona na podstawie autentycznego treści.
Dlaczego wyszukiwanie wektorowe jest teraz wszędzie
Niedawno bazy danych wektorowych były narzędziem niszowym, używanym wyłącznie przy tworzeniu systemów wyszukiwania semantycznego lub specjalistycznych systemów rekomendacji. Obecnie stanowią standardową część wielu aplikacji AI. RAG wymaga miejsca do przechowywania i wyszukiwania embeddingów dokumentów. Agenci wyszukują informacje w bazach wiedzy na podstawie znaczenia. Systemy rekomendacji na dużą skalę opierają się na podobieństwie wektorowym. Wyszukiwanie multimodalne, takie jak znajdowanie obrazów na podstawie opisu tekstowego lub produktów na podstawie przesłanej fotografii, również funkcjonuje za pomocą wektorów.
Jeśli budujesz aplikacje oparte na dużych modelach językowych w środowisku produkcyjnym, istnieje duże prawdopodobieństwo, że już teraz polegasz na wyszukiwaniu wektorowym lub wkrótce na niego polegniesz. Pocieszające jest to, że podstawowa idea jest już znana: od zawsze pamięć wydobywa najbliższe powiązania z tym, co właśnie dotarło do naszych zmysłów. Baza danych wektorowych robi to samo z liczbami, w ułamku sekundy, dla milionów elementów.
Gdzie analogia z pamięcią zawodzi
Porównanie z mózgiem jest przydatne do intuicyjnego rozumienia, ale w praktyce istotne są pewne różnice:
- Pamięć dostosowuje się ciągle; model embedding jest nieruchomy. Jeśli słownictwo w danym obszarze się zmienia, wektory same się nie aktualizują.
- Pamięć bez trudu łączy kontekst; wektor rejestruje jedynie to, co do niego trafiło. Słabo podzielony lub zanieczyszczony tekst źródłowy generuje słabe „sąsiednie” wartości.
- Podobieństwo nie oznacza istotności. Dwa fragmenty mogą być podobne pod względem znaczenia, podczas gdy tylko jeden faktycznie odpowiada na pytanie, dlatego wiele systemów dodaje funkcję wyszukiwania słów kluczowych lub krok ponownego rankingu.
Praktyczne zastosowanie
Możesz eksperymentować bez konieczności budowania żadnej infrastruktury:
- ChromaDB działa lokalnie w środowisku Python bez konieczności tworzenia konta, klucza API czy procesu wdrażania, a jego instalacja i konfiguracja zajmują zaledwie kilka linijek kodu. Nadaje się do nauki oraz do małych projektów.
- Qdrant oferuje darmowy poziom usług w chmurze oraz przyjazny klient w Pythonie, co jest doskonałym rozwiązaniem, gdy chcesz mieć coś zbliżonego do środowiska produkcyjnego bez konieczności samodzielnego zarządzania serwerami. Sprawdź aktualne limity przed poleganiem na tych usługach.
- pgvector to rozszerzenie dla Postgresa. Jeśli już używasz Postgresa, to rozszerzenie umożliwia wyszukiwanie wektorowe bez konieczności tworzenia oddzielnego bazy danych, dzięki czemu cała architektura pozostaje prosta.
Niezależnie od wyboru, proces pracy jest identyczny: wybierasz model embeddingu, przekształcasz swój treść w wektory, przechowujesz je, przekształcasz przychodzące zapytania w wektory i przeprowadzasz wyszukiwanie. Koncepcje pozostają takie same; zmienia się jedynie biblioteka klienta.
Model mentalny w kilku zdaniach
- Embedding przekształca znaczenie w pozycję, dzięki czemu podobne elementy znajdują się blisko siebie.
- Wskaźniki podobieństwa sortują kandydatów; dostosuj próg samodzielnie na podstawie swoich danych.
- Indeksy ANN, takie jak HNSW, oferują niewielką dokładność w zamian za znaczny wzrost szybkości przy dużych skaliach.
- Filtrzy metadanych przekształcają surowe dane o podobieństwie w odpowiedzi, które uwzględniają zasady czasowe, źródłowe i dostępowe.
- Zapytania i dokumenty muszą korzystać z tego samego modelu embeddingów, a jakość wyszukiwania zależy równie mocno od sposobu dzielenia na fragmenty i jakości danych, jak i od samej bazy danych.
Literatura pokrewna
- Jak naprawdę działają bazy danych wektorowych: od embeddingów do wyszukiwania hybrydowego: Wyjaśnia, w jaki sposób embeddingi kodują znaczenie, jak skalują się wyszukiwanie i indeksowanie na podstawie podobieństwa, oraz kiedy wyszukiwanie hybrydowe i bazy danych wektorowych nadają się do systemów AI w przedsiębiorstwach.