Typefully

Wyszukiwanie hybrydowe w praktyce

Avatar

Share

 • 

11 hours ago

 • 

View on X

Ostatnio zbudowałem wyszukiwarkę linków z archiwum mojego newslettera unknowNews. Postanowiłem podzielić się tym, jak ona działa od strony backendu - może przyda Ci się to przydać w Twoich projektach 🧵 ↓
Dwie popularne ostatnio techniki używane w wyszukiwarkach to Full Text Search (FTS) oraz wyszukiwanie na bazach wektorowych. Ta pierwsza metoda świetnie sprawdza się, gdy wiesz, czego szukasz i umiesz ubrać to w słowa np. "LinkedIn automatyzacja".
Wykorzystanie baz wektorowych opiera się na embeddingach, czyli wektorach stworzonych przez AI, które opisują dane znajdujące się w bazie wektorowej. Może się okazać, że słowo 'pies' to np. [0,012,0,02,03], a słowo 'kot' to np. [0,012,0,021,035] - czyli są +/- podobne.
Brzmi to skomplikowanie, ale jak to bywa z najnowszymi technologiami, niekoniecznie musisz wiedzieć, jak to działa od strony np. matematycznej, aby z tego korzystać. Ważne, aby wiedzieć, że bazy wektorowe zawsze zwracają dane i to jest ich minus (nawet jak niczego nie znajdą).
Wyszukiwanie z użyciem embeddingów ma jednak ten ogromny plus, że umożliwia szukanie na podstawie opisu obiektu, a nie tylko po keywordsach. Oznacza to, że w pełni poprawnym zapytaniem jest "jakiś soft do usuwania osób ze zdjęcia".
Jakiś rok temu zbudowałem wyszukiwarkę na samych embeddingach. Działała spoko, gdy się opisywało szukaną rzecz (najlepiej 4-5 słów) i zwracała zupełnie nietrafione wyniki, gdy podawało się konkretne nazwy usług, nazwy własne, czy proste słowa kluczowe.
Istnieje podejście zwane wyszukiwaniem hybrydowym, które łączy kilka innych mechanizmów w jedną całość. Zdecydowałem się na połączenie FTS z embeddingami, co mocno zwiększyło skuteczność wyszukiwania.
Postawiłem lokalną bazę danych Qdrant. Nakarmiłem ją embeddingami złożonymi z wpisów z mojego newslettera (tytuł + opis), a następnie te same tytuły i opisy wrzuciłem do bazy MariaDB, aby korzystać z FTS.
Po wpisaniu przez użytkownika zapytania jest ono wektoryzowane, a następnie używane do przeszukania wektorów z bazy. Wyciąganych jest top200 najbardziej pasujących. To samo zapytanie wyciąga top200 z MariaDB. Tutaj pojawia się pewien problem - różny zakres zwracanych danych.
Baza wektorowa zwraca prostą odpowiedź w skali 0-1, a FTS równie dobrze może zwrócić 0.02, 3.12, a nawet 15+. Trzeba te dane normalizować do wspólnego zakresu. Stosuję też różne wagi odpowiedzi w zależności od długości zapytania użytkownika.
Jeśli wpiszesz 1-2 słowa, to proporcje FTS vs wektory to 60%/40%. Jeśli jednak wpiszesz 3+ słowa, to proporcje się odwracają. Oznacza to, że długie zapytanie uznawane jest za bardziej opisowe i wtedy punktuję mocniej dane z wektorów.
Jeśli któreś z wyników z dwóch źródeł się pokrywają, to link dostaje 'boosta'. Jeśli FTS nic nie zwróci, to 100% danych przyjdzie z Qdrant. Embeddingi tworzę w 'text-embedding-3-small' od OpenAI. Jest to bardzo tanie i działa przyzwoicie.
Avatar

Jakub Mrugalski 🔥

@uwteam

🤖 Piszę o technologii, AI, automatyzacji, cybersecurity i biznesie. 🛠 Dzielę się użytecznymi narzędziami i case-study 🤔 #DigitalEUAmbassador 🛑 Nie czytam DM