## RAG

*Kontekst i wiedza*

*Ostatnia zmiana: 28 września 2026*

RAG (retrieval-augmented generation) to wyszukanie fragmentów twoich dokumentów i wklejenie ich do promptu przed pytaniem. Model odpowiada z podanego tekstu zamiast z pamięci, więc wiedza może być aktualna, prywatna i cytowana, ale jakość odpowiedzi zależy głównie od tego, co znajdzie wyszukiwanie.

**Po ludzku:** Egzamin z otwartą książką. Zamiast liczyć na pamięć ucznia, kładziesz przed nim właściwą stronę podręcznika tuż przed pytaniem. Jeśli podasz złą stronę, uczeń odpowie źle równie pewnie, bo czyta to, co dostał.

*Interaktywny widżet na stronie: Przejdź krok po kroku przez pipeline. Zobacz, które fragmenty odpadają na wyszukiwaniu i rerankingu oraz co zmienia się w odpowiedzi.*

### Indeksowanie i chunking

- Indeks buduje się wcześniej, poza ścieżką pytania: parsowanie dokumentów, podział na fragmenty (chunki), embedding każdego fragmentu i zapis w indeksie wektorowym oraz tekstowym. Jak działają embeddingi i wyszukiwanie wektorowe, opisuje temat „Embeddingi i wyszukiwanie wektorowe”. Parsowanie PDF-ów, tabel i skanów to częste źródło błędów: tekstu zepsutego przy parsowaniu nie znajdzie żadne wyszukiwanie. Pomagają parsery rozumiejące układ strony i modele wizyjne, a wyszukiwanie po obrazach stron w ogóle pomija wyciąganie tekstu (ColPali, 2024).
- Wielkość chunka to kompromis. Za mały traci kontekst („w tym okresie przysługuje…”, ale w jakim?), za duży rozmywa dopasowanie i zjada okno. Punkt startowy to chunki po kilkaset tokenów, cięte po strukturze dokumentu (nagłówki, sekcje, akapity), a nie po liczbie znaków. Ostateczny rozmiar dobierasz ewaluacją.
- Contextual Retrieval (Anthropic, 2024): model dopisuje do każdego chunka 50–100 tokenów kontekstu z całego dokumentu, zanim chunk trafi do obu indeksów. W testach Anthropic razem z BM25 i rerankingiem obniżyło to odsetek właściwych fragmentów brakujących w top 20 (1 − recall@20) z 5,7% do 1,9%.
- Każdy chunk dostaje metadane: źródło, datę, wersję, uprawnienia. Zmieniony dokument trzeba przeindeksować, usunięty usunąć z indeksu, a zmiana modelu embeddingów wymaga przeliczenia całego zbioru.

### Wyszukiwanie i reranking

- Wyszukiwanie hybrydowe (wektory plus BM25, scalone przez RRF) i reranking cross-encoderem opisuje temat „Embeddingi i wyszukiwanie wektorowe”. W pipelinie decydujesz o liczbach: ilu kandydatów pobrać (Anthropic brał top 150), ile fragmentów po rerankingu włożyć do promptu (zwykle kilka do kilkunastu) i ile opóźnienia możesz na to wydać.
- Pytanie z czatu bywa złym zapytaniem („a jak to było z tym urlopem?”). Pomaga przepisanie go przez model na samodzielne zapytanie z uwzględnieniem historii rozmowy.
- Uprawnienia filtruje się w zapytaniu do indeksu, na podstawie tożsamości użytkownika i ACL zsynchronizowanych ze źródłem, zanim fragment trafi do promptu. Polecenie „nie pokazuj tajnych dokumentów” w prompcie niczego nie gwarantuje, a dokumenty mogą zawierać wstrzyknięte polecenia (temat „Prompt injection”).

### Sztuczki po stronie zapytania i indeksu

- HyDE (Gao i in., 2022): model pisze hipotetyczną odpowiedź, a wyszukiwanie idzie po jej embeddingu zamiast po embeddingu pytania. Pomaga, gdy pytania i dokumenty są sformułowane zupełnie inaczej, np. potoczne pytanie kontra język regulaminu. Kosztuje dodatkowe wywołanie modelu przed każdym wyszukiwaniem. Szkodzi, gdy model nie zna domeny: zmyślone nazwy i liczby ciągną wyszukiwanie do niewłaściwych sąsiadów. Modele embeddingów z osobnym prefiksem albo instrukcją dla zapytań częściowo zmniejszają tę rozbieżność bez dodatkowego wywołania.
- Odwrotny kierunek, po stronie indeksu: model generuje dla każdego chunka pytania, na które ten chunk odpowiada, i indeksujesz je obok niego (doc2query, 2019). Płacisz raz, przy indeksowaniu, a nie przy każdym pytaniu. Indeks rośnie, a zysk zależy od tego, jak dobrze wygenerowane pytania pokrywają prawdziwe pytania użytkowników.
- Multi-query rozwija przepisywanie pytania z poprzedniej sekcji: kilka wersji zapytania wykonywanych równolegle, z wynikami scalonymi przez RRF. Podnosi recall, gdy nie wiadomo, jakimi słowami opisano odpowiedź, kosztem wywołania modelu i kilku wyszukiwań. Pytanie wieloetapowe („kto ma więcej urlopu, zespół Ani czy Bartka?”) rozbija się na podpytania. Gdy kolejne zależy od wyniku poprzedniego, to już agentic retrieval.
- Small-to-big (parent-document retrieval): indeksujesz małe fragmenty, bo dają precyzyjne dopasowanie, a do modelu trafia większa całość, sekcja albo strona, bo daje kontekst. Ceną są tokeny w prompcie, a kilka trafień z tej samej sekcji trzeba scalić w jeden fragment.
- Late interaction (ColBERT, 2020): wektor dla każdego tokena zamiast jednego na fragment, a trafność to suma najlepszych dopasowań tokenów pytania do tokenów dokumentu (MaxSim). To środek między szybkim bi-encoderem a dokładnym cross-encoderem, kosztem wielokrotnie większego indeksu.

### Prompt i cytaty

- Fragmenty idą do promptu z identyfikatorem i źródłem, a instrukcja każe odpowiadać tylko na ich podstawie, cytować identyfikatory i przyznać, gdy odpowiedzi w nich nie ma. Bez tej furtki model uzupełni luki z pamięci (temat „Halucynacje”).
- Przy długim materiale dokumenty idą przed pytaniem. Anthropic podaje, że pytanie na końcu poprawia jakość nawet o 30% przy złożonych wejściach z wieloma dokumentami. Zmienne fragmenty stoją za stałym system promptem, żeby nie psuć prompt cache’u (temat „Prompt caching”).
- Cytaty sprawdzaj w kodzie: czy cytowany fragment był w kontekście i czy cytat naprawdę w nim jest. API z wbudowanymi cytatami, jak Citations w Claude, zwracają cytowany tekst ze wskazaniem zakresu w dokumencie, a poprawność wskazania gwarantuje API.

### Ewaluacja, agenci i alternatywy

- Wyszukiwanie i generowanie ewaluuje się osobno. Wyszukiwanie: zestaw pytań z oznaczonymi właściwymi fragmentami i recall@k, czyli jaka część oznaczonych fragmentów jest w pierwszych k wynikach (przy jednym właściwym fragmencie: czy w ogóle tam jest), przy k równym liczbie fragmentów w prompcie. Generowanie: wierność (czy każde twierdzenie wynika z podanych fragmentów) i kompletność, zwykle modelem jako sędzią sprawdzonym na ludzkich ocenach (temat „Ewaluacje”).
- Agentic retrieval: wyszukiwanie jest narzędziem, a model sam układa zapytania, czyta wyniki i szuka dalej (temat „Pętla agenta”). Radzi sobie z pytaniami wieloetapowymi i porównaniami, do których nie wystarczy jedno wyszukiwanie, kosztem kilku tur, czasu i tokenów.
- Długi kontekst zamiast RAG ma sens przy małym, stałym zbiorze, zwłaszcza z prompt cachingiem. Anthropic w 2024 r. wskazywał granicę ok. 200 tys. tokenów (ok. 500 stron), czyli całe ówczesne okno Claude’a. Przy oknach 1 mln tokenów (stan na wrzesień 2026) koszt na pytanie, opóźnienie i spadek jakości z długością rozstrzygają dużo wcześniej niż rozmiar okna (temat „Okno kontekstowe i agent”). RAG wygrywa przy dużym albo zmiennym zbiorze i gdy liczą się cytaty i uprawnienia. Fine-tuning uczy stylu i formatu, a faktów uczy zawodnie i trudno je potem aktualizować (temat „Fine-tuning i LoRA”).

### Sprawdź się

**Pytanie:** Jak działa RAG i gdzie najczęściej zawodzi?

**Krótka odpowiedź:** RAG podaje modelowi wiedzę w kontekście zamiast liczyć na jego pamięć. Wcześniej, offline, dokumenty się parsuje, tnie po strukturze, opisuje metadanymi i uprawnieniami, a potem indeksuje wektorowo oraz w BM25. Przy pytaniu wyszukiwanie idzie hybrydowo z filtrem uprawnień, reranker wybiera kilka najlepszych fragmentów, a prompt każe odpowiadać tylko z nich, z cytatami, i przyznać, gdy odpowiedzi nie ma. Najczęściej zawodzi parsowanie i wyszukiwanie, nie model: właściwego fragmentu po prostu nie ma w prompcie. Dlatego recall wyszukiwania i wierność odpowiedzi mierz osobno.

### Pytania pogłębiające

- **Użytkownicy zgłaszają złe odpowiedzi. Jak szukasz przyczyny?** Na trace’ach sprawdź etap po etapie: czy właściwy fragment był w wynikach wyszukiwania, czy przetrwał reranking, czy trafił do promptu i czy model go użył. Brak w wynikach to parsowanie, chunking albo zapytanie. Obecny, ale źle użyty to prompt albo model. Nieaktualna treść to proces indeksowania.
- **RAG czy długi kontekst?** Długi kontekst jest prostszy przy małym, stałym zbiorze, zwłaszcza z prompt cachingiem. RAG wygrywa przy dużym albo zmiennym zbiorze pod względem kosztu na pytanie, opóźnienia, uprawnień i cytatów, a krótszy kontekst to też mniejszy spadek jakości z długością.
- **Jak obsłużyć uprawnienia?** ACL zapisane w metadanych każdego chunka i zsynchronizowane ze źródłem, filtr w zapytaniu do indeksu na podstawie tożsamości użytkownika i test, że osoba bez dostępu nie dostaje fragmentu. Nigdy przez instrukcję w prompcie.
- **Kiedy agentic retrieval zamiast jednego wyszukiwania?** Gdy pytanie wymaga kilku kroków albo porównania źródeł i nie wystarczy do niego jedno zapytanie. Zacznij od jednego wyszukiwania, zmierz, na jakich pytaniach zawodzi, i dopiero tam płać turami i opóźnieniem agenta.
- **Kiedy HyDE szkodzi?** Gdy model nie zna domeny: hipotetyczna odpowiedź ma zmyślone nazwy, liczby i terminy, więc jej embedding ląduje obok dokumentów o czymś innym. Nie pomaga też przy wyszukiwaniu identyfikatorów i dokładnych fraz, gdzie wygrywa BM25, i przy ciasnym budżecie opóźnienia. Rozstrzyga porównanie recall@k z HyDE i bez niego na własnym zestawie pytań.

### Źródła

- [Anthropic: Contextual Retrieval](https://www.anthropic.com/engineering/contextual-retrieval)
- [Faysse i in.: ColPali, wyszukiwanie po obrazach stron (arXiv, 2024)](https://arxiv.org/abs/2407.01449)
- [Lewis i in.: Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (arXiv)](https://arxiv.org/abs/2005.11401)
- [Gao i in.: Precise Zero-Shot Dense Retrieval without Relevance Labels, czyli HyDE (arXiv)](https://arxiv.org/abs/2212.10496)
- [Dokumentacja Claude: citations](https://platform.claude.com/docs/en/build-with-claude/citations)

Strona interaktywna: https://howaiworks.dev/pl/rag/
