Eskadra Bielika · Misja 2

Jak działa RAG — krok po kroku

1 / 6

Architektura systemu

Sześć komponentów. Użytkownik pyta, a system w tle: zamienia pytanie na wektor, wyszukuje pasujące dokumenty w BigQuery i prosi model Bielik o odpowiedź opartą na znalezionym kontekście.

Użytkownikprzeglądarka Web UIindex.html FastAPIorchestration EmbeddingGemmaCloud Run · 768D BigQueryVector Search Bielik LLMCloud Run · GPU

    Kliknij krok albo użyj ← → (przełącza też rozdziały, gdy dojdziesz do końca listy).

    Czym jest embedding

    Embedding to zamiana tekstu na listę liczb (wektor). Model EmbeddingGemma zwraca 768 liczb opisujących znaczenie zdania. Zdania o podobnym sensie dają wektory blisko siebie.

    wektor (próbka 32 z 768 wymiarów):

    Co warto zapamiętać

    • Wymiar 768 — tyle liczb opisuje jedno zdanie. To „współrzędne" w przestrzeni znaczeń.
    • Znaczenie, nie słowa — „pies" i „czworonóg" trafiają blisko siebie, mimo innych liter.
    • Porównywanie — podobieństwo liczymy miarą COSINE (kąt między wektorami).
    • Ten sam model osadza dokumenty (przy zasilaniu bazy) i pytania (przy wyszukiwaniu) — dlatego da się je porównać.

    Przestrzeń wektorowa — pobawmy się

    Każda kropka to reguła hotelowa umieszczona wg znaczenia. Kliknij dowolną — stanie się zapytaniem, a system podświetli najbliższe (najbardziej podobne). Dokładnie tak działa wyszukiwanie w RAG.

    3

    Uproszczenie dydaktyczne: realnie wektory mają 768 wymiarów i porównujemy je miarą COSINE. Tu rzutujemy je na 2 wymiary, by dało się je zobaczyć.

    Kliknij regułę po lewej

    Wyszukiwanie wektorowe w BigQuery

    To, co przed chwilą zrobiłeś klikając kropkę, BigQuery robi jednym zapytaniem SQL — tylko w 768 wymiarach i na tysiącach dokumentów.

    Zapytanie VECTOR_SEARCH

    SELECT base.content, distance FROM VECTOR_SEARCH( TABLE rag_dataset.hotel_rules, 'embedding', (SELECT [0.013, -0.21, ...] ), -- wektor pytania (768) top_k => 3, distance_type => 'COSINE' )

    Jak czytać wynik

    • top_k — ile najbliższych dokumentów zwrócić (suwak z poprzedniego rozdziału).
    • distance — odległość COSINE (0 = identyczne znaczenie, większe = dalej).
    • W aplikacji zamieniamy ją na trafność: score = 1 − distance i pokazujemy % przy kontekście.
    • Zwracane fragmenty stają się kontekstem dla modelu w następnym kroku.

    Jak agent (Bielik) używa kontekstu

    Sam model „zna świat", ale nie zna Twojego hotelu. RAG wstrzykuje znalezione fragmenty do promptu — model odpowiada na podstawie faktów, nie zgaduje.

    Prompt wysyłany do Bielika

    Odpowiedz TYLKO na podstawie kontekstu. KONTEKST: - Śniadanie 7:00–10:30 w restauracji na parterze - Doba hotelowa: 15:00–11:00 PYTANIE: O której godzinie jest śniadanie?

    Baseline vs RAG

    /ask_direct bez kontekstu: „Zwykle śniadania serwuje się 7:00–10:00…" — ogólnik, może być zmyślony.

    /ask z RAG: „Śniadanie jest serwowane 7:00–10:30 na parterze." — konkret z Twojej bazy.

    • RAG = wyszukiwanie + generowanie.
    • Odpowiedź jest weryfikowalna — pokazujemy użyte fragmenty i ich trafność.

    Skąd biorą się dane: zasilanie (ingest)

    Zanim cokolwiek wyszukasz, dokumenty muszą trafić do bazy jako wektory. To ten sam model embeddingowy co przy pytaniu — dlatego pytania i dokumenty „mówią tym samym językiem".

    Przepływ zasilania

    • 1. Reguła tekstowa, np. „Parking 50 zł/doba" (z CSV lub przyciskiem „Dodaj regułę").
    • 2. EmbeddingGemma zamienia ją na wektor 768D.
    • 3. Zapis do BigQuery: {id, content, embedding}.
    • 4. Od teraz reguła jest przeszukiwalna w RAG.

    Endpointy

    POST /ingest — wgranie pliku CSV (kolumny id, text).

    POST /ingest_text — pojedyncza reguła na żywo z UI.

    Kropki w playgroundzie (rozdział 3) to właśnie takie zasilone reguły.