Strona główna / Rozdział 4 · Kontekst i wiedza
    Ostatnia zmiana · 8 min czytania

    Użyj z AI

    Embeddingi i wyszukiwanie wektorowe

    Model embeddingowy zamienia cały fragment tekstu w jeden wektor tak, żeby teksty o podobnym znaczeniu dostawały bliskie wektory. Na tym stoi wyszukiwanie wektorowe w RAG: pytanie też staje się wektorem, a baza zwraca fragmenty o najbliższych wektorach, nawet bez wspólnych słów.

    Po ludzkuMapa, na której każdy fragment tekstu ma swoją pinezkę, a teksty o podobnej treści leżą blisko siebie. Szukanie to wbicie pinezki pytania i zebranie najbliższych sąsiadów. Numer umowy prawie nie przesuwa pinezki, więc umowy 48213 i 48231 leżą niemal w tym samym miejscu.

    Wybierz pytanie albo wpisz własne i zobacz, który fragment każda metoda stawia na górze

    Cała baza wiedzy: 10 fragmentów

      Symulacja, nie prawdziwy model: modelu embeddingowego nie da się tu uruchomić. Każdy fragment ma ręcznie przypisane wagi ośmiu nazwanych pojęć, a słowa pytania biorą wagi z małego słownika, więc słowa spoza niego nic nie zmieniają. Prawdziwy wektor ma setki wymiarów bez nazw. Cosinus, BM25 (uproszczony stemmer obcina typowe końcówki) i RRF są liczone na żywo. Firmy i numery umów są zmyślone.

      Jeden wektor na cały fragment

      Szukanie w milionach wektorów

      Słabe punkty, wyszukiwanie hybrydowe i reranking

      Decyzje przy budowie indeksu

      Sprawdź się

      Jak działa wyszukiwanie wektorowe i czemu samo nie wystarcza?

      Model embeddingowy, wytrenowany tak, by teksty o podobnym znaczeniu leżały blisko siebie, zamienia cały fragment w jeden wektor. Wektor pytania liczy się tym samym modelem, a wyszukiwanie zwraca najbliższe wektory po cosinusie. Przy milionach fragmentów indeks przybliżony, np. HNSW, odpowiada w milisekundach kosztem odrobiny recall, a zajmowaną przez niego pamięć zmniejsza kwantyzacja. Wektory łapią parafrazy, ale gubią identyfikatory, liczby, rzadkie nazwy i negację, a do tego zawsze coś zwracają. Dlatego łącz je z BM25 przez RRF, czołówkę porządkuj cross-encoderem, a recall@k mierz osobno od jakości odpowiedzi.

      In English

      An embedding model turns a whole passage into one vector and is trained so that texts with similar meaning land close together. The query is embedded with the same model, and search returns the nearest vectors by cosine similarity. At millions of passages an approximate index such as HNSW trades a little recall for milliseconds and costs memory, which quantisation reduces. Vectors catch paraphrases but miss identifiers, numbers, rare names and negation, and they always return something. So fuse them with BM25 via RRF, rerank the top candidates with a cross-encoder, and measure recall@k separately from answer quality.

      Pytania pogłębiające (5)
      Zmieniasz model embeddingowy. Co z indeksem?
      Przeliczasz cały korpus, bo wektory z różnych modeli są nieporównywalne, nawet przy tej samej liczbie wymiarów. Nowy indeks budujesz obok starego, porównujesz recall@k na tym samym zestawie pytań i dopiero wtedy przełączasz ruch. Dlatego przy wektorach trzymasz tekst źródłowy i wersję modelu.
      HNSW czy IVF?
      HNSW daje wysoki recall przy niskim opóźnieniu, o ile wektory i graf mieszczą się w RAM. IVF dzieli wektory na klastry i przeszukuje kilka z nich. Z kompresją PQ mieści dużo więcej wektorów w tej samej pamięci, kosztem recall, który odzyskujesz większym nprobe albo przeliczeniem czołówki na pełnych wektorach.
      Jak odrzucić fragmenty, gdy w bazie nie ma odpowiedzi?
      Próg cosinusa dobierasz na własnym zestawie, bo skala zależy od modelu. Do zestawu włączasz też pytania bez odpowiedzi w bazie. Pewniejszym sygnałem jest wynik rerankera. Model w prompcie dostaje wprost zgodę na „nie ma tego w źródłach”.
      Jak łączysz wyszukiwanie wektorowe z filtrami, np. uprawnieniami albo datą?
      Filtr nałożony po wyszukiwaniu wycina wyniki z top-k, więc przy wąskim filtrze zostaje ich za mało albo zero. Lepiej filtrować w trakcie przeszukiwania indeksu, co obsługuje wiele baz wektorowych, albo trzymać osobne indeksy, np. per klient. Uprawnienia egzekwujesz przy wyszukiwaniu, nie w prompcie.
      Recall@10 jest wysoki, a odpowiedzi i tak słabe. Gdzie szukasz?
      Najpierw, czy trafny fragment nie ląduje na 8.–10. miejscu, gdy do promptu idą tylko trzy pierwsze: wtedy pomaga reranker. Potem, czy fragment po wycięciu z dokumentu w ogóle zawiera odpowiedź (chunking). Na końcu, czy model jej nie przekręca, co mierzy już ewaluacja generowania.

      Źródła

      Zgłoś błąd · Zaproponuj poprawkę