WikiHumSearch

Opis działania wyszukiwarki semantycznej

Wyszukiwanie semantyczne, wspomagane przez sztuczną inteligencję, czasami nazywane wyszukiwaniem wektorowym, korzysta z wyspecjalizowanych dużych modeli językowych (LLM) w celu pobierania wyników wyszukiwania na podstawie znaczenia i kontekstu zapytania. Dla każdego rekordu (elementu, fragmentu tekstu - zależnie od rodzaju danych, z którymi mamy do czynienia: bazą danych, bazą wiedzy, korpusem tekstów) obliczana jest reprezentacja wektorowa (zbiór zwykle kilkuset lub więcej liczb) za pomocą specjalnej wersji modelu LLM zoptymalizowanej do tego celu (zob. popularne modele open source do osadzeń (embeddings) w serwisie Ollama oraz opis osadzeń wektorowych w dokumentacji OpenAI).

Taki zbiór liczb charakteryzuje daną treść pod względem znaczenia – fragmenty tekstu opowiadające o kopalniach na Śląsku i o miejscach wydobywania rudy metali w Czechach będą miały bardziej zbliżone wartości niż wobec fragmentu tekstu opowiadającym o sałatce z ziemniaków. Wyszukiwanie semantyczne posługuje się znaczeniem tekstów, a nie dokładnym zapisem słów.

W testowym mechanizmie wyszukiwania semantycznego wykorzystano silnik wyszukiwania Meilisearch, , który obsługuje tradycyjne wyszukiwanie pełnotekstowe, wyszukiwanie semantyczne oraz hybrydę obu rozwiązań. Jako model do osadzeń użyto wielojęzycznego modelu OpenAI: text-embedding-3-small.

Przykład danych z WikiHum

Sposób przygotowania danych z WikiHum dla silnika wyszukiwania jest zbliżony do tego, co zrobiono w projekcie Wikidata:Embedding Project. Przykładowy tekst wyeksportowany z hasła dotyczącego osoby:

label: Marian Mieczysław Szulc
time: 2025-11-07 13:54
link: https://wikihum.lab.dariah.pl/wiki/Item:Q174825
alias: Schulz, Marian
opis: (1913-1979) fotograf, historyk fotografii, współorganizator
Związku Polskich Artystów Fotografików, kierował pierwszym Referatem
Fotografii przy Urzędzie Wojewódzkim Poznańskim
atrybuty:
  - data urodzenia: 1913-03-21
  - data urodzenia: 1913
  - data śmierci: 1979-09-12
  - data śmierci: 1979
  - jest to: człowiek

(pole 'time' zawiera datę pobrania danych z WikiHum, jest przydatne do późniejszych uaktualnień danych).

Przykładowy tekst wyeksportowany z hasła (elementu) dotyczącego miejscowości:

label: Zielęcin Wielki
time: 2025-11-07 11:50
link: https://wikihum.lab.dariah.pl/wiki/Item:Q138072
alias: Zieloncino
opis: część wsi: Zielęcin (gmina: Warta, powiat: sieradzki, wojewódzwo: łódzkie)
atrybuty:
  - opisany jako: Zielęcin Wielki (końcówka dopełniacza: -na -kiego,
    status nazwy: nazwa nieoficjalna, data: 2022)
  - typ miejscowości: część wsi (data: 2022)
  - współrzędne geograficzne: 51.7360911,18.52880771 (data: 2022)
  - znajduje się w świeckiej jednostce administracyjnej: gmina Warta (data: 2022)
  - jest częścią: Zielęcin (data: 2022)
  - jest to: jednostka osadnicza (data: 2022)

Szczególnie w przypadku osób, nie są to obecnie dane zbyt obszerne, główne znaczenie ma zwykle jednozdaniowy opis, w przypadku miejscowości jeszcze parę właściwości dotyczących typu i własności mogą mieć wpływ na wyszukiwanie semantyczne. W miarę powiększania się zasobów WikiHum dane podlegające wyszukiwaniu semantycznemu będą oczywiście uzupełniane.

Wyeksportowane dane, w formie przetworzonej do struktur JSON są importowane do silnika Meilisearch, gdzie następuje też obliczenie reprezentacji wektorowej tekstu. Dane WikiHum w fomacie TXT zajmują ok 130 MB, zaś po imporcie ok 3 GB.

Aby udostępnić wyszukiwanie semnatyczne użytkownikom przygotowano prostą aplikację (Python + Flask) z możliwością zlecenia wyszukiwania i obejrzenia listy wyników. Wyszukiwanie jest w rzeczywistości hybrydowe (semantyczne i pełnotekstowe jednocześnie), z tym że komponent semantyczny odpowiada za 90% wyniku (parametr semanticRatio silnika wyszukiwania jest ustawiony na wartość 0.9).

Przykładowe dwuwyrazowe zapytanie: człowiek militaria, zwraca listę osób w jakiś sposób powiązanych z wojskiem, wojnami, armią itp. O ile słowo człowiek pojawia się w danych elementów wikibase jako wartość właściwości 'instance of', to słowo militaria tam zwykle nie występuje, mechanizm odnalazł elementy zawierające słowa zbliżone znaczeniowo i na tej podstawie przygotował wyniki.

Inne przykładowe zapytania:

  • miejscowości XVI wiek własność monarsza
  • matematycy
  • architekci
  • osady młyńskie
  • uczestnicy powstania listopadowego

Na przykładzie ostatniego zapytania (uczestnicy powstania listopadowego) można zauwazyć jak działa (lub zawodzi) wyszukiwanie semantyczne. Nie jest to precyzyjne filtrowanie jak w tabeli bazy danych, mechanizm wyszukuje elementy które wydają się mieć zbliżone znaczenie do słów w zapytaniu. W tym przypadku mamy słowo związane z powstaniem (które chyba wpływa najmocniej na wynik), słowo związane z uczestniczeniem i przymiotnik dotyczący nazwy powstania. W wynikach otrzymujemy osoby (poprawnie), które w czymś uczestniczyły (zwykle w powstaniach), pierwsze dwa wyniki dotyczą uczestników powstania listopdowego, w pierwszych 20 wynikach jest takich osób 8, poza tym mamy uczestnków powstania styczniowego, kościuszkowskiego. Wyniki wyszukiwania semantycznego będą więc zawsze nieco 'rozmyte'. Dla pierwszego przykładu (własność monarsza) 17 z 20 wyników pasuje do intencji zapytania, 2 wyniki dotyczą miejscowości szlacheckich a 1 samego pojęcia 'własność monarsza'. Pytanie to jest dość precyzyjnym filtrem i zapewne lepiej w takiej sytuacji sprawdziło by się zapytanie SPARQL.

W przypadku WikiHum na efekty działania wpływa też niewielka ilość tekstu w bazie wiedzy.

Zwracanych wyników nie należy też rozumieć jako 'pasujących' - system zwraca wszystkie elementy powyżej pewnego progu trafności, w kolejności od najbardziej trafnych do najmniej trafnych. Może się zdarzyć, że pierwszych 30 wyników ma faktycznie związek z zapytaniem a następne już nie, natomiast są wyświetlane wszystkie tak by użytkownik mógł zdecydować o ich przydatności.

Mechanizm wyszukiwania może oznaczać słowa, fragmenty słów, które związane są z zapytaniem, odpowiada za to komponent pełnotekstowy wyszukiwarki więc tak zazanaczone są słowa występujące wprost w treści zapytania. Po kliknięciu w konkretny wynik (etykieta elementu jest linkiem) wyświetlane jest okienko ze szczegółami gdzie można zobaczyć pełniejsze dane elementu, jest tam też link do elementu w WikiHum.

Aplikacja wyświetla domyślnie 20 pierwszych wyników (posortowanych wg rankingu trafności/podobieństwa), u dołu ekranu znajduje się przycisk którym można załadować kolejną część wyników (o ile takie istnieją).