Jak działa wyszukiwanie semantyczne z FAISS, czyli szukanie sensu zamiast słów
Przejdź do treści i przykładów
Źródło: Link
Źródło: Link
Mind Architect to 180-dniowy program Jana Gajosa: decyzje, nawyki i granice przeniesione do codziennych reakcji. 180 lekcji w 6 modulach, Manfred AI Coach i powtorki rozlozone w czasie.
Ile razy wpisałeś w wyszukiwarkę firmowej dokumentacji zupełnie inne słowa niż w tekście i dostałeś zero wyników, mimo że odpowiedź tam była? Klasyczna wyszukiwarka szuka dopasowań literowych. Jeśli w dokumencie jest "błąd połączenia", a Ty wpiszesz "nie mogę się zalogować", system rozłoży ręce. Wyszukiwanie semantyczne robi coś zupełnie innego, ono szuka znaczenia, nie liter. A FAISS to narzędzie, które sprawia, że taka wyszukiwarka nie musi czekać godzinę na odpowiedź.
Dobra, powiedzmy to wprost: to nie jest magia. To matematyka, którą da się wytłumaczyć bez jednej linijki kodu. I właśnie to zrobimy.
Tradycyjne wyszukiwarki (te oparte na dopasowaniu tekstu) świetnie radzą sobie, gdy zapytanie i dokument używają tego samego słownictwa. Problem zaczyna się tam, gdzie ludzie piszą to samo na sto różnych sposobów. Klient pyta "jak anulować subskrypcję", a w bazie wiedzy jest artykuł zatytułowany "rezygnacja z planu płatnego". Dla człowieka to oczywiste synonimy. Dla wyszukiwarki opartej na słowach kluczowych to dwa różne światy.
Jeden z materiałów źródłowych, na których opieramy ten temat, opisuje konkretny przykład: bazę zgłoszeń (issues) i komentarzy z repozytorium biblioteki Datasets. Zadanie było proste do zdefiniowania, trudne do rozwiązania klasycznymi metodami: zbudować silnik, który pomoże znaleźć odpowiedź na pytanie użytkownika, nawet jeśli sformułował je zupełnie inaczej niż osoba, która wcześniej rozwiązała ten sam problem.

Modele językowe oparte na transformerach (jeśli chcesz zrozumieć tę architekturę dokładniej, mamy osobny przewodnik po transformerach) reprezentują każdy fragment tekstu jako wektor liczb, czyli embedding. To nie jest ciekawostka techniczna bez znaczenia dla Ciebie. To sedno sprawy. Model "czyta" zdanie i zamiast zapamiętywać litery, tworzy zestaw liczb opisujący jego znaczenie w wielowymiarowej przestrzeni.
Tu zaczyna się coś, co wygląda na sztuczkę, a jest solidną matematyką: pojedyncze embeddingi tokenów można "spuling" (uśrednić, połączyć) w jeden wektor reprezentujący całe zdanie, cały akapit, a czasem cały dokument. Dwa zdania o podobnym znaczeniu, nawet napisane zupełnie innymi słowami, dostają wektory, które leżą blisko siebie w tej przestrzeni. Dwa zdania o różnych tematach lądują daleko od siebie.
To właśnie ten mechanizm stoi za popularnym dziś podejściem RAG (Retrieval-Augmented Generation), o którym pisaliśmy szerzej w tekście RAG wyjaśniony prosto. Wyszukiwanie semantyczne z embeddingami to fundament, na którym RAG buduje swoją zdolność "czytania" Twoich dokumentów, zanim wygeneruje odpowiedź.
Tu pojawia się pytanie, które zadaje sobie niejedna osoba zaczynająca przygodę z tym tematem: skoro mam już wektory, dlaczego nie mogę po prostu porównać ich "na piechotę"? Odpowiedź brzmi: możesz, jeśli masz sto dokumentów. Przy stu tysiącach albo milionie robi się to zbyt wolne, żeby ktokolwiek czekał na wynik.
FAISS (Facebook AI Similarity Search) to biblioteka, która specjalizuje się właśnie w tym problemie: jak szybko znaleźć najbliższe sąsiedztwo wektora w ogromnym zbiorze innych wektorów. Zamiast porównywać każdy z każdym, buduje strukturę indeksującą, która pozwala pominąć oczywiste "nietrafienia" i skupić się tylko na kandydatach, którzy mają szansę być podobni. Wyszukiwanie, które przy tradycyjnym podejściu trwałoby minuty, dzieje się w ułamku sekundy.
To trochę jak szukanie znajomego na dworcu: zamiast sprawdzać twarz każdej osoby po kolei, od razu idziesz w stronę tłumu ludzi w podobnym wieku i ubranych podobnie do tego, kogo szukasz. FAISS robi to samo, tylko matematycznie, z milionami "twarzy" naraz.

Wróćmy do przykładu z bazą zgłoszeń biblioteki Datasets. Zanim ktokolwiek zaczął liczyć embeddingi, trzeba było posprzątać dane. Repozytoria na GitHubie mieszają zgłoszenia błędów (issues) z propozycjami zmian w kodzie (pull requests), a te drugie rzadko odpowiadają na pytania użytkowników, więc trafiają do kosza jako szum. Podobnie odrzucane są zgłoszenia bez żadnego komentarza, bo skoro nikt na nie nie odpowiedział, nie mogą stanowić źródła odpowiedzi.
Z całej reszty kolumn (a jest ich sporo) do budowy wyszukiwarki liczą się właściwie trzy: tytuł zgłoszenia, treść (body) i komentarze, plus link URL, który pozwala wrócić do źródła. Łatwo to przeoczyć: jedno zgłoszenie może mieć kilka komentarzy, więc dane trzeba "rozbić" tak, żeby każdy komentarz stał się osobnym wpisem z pełnym kontekstem tytułu i treści zgłoszenia. Dzięki temu wyszukiwarka nie zwraca tylko "jakiegoś fragmentu", tylko konkretną, kompletną odpowiedź razem z kontekstem, w jakim padła.
To pokazuje coś, co często umyka w dyskusjach o AI: zanim jakikolwiek model policzy embedding, ktoś musi zdecydować, co w ogóle warto zamienić na wektor. Dane śmieciowe na wejściu dają śmieciowe wyniki wyszukiwania na wyjściu, niezależnie od tego, jak dobry jest sam model.
Jedna rzecz z polskiej perspektywy: wdrożenie takiej wyszukiwarki nie wymaga dziś stawiania własnej serwerowni. Koszt przechowywania i przeszukiwania wektorów w chmurze bywa niższy, niż się wydaje, ale trzeba pilnować rachunków (o tym, jak nie przepłacić za infrastrukturę AI, pisaliśmy w poradniku o kosztach cloud AI).
Embeddingi i RAG to nie teoria dla programistów. To fundament tego, jak dziś działają narzędzia AI wykorzystywane w codziennej pracy z dokumentami. Na darmowym webinarze pokazujemy, jak wykorzystać te mechanizmy praktycznie, bez pisania kodu. Zapisz się na darmowy webinar →
Zwykła wyszukiwarka dopasowuje litery i słowa, więc zapytanie musi brzmieć podobnie do treści dokumentu. Wyszukiwanie semantyczne porównuje znaczenie zapisane w postaci wektorów (embeddingów), dzięki czemu znajdzie odpowiedź nawet, gdy użyłeś zupełnie innych słów niż autor dokumentu.
Nie, FAISS nie generuje żadnego tekstu. To biblioteka do przechowywania i szybkiego przeszukiwania wektorów, czyli narzędzie do znajdowania najbardziej pasujących dokumentów. Samo tworzenie wektorów (embeddingów) wykonuje osobny model językowy, a odpowiedź w naturalnym języku generuje dopiero model typu LLM, jeśli w ogóle jest w tym systemie potrzebny.
Sam mechanizm da się zrozumieć bez znajomości kodu, tak jak w tym artykule. Praktyczne wdrożenie wymaga jednak podstaw pracy z danymi i modelami, dlatego warto potraktować to jako kolejny krok w nauce, a nie punkt wejścia.
Rzadko całkowicie je zastępuje, częściej je uzupełnia. Wiele systemów łączy oba podejścia (tzw. hybrid search), bo wyszukiwanie po słowach dobrze radzi sobie z konkretnymi nazwami czy numerami, a semantyczne z pytaniami opisowymi.
Wyszukiwanie semantyczne i embeddingi to jedne z tych tematów, które brzmią skomplikowanie, dopóki ktoś nie pokaże Ci ich krok po kroku na konkretnym przykładzie. Na darmowym webinarze na żywo pokazuję krok po kroku, jak oszczędzać 10 godzin tygodniowo dzięki AI, bez wiedzy technicznej.
Zapisz się na darmowy webinar →Wolisz uczyć się we własnym tempie? Sprawdź kurs AI Evolution
Wyszukiwanie semantyczne z FAISS sprowadza się do jednej prostej idei: zamień tekst na liczby, które oddają jego sens, a potem znajdź te liczby, które leżą najbliżej siebie. Cała reszta to inżynieria, która sprawia, że dzieje się to szybko przy milionach dokumentów. Następnym razem, gdy jakaś wyszukiwarka w Twojej firmie nie znajdzie oczywistej odpowiedzi bo wpisałeś inne słowa niż w dokumencie, zapytaj, czy ten system w ogóle korzysta z embeddingów. To pytanie samo w sobie potrafi otworzyć ciekawą rozmowę z działem IT.
Na podstawie: Semantic search with FAISS - materiał kursowy