RAG: Wyjaśnienie generacji rozszerzonej odzyskiwania
I Model dużego języka (LLM) reprezentują jedną z innowacji technologicznych najbardziej przełomowe w ostatnich latach: GPT-4, Claude, Gemini i Lama potrafią pisać kod, podsumowywać dokumenty, odpowiadać na złożone pytania, a nawet uzasadniać abstrakcyjne problemy. Jednak mają one wadę strukturalną, która drastycznie ogranicza ich zastosowanie konteksty zawodowe: halucynacje.
Kiedy LLM nie zna odpowiedzi, nie mówi „nie wiem”. Zamiast tego generuj wiarygodny tekst ale całkowicie fałszywe, równie pewne, jak przedstawiające weryfikowalne fakty. W środowisku biznesowym, prawnym lub medycznym takie zachowanie jest niedopuszczalne. Rozwiązanie bardziej skuteczne i dojrzałe do tego problemu nazywa się Generacja wzmocniona odzyskiwaniem (RAG).
W pierwszym artykule z tej serii Inżynieria AI i zaawansowane RAG, odejdziemy od podstaw: czym jest RAG, jak działa, dlaczego rozwiązuje problem halucynacji i jak zbudować od podstaw działający system RAG. Kiedy skończysz, będziesz miał zrozumienie solidną wiedzę na temat całej architektury, dzięki czemu będziesz gotowy zagłębić się w każdy pojedynczy komponent w kolejnych artykułach.
Przegląd serii
| # | Przedmiot | Centrum |
|---|---|---|
| 1 | Jesteś tutaj - wyjaśniono RAG | Podstawy i pełna architektura |
| 2 | Osadzanie i wyszukiwanie semantyczne | Jak teksty stają się wektorami |
| 3 | Szczegółowa baza danych wektorowych | Przechowywanie, indeksowanie, wyszukiwanie podobieństw |
| 4 | RAG z LangChainem i Pythonem | Praktyczna kompleksowa realizacja |
| 5 | Odzyskiwanie hybrydowe i zmiana rankingu | Hybrydowe słowo kluczowe + wyszukiwanie semantyczne |
| 6 | Okno kontekstowe i szybka inżynieria | Zoptymalizuj kontekst dla LLM |
| 7 | RAG w produkcji | Skalowanie, monitorowanie, ewaluacja |
| 8 | Grafy wiedzy i RAGs | Wykresy wiedzy + wyszukiwanie |
| 9 | Systemy wieloagentowe | Współpracujący agenci AI |
| 10 | Przyszłość RAG | Trendy, badania i kolejne kroki |
Czego się nauczysz
- Czym jest RAG i jaki podstawowy problem rozwiązuje dla LLM
- Kompletna architektura: od przygotowania dokumentu po wygenerowanie odpowiedzi
- Jak działa osadzanie, składowanie wektorów i wyszukiwanie podobieństw
- Strategie dzielenia na kawałki i ich kompromisy
- Jak zbudować minimalny działający system RAG za pomocą Pythona
- Różnice między naiwnym RAG i zaawansowanym RAG
- Kiedy stosować RAG, dostrajanie czy szybką inżynierię
1. Problem halucynacji w LLM
Aby zrozumieć, dlaczego RAG jest konieczny, musimy najpierw zrozumieć problem, który rozwiązuje. Modele wielkojęzykowe są zasadniczo Probabilistyczne modele języka: biorąc pod uwagę tekst wejściowy, przewidują najbardziej prawdopodobną sekwencję tokenów jako kontynuację. Architektura ta, oparta na mechanizmie uwaga z Transformers, produkuje niezwykłe wyniki, ale ma wewnętrzne ograniczenie: model nie „wie” niczego w ludzkim sensie terminu. Generuj statystycznie wiarygodny tekst w oparciu o wyuczone wzorce szkolenie.
Trzy problemy strukturalne LLM
| Problem | Opis | Praktyczny wpływ |
|---|---|---|
| Odcięcie wiedzy | Wiedza zostaje zamrożona w dniu szkolenia | Brak informacji o ostatnich wydarzeniach i danych zastrzeżonych |
| Halucynacje | Generuj wiarygodne, ale całkowicie sfabrykowane odpowiedzi | Fałszywe informacje przedstawione z dużą pewnością |
| Brak cytatów | Nie potrafi wskazać źródła swoich twierdzeń | Nie ma możliwości sprawdzenia poprawności odpowiedzi |
| Brak danych prywatnych | Nie zna wewnętrznej dokumentacji spółki | Bezużyteczne w konkretnych przypadkach użycia bez kontekstu |
Halucynacje nie są jednorazowym błędem: są bezpośrednią konsekwencją architektury. Jeśli model nie ma wystarczającej ilości informacji, aby odpowiedzieć, nie zwraca błędu. Zamiast tego generuje najbardziej prawdopodobną kontynuację tekstu, która może być całkowicie invented. Modelkę nauczono pisać płynnie i spójnie, a nie tak be factually accurate.
Konkretne przykłady halucynacji
Aby zrozumieć powagę problemu, rozważmy rzeczywiste scenariusze, w których występują halucynacje mają istotne konsekwencje:
- Zakres prawny: LLM może cytować nieistniejące orzeczenia lub nigdy nie uchwalone przepisy z wiarygodnymi, ale wymyślonymi numerami pozycji
- Dziedzina medycyny: Może sugerować nieprawidłowe dawkowanie leków lub nieudokumentowane interakcje leków
- Dokumentacja techniczna: Może opisywać interfejsy API z parametrami, które nie istnieją lub funkcjami, które nigdy nie zostały zaimplementowane
- Obsługa klienta: Mogą wymyślić zasady firmy, procedury zwrotów lub nieistniejące gwarancje
Statystyki potwierdzają skalę problemu: częstość występowania halucynacji jest różna znacznie według dziedzin, ze specjalistycznymi dziedzinami, takimi jak medycyna i prawo, które rekordują stawki 10-20% nawet w przypadku najbardziej zaawansowanych modeli. RAG reprezentuje technikę najskuteczniejsze w łagodzeniu tego problemu, z udokumentowaną redukcją aż do 71%.
2. Co to jest RAG: definicja i pochodzenie
Generacja wzmocniona odzyskiwaniem (RAG) jest to paradygmat architektoniczny łączy w sobie system wyszukiwanie informacji (odzyskiwanie dokumentów) z szablonem generatywne (LLM) w celu uzyskania odpowiedzi w oparciu o rzeczywiste dane. Koncepcja została sformalizowana w 2020 r. przez Patricka Lewisa i współpracowników z Meta AI w przełomowym artykule „Generowanie wspomagane wyszukiwaniem dla zadań NLP wymagających dużej wiedzy”.
Kluczowy wniosek jest prosty: zamiast prosić model o „zapamiętanie” wszystkiego informacje z jego szkolenia, przekazujemy mu odpowiednie dokumenty w momencie pokolenie. Proces ten nazywa się grunt: generacja kotwic do konkretnych i sprawdzalnych źródeł.
LLM TRADIZIONALE:
Domanda utente ──────────────────> [LLM] ──> Risposta
|
Basata SOLO su training data
Rischio allucinazione: ALTO
RAG (Retrieval-Augmented Generation):
Domanda utente ──> [RETRIEVAL] ──> Documenti rilevanti
| |
| v
└───────> [LLM + Contesto] ──> Risposta con citazioni
|
Basata su DATI REALI recuperati
Rischio allucinazione: BASSO
Analogia: egzamin z otwartej księgi
Wyobraź sobie egzamin na uniwersytecie. Tradycyjny LLM jest jak student, który musi odpowiedzieć na pamięć: dużo wie, ale potrafi się pomylić lub wymyślić szczegóły. RAG jest jak egzamin otwarta książka: uczeń może przeglądać swoje notatki i książki zanim odpowiedziałeś. Odpowiedź będzie bardziej precyzyjna i sprawdzalna, bo oparta na podstawach na konkretnych źródłach.
Koncepcja uziemienia jest kluczowa: może nią być każde stwierdzenie w wygenerowanej odpowiedzi powiązane z konkretnym dokumentem w bazie wiedzy. Oznacza to, że:
- Odpowiedzi są sprawdzalny: Możesz sprawdzić dokument źródłowy
- Odpowiedzi są aktualizowalne: Aktualizując dokumenty, odpowiedzi zmieniają się automatycznie
- Odpowiedzi są sterowny: Ty decydujesz, z jakimi dokumentami system może się zapoznać
- Odpowiedzi są identyfikowalne: Można dołączyć cytaty z odniesieniem do źródła
3. Jak działa RAG: kompletny rurociąg
System RAG składa się z dwóch makrofaz: potok indeksowania, która przygotowuje dokumenty jednorazowo (lub okresowo), oraz potok zapytań, który obsługuje zapytania użytkowników w czasie rzeczywistym.
3.1 Indeksowanie potoku (faza offline)
Faza indeksowania przekształca surowe dokumenty w zoptymalizowaną strukturę do wyszukiwania semantycznego. Składa się z czterech kolejnych etapów:
[Documenti Sorgente]
| PDF, HTML, Markdown, CSV, database, API, email...
v
[1. DOCUMENT LOADING]
| Estrazione del testo grezzo dai formati sorgente
| Preservazione dei metadati (autore, data, titolo)
v
[2. CHUNKING (Text Splitting)]
| Divisione in frammenti di dimensione gestibile
| Strategie: fixed-size, semantic, recursive
| Overlap tra chunk per preservare contesto
v
[3. EMBEDDING]
| Trasformazione di ogni chunk in un vettore numerico
| Modelli: OpenAI, Sentence Transformers, Cohere
| Dimensioni tipiche: 384, 768, 1536, 3072
v
[4. VECTOR STORE]
| Salvataggio dei vettori in un database specializzato
| Indexing per ricerca veloce (HNSW, IVF)
| ChromaDB, Pinecone, Weaviate, Milvus, Qdrant
v
[Knowledge Base Pronta per le Query]
3.2 Potok zapytań (faza online)
Gdy użytkownik zadaje pytanie, potok zapytań rozpoczyna działanie, aby znaleźć najbardziej istotne dokumenty i uzyskać uzasadnioną odpowiedź:
[Domanda dell'Utente]
| "Come configuro l'autenticazione OAuth nella nostra app?"
v
[1. QUERY EMBEDDING]
| La domanda viene trasformata in vettore
| Stesso modello usato nell'indicizzazione!
v
[2. SIMILARITY SEARCH]
| Ricerca dei chunk più simili nel vector store
| Metriche: cosine similarity, L2, dot product
| Restituisce i top-k risultati (tipicamente k=3..10)
v
[3. CONTEXT ASSEMBLY]
| I chunk recuperati vengono assemblati in un contesto
| Ordinamento per rilevanza, deduplicazione
v
[4. PROMPT CONSTRUCTION]
| Costruzione del prompt con contesto + domanda
| Template: "Basandoti sui seguenti documenti, rispondi..."
v
[5. LLM GENERATION]
| Il modello genera la risposta basandosi sul contesto
| Può includere citazioni ai documenti sorgente
v
[Risposta Fondata + Citazioni]
Podstawowa zasada: Konsystencja osadzania
E' obowiązkowy użyj tego samego modelu osadzania w obu plikach indeksowanie niż w fazie zapytania. Różne modele tworzą przestrzenie wektorowe niezgodne: wektory wygenerowane przez model nie są z nimi porównywalne innego. Zmiana modelu osadzania wymaga całkowitego ponownego indeksowania wszystkich dokumentów.
4. Przetwarzanie dokumentów: porcjowanie i przygotowanie
Il kawałkowanie jest to jeden z najbardziej krytycznych etapów całego rurociągu RAG. Jakość wyników zależy w dużej mierze od sposobu podziału dokumentów. Zbyt duże fragmenty osłabiają sygnał semantyczny i marnują miejsce w oknie kontekstowym z LLM. Zbyt małe fragmenty tracą kontekst niezbędny do zrozumienia.
4.1 Porcjowanie o stałym rozmiarze
Najprostsza strategia: podziel tekst na bloki o stałej wielkości (np. 500 tokenów) z opcjonalnym nakładaniem się kolejnych fragmentów.
Parametry fragmentowania o stałym rozmiarze
| Parametr | Opis | Typowa wartość |
|---|---|---|
| rozmiar_porcji | Maksymalny rozmiar każdej porcji w tokenach lub znakach | 300-500 tokenów |
| chunk_overlap | Nakładanie się kolejnych fragmentów | 10-20% chunk_size |
| separator | Znak/ciąg używany do dzielenia | „\n\n”, „\n”, „” |
Documento originale (1500 token):
"Lorem ipsum dolor sit amet... [1500 token di testo]"
Con chunk_size=500 e overlap=50:
Chunk 1: token 1-500 ────────────┐
Chunk 2: token 451-950 ──┐ overlap │
Chunk 3: token 901-1400 ──┘ │
Chunk 4: token 1351-1500 │
────────────┘
L'overlap garantisce che il contesto ai bordi non venga perso.
4.2 Rekurencyjne dzielenie znaków
Bardziej wyrafinowana strategia, która stara się dzielić z poszanowaniem struktury dokumentu. Użyj hierarchii separatorów: najpierw spróbuj podzielić przez akapity („\n\n”), następnie liniami („\n”), następnie zdaniami („”.”), na końcu słowami („ „). Dzięki temu kontekst semantyczny jest lepiej zachowywany niż w przypadku stałego rozmiaru.
4.3 Porcjowanie semantyczne
Najbardziej zaawansowana strategia: użyj samych osadzania, aby określić, gdzie dokonać podziału. Oblicz podobieństwo między kolejnymi zdaniami i utwórz nowy fragment, gdy podobieństwo spadnie poniżej progu, co oznacza zmianę tematu. Tworzy kawałki wielkości zmienne, ale spójne semantycznie.
Porównanie strategii fragmentowania
| Strategia | jakość | Złożoność | Kiedy go używać |
|---|---|---|---|
| Stały rozmiar | Podstawowy | Minimalny | Prototypowanie, jednorodne dokumenty |
| Rekurencyjne | Dobry | Niski | Dokumenty ogólnego przeznaczenia, strukturyzowane |
| Semantyka | Doskonały | Wysoki | Wymagana wysoka jakość, heterogeniczne dokumenty |
Znaczenie metadanych
Każdy kawałek powinien nieść ze sobą bogów metadane: tytuł dokumentu, autor, data, sekcja, strona. Te metadane mają kluczowe znaczenie dla filtrowania podczas wyszukiwania i wygenerowania dokładnych cytatów w odpowiedzi. Kawałek bez metadane są jak akapit bez kontekstu.
5. Osadzania: przekształcanie tekstu w wektory
The osadzania są matematycznym sercem RAG. Osadzanie to a reprezentacja numeryczna (wektor liczb dziesiętnych), która przechwytuje znaczenie semantyczne tekstu. Będą miały dwa zdania o podobnym znaczeniu „pobliskie” wektory w przestrzeni wielowymiarowej, niezależnie od użytych słów.
INPUT: Frase di testo
OUTPUT: Vettore di numeri decimali (es. 1536 dimensioni)
Esempio:
"Il gatto dorme sul divano" --> [0.23, -0.45, 0.67, 0.12, -0.89, ...]
"Il felino riposa sul sofa" --> [0.22, -0.44, 0.68, 0.11, -0.88, ...]
^^ Vettori molto SIMILI (stesso significato)
"Il prezzo dell'oro sale" --> [-0.56, 0.78, -0.12, 0.91, 0.34, ...]
^^ Vettore molto DIVERSO (significato diverso)
Model osadzania to sieć neuronowa trenowana na ogromnych ilościach tekstu uczyć się związków semantycznych między słowami, zdaniami i pojęciami. Nie tylko produkuje reprezentacja syntaktyczna (jak zbiór słów lub TF-IDF), ale oddaje znaczenie głębia tekstu.
Główne modele osadzania (2025-2026)
| Model | Wymiary | Dostawcy | Orientacyjny koszt |
|---|---|---|---|
text-embedding-3-small |
1536 | OpenAI | ~0,02 $ / 1 milion tokenów |
text-embedding-3-large |
3072 | OpenAI | ~0,13 $ / 1 milion tokenów |
voyage-3-large |
1024 | AI podróży | ~0,06 $ / 1 milion tokenów |
all-MiniLM-L6-v2 |
384 | Przytulana twarz | Bezpłatny (własny hosting) |
nomic-embed-text |
768 | Ollama (lokalny) | Bezpłatnie (lokalnie) |
embed-v4 |
1024 | Przystać do siebie | ~0,10 $ / 1 milion tokenów |
Wybór modelu osadzania zależy od przypadku użycia: największe modele (3072 wymiary) oferują bogatszą reprezentację, ale kosztują więcej pod względem przechowywanie i obliczanie. W wielu przypadkach sprawdzają się modele o rozmiarach 768–1536 doskonały kompromis pomiędzy jakością i ceną.
6. Sklep wektorowy: baza danych osadzania
Un sklep wektorowy (lub baza danych wektorowych) to specjalistyczna baza danych dla przechowuj, indeksuj i przeszukuj wektory wielowymiarowe. W odróżnieniu od tradycyjne bazy danych, które szukają dokładnych dopasowań (SQL WHERE), magazyn wektorów wyszukaj więcej przewoźników podobny do zapytania.
6.1 Metryki podobieństwa
Wyszukiwanie magazynu wektorów opiera się na metrykach odległości/podobieństwa między wektorami. Trzy najczęstsze wskaźniki to:
Porównanie metryk podobieństwa
| Metryczny | Zakres | Opis | Kiedy go używać |
|---|---|---|---|
| Cosinus podobieństwa | [-1, 1] | Mierzy kąt między dwoma wektorami, ignoruje wielkość | Domyślne w większości przypadków (zalecane) |
| Odległość euklidesowa (L2) | [0, +inf) | Odległość geometryczna w przestrzeni, wrażliwa na wielkość | Gdy wielkość wektorów jest znacząca |
| Produkt kropkowy | (-inf, +inf) | Iloczyn skalarny łączy kierunek i wielkość | Już znormalizowane wektory, Maksymalne wewnętrzne wyszukiwanie produktu |
6.2 Przegląd wektorowych baz danych
Rynek wektorowych baz danych eksplodował wraz z przyjęciem RAG. Oto przegląd z głównych dostępnych narzędzi:
Porównanie baz danych wektorowych
| Bazy danych | Typ | Język | Idealny dla |
|---|---|---|---|
| ChromaDB | Wbudowany/serwer | Pyton | Prototypowanie, rozwój lokalny, małe zbiory danych |
| Szyszka | Zarządzane w chmurze | Wielojęzyczny | Produkcja, autoskalowanie, zero operacji |
| Tkać | Samodzielnie / w chmurze | Go | Wyszukiwanie hybrydowe, wielodostępność, GraphQL |
| Milvus | Samodzielnie / w chmurze | Idź do C++ | Duże wolumeny, wysoka wydajność, przedsiębiorstwo |
| Qdrant | Samodzielnie / w chmurze | Rdza | Wydajność, zaawansowane filtrowanie, REST API |
| pgwektor | Rozszerzenie PostgreSQL | C | Istniejący stos PostgreSQL, dane relacyjne + wektorowe |
| FAISS | Biblioteka w pamięci | C++ / Pythona | Badania, benchmarki, maksymalna optymalizacja |
Aby rozpocząć, ChromaDB to najprostszy wybór: instaluje się go za pomocą pipa, działa w pamięci lub na dysku i natywnie integruje się z LangChain. W przypadku produkcji dostępne są Pinecone (zarządzane) i Qdrant (samodzielnie hostowane). najpopularniejszy.
7. Odzyskiwanie: wyszukiwanie odpowiednich dokumentów
Faza wyszukiwanie to moment, w którym pojawia się pytanie użytkownika przekształcony w wektor i porównany ze wszystkimi wektorami w magazynie wektorów, aby znaleźć najbardziej odpowiednie fragmenty. Proces ten zachodzi w milisekundach, nawet w przypadku milionów indeksowanych dokumentów, dzięki algorytmom indeksowania przybliżonego, takim jak HNSW (Hierarchiczny żeglowny mały świat).
Query: "Come configuro OAuth nella nostra app?"
|
v
[1] Embedding della query ──> [0.34, -0.21, 0.56, ...]
|
v
[2] Similarity Search nel Vector Store
| Confronta il vettore della query con tutti i vettori salvati
| Usa cosine similarity come metrica
|
v
[3] Top-K Results (es. k=5)
|
| Score: 0.92 - "Configurazione OAuth 2.0 per applicazioni web..."
| Score: 0.87 - "Guida ai flussi di autenticazione OAuth..."
| Score: 0.83 - "Impostazione dei redirect URI per OAuth..."
| Score: 0.76 - "Confronto tra OAuth e SAML per SSO..."
| Score: 0.71 - "Sicurezza delle API con token JWT..."
|
v
[4] Filtering e Reranking (opzionale)
| Filtra per metadati (data, categoria, fonte)
| Reranking con modello cross-encoder
|
v
[Chunk Rilevanti Pronti per il Prompt]
7.1 Parametr Top-K
Parametr góra-k określa, ile fragmentów jest odzyskiwanych. Wybór to kompromis:
- K za niskie (1-2): Ryzyko pominięcia istotnych informacji
- K za wysokie (20+): Za dużo szumu w kontekście, marnowanie tokenów, ryzyko pomylenia modelu
- Optymalne K (3-7): Dobra równowaga pomiędzy pokryciem i precyzją
7.2 Punktacja trafności
Każdy wynik ma wynik trafności (ocena trafności). Kawałki przy niskich wynikach należy je odfiltrować, ponieważ dodają bezwartościowy szum. Typowym progiem dla podobieństwa cosinus jest 0,7: wszystko poniżej jest odrzucane. W praktyce optymalny próg zależy od dziedziny i należy go skalibrować eksperymentalnie.
8. Generacja: budowanie reakcji za pomocą LLM
Ostatni etap rurociągu RAG: odzyskane fragmenty są łączone w: ustrukturyzowany kontekst i wstawiony w wierszu polecenia LLM wraz z pytanie użytkownika. Model generuje odpowiedź w oparciu wyłącznie o (lub głównie) w podanym kontekście.
8.1 Szablon podpowiedzi
Dobry szablon podpowiedzi RAG powinien instruować model, aby:
- Używać Sam informacje z podanego kontekstu
- Przyznaj się, jeśli nie znajdziesz odpowiedzi w dokumentach
- W miarę możliwości cytuj źródła
- Nie wymyślaj informacji, które nie mają kontekstu
Sei un assistente tecnico. Rispondi alle domande SOLO basandoti
sul contesto fornito. Se la risposta non è presente nel contesto,
rispondi "Non ho trovato informazioni sufficienti nei documenti
disponibili."
CONTESTO:
---
{context}
---
DOMANDA: {question}
ISTRUZIONI:
1. Rispondi in modo chiaro e conciso
2. Cita il documento sorgente tra parentesi quadre [Fonte: nome_doc]
3. Se il contesto non contiene la risposta, dillo esplicitamente
4. Non inventare informazioni non presenti nel contesto
RISPOSTA:
8.2 Śledzenie cytowań
Jedną z najcenniejszych funkcji RAG jest możliwość śledzenia cytowań. Każdy fragment w kontekście może być oznaczony identyfikatorem (np. [DOC-1], [DOC-2]) a model otrzymuje polecenie odwoływania się do tych identyfikatorów w odpowiedzi. To pozwala użytkownikowi na weryfikację każdego oświadczenia poprzez zapoznanie się z oryginałem dokumentu.
Okno kontekstowe i ograniczenia
Ilość kontekstu, który możesz wstawić, jest ograniczona okno kontekstowe modelu LLM. Jeśli odzyskane fragmenty przekraczają limit, będziesz musiał wybrać tylko najbardziej istotne lub je podsumować. Nowoczesne modele takie jak GPT-4o (token 128K) i Claude 3.5 (200 tys. tokenów) mają bardzo duże okna kontekstowe, ale mimo to wstawiają za dużo kontekstu nieistotne pogarszają jakość odpowiedzi (tzw. problem „zagubienia w środku”).
9. Kompletna architektura RAG: przegląd
Teraz, gdy przyjrzeliśmy się każdemu komponentowi z osobna, złóżmy architekturę w komplecie z kompleksowym systemem RAG:
FASE OFFLINE (Indicizzazione)
┌──────────────────────────────────────────────────────┐
│ │
│ [Documenti] ──> [Loader] ──> [Chunker] │
│ PDF, HTML Estrazione Divisione │
│ MD, CSV testo in frammenti │
│ │ │
│ v │
│ [Embedding Model] │
│ Testo ──> Vettore │
│ │ │
│ v │
│ [Vector Store] │
│ ChromaDB, Pinecone │
│ Weaviate, Qdrant │
│ │
└──────────────────────────────────────────────────────┘
FASE ONLINE (Query)
┌──────────────────────────────────────────────────────┐
│ │
│ [Domanda Utente] │
│ │ │
│ v │
│ [Query Embedding] ──> [Similarity Search] │
│ Stesso modello Top-K chunk │
│ dell'indicizzazione │ │
│ v │
│ [Context Assembly] │
│ Chunk + Metadati │
│ │ │
│ v │
│ [Prompt Template + Contesto + Domanda] │
│ │ │
│ v │
│ [LLM] │
│ GPT-4, Claude │
│ Llama, Gemini │
│ │ │
│ v │
│ [Risposta con Citazioni] │
│ │
└──────────────────────────────────────────────────────┘
Członkowie i obowiązki
| Część | Odpowiedzialność | Typowe narzędzia |
|---|---|---|
| Moduł ładowania dokumentów | Przesyłaj dokumenty z różnych źródeł | Ładowarki LangChain, Unstructured, LlamaIndex |
| Rozdzielacz tekstu | Dziel dokumenty na optymalne fragmenty | RekursywnyRozdzielacz tekstu, Semantyczny Chunker |
| Model osadzania | Przekształcanie tekstu na wektory semantyczne | Osadzania OpenAI, transformatory zdań, Cohere |
| Sklep wektorowy | Przechowuj i indeksuj wektory | ChromaDB, Pinecone, Qdrant, pgvector |
| Retrievery | Wyszukaj najbardziej odpowiednie fragmenty | Wyszukiwanie podobieństw, MMR, wyszukiwanie hybrydowe |
| LLM | Wygeneruj ostateczną odpowiedź na podstawie kontekstu | GPT-4o, Claude 3.5, Lama 3, Gemini Pro |
10. Praktyczny przykład: Minimalny RAG w Pythonie
Zbudujmy działający system RAG z minimalną ilością potrzebnego kodu. Użyjemy LangChain jako ramy orkiestracji, OpenAI do osadzania i generowania, np ChromaDB jako lokalny sklep wektorowy.
10.1 Konfiguracja projektu
# Crea un ambiente virtuale
python -m venv rag-env
source rag-env/bin/activate # Linux/Mac
# Installa le dipendenze
pip install langchain langchain-openai langchain-community
pip install chromadb
pip install pypdf # Per caricare PDF
10.2 Potok indeksowania
import os
from langchain_community.document_loaders import (
PyPDFLoader,
TextLoader,
DirectoryLoader
)
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# Configura la API key
os.environ["OPENAI_API_KEY"] = "sk-..."
# 1. DOCUMENT LOADING
# Carica tutti i PDF da una cartella
loader = DirectoryLoader(
"./documenti/",
glob="**/*.pdf",
loader_cls=PyPDFLoader
)
documents = loader.load()
print(f"Caricati {len(documents)} documenti")
# 2. CHUNKING
# Divisione ricorsiva con overlap
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 500 caratteri per chunk
chunk_overlap=50, # 50 caratteri di overlap
length_function=len,
separators=["\n\n", "\n", ". ", " ", ""]
)
chunks = text_splitter.split_documents(documents)
print(f"Creati {len(chunks)} chunk")
# 3. EMBEDDING + 4. VECTOR STORE
# Crea gli embeddings e salvali in ChromaDB
embedding_model = OpenAIEmbeddings(
model="text-embedding-3-small"
)
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embedding_model,
persist_directory="./chroma_db",
collection_name="documenti_aziendali"
)
print("Vector store creato e salvato su disco")
10.3 Potok zapytań
import os
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
os.environ["OPENAI_API_KEY"] = "sk-..."
# Carica il vector store esistente
embedding_model = OpenAIEmbeddings(
model="text-embedding-3-small"
)
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=embedding_model,
collection_name="documenti_aziendali"
)
# Configura il retriever
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 5} # Recupera i 5 chunk più simili
)
# Definisci il prompt template
prompt_template = PromptTemplate(
template="""Sei un assistente tecnico esperto.
Rispondi alla domanda basandoti SOLO sul contesto fornito.
Se non trovi la risposta nel contesto, dillo esplicitamente.
CONTESTO:
{context}
DOMANDA: {question}
RISPOSTA (con citazioni ai documenti fonte):""",
input_variables=["context", "question"]
)
# Crea la chain RAG
llm = ChatOpenAI(
model="gpt-4o",
temperature=0 # Deterministic per risposte fattuali
)
rag_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # Inserisci tutti i chunk nel prompt
retriever=retriever,
return_source_documents=True,
chain_type_kwargs={
"prompt": prompt_template
}
)
# Esegui una query
result = rag_chain.invoke(
{"query": "Come configuro l'autenticazione OAuth?"}
)
# Stampa la risposta
print("RISPOSTA:")
print(result["result"])
print("\nFONTI:")
for doc in result["source_documents"]:
print(f" - {doc.metadata.get('source', 'N/A')}"
f" (pagina {doc.metadata.get('page', 'N/A')})")
Oczekiwany wynik
RISPOSTA:
Per configurare l'autenticazione OAuth nella nostra applicazione,
segui questi passaggi:
1. Registra l'app nel provider OAuth (Google, GitHub, etc.)
2. Configura i redirect URI nel file config.yaml [Fonte: guida-oauth.pdf]
3. Implementa il flusso Authorization Code [Fonte: architettura-auth.pdf]
...
FONTI:
- documenti/guida-oauth.pdf (pagina 12)
- documenti/architettura-auth.pdf (pagina 5)
- documenti/faq-sicurezza.pdf (pagina 3)
10.4 Struktura projektu
rag-project/
├── documenti/ # I tuoi documenti sorgente
│ ├── guida-oauth.pdf
│ ├── architettura.pdf
│ └── faq.pdf
├── chroma_db/ # Vector store persistente (generato)
├── indexing.py # Script di indicizzazione
├── query.py # Script di query
├── requirements.txt # Dipendenze
└── .env # API keys (mai committare!)
11. Naiwny RAG kontra zaawansowany RAG
System, który do tej pory zbudowaliśmy, jest tym, co nazywa społeczność Naiwny RAG: prosta i prosta implementacja, która działa zaskakująco dobrze w wielu przypadkach użycia. Istnieją jednak ograniczenia dotyczące tych technik Zaawansowany RAG szukają pokonać.
11.1 Ograniczenia naiwnego RAG
- Niezgodność zapytania i dokumentu: Twoje pytanie może zawierać inne terminy niż w dokumentach. „Jak zresetować hasło?” vs dokument „Procedura odzyskiwania danych uwierzytelniających”
- Problemy z granicami fragmentów: Odpowiednie informacje można podzielić na dwie kolejne części
- Zagubiony w środku: LLM ma tendencję do przywiązywania większej wagi do fragmentów na początku i na końcu kontekstu, zaniedbując te centralne
- Ograniczenie pojedynczego przeskoku: Nie może odpowiadać na pytania wymagające podsumowań z wielu dokumentów
11.2 Zaawansowane techniki RAG
Ewolucja od naiwnego do zaawansowanego RAG
| Technika | Problem rozwiązany | Jak to działa |
|---|---|---|
| Przepisanie zapytania | Zapytania niejednoznaczne lub źle sformułowane | LLM przepisuje zapytanie w formie bardziej odpowiedniej do pobrania |
| Hyde | Niezgodność zapytania i dokumentu | Wygeneruj hipotetyczny dokument na podstawie zapytania, a następnie wyszukaj podobne dokumenty |
| Zmiana rankingu | Wyniki nie są optymalnie posortowane | Model obejmujący wiele koderów porządkuje wyniki według trafności |
| Wiele zapytań | Jedna perspektywa badawcza | Generuj warianty zapytań, aby poszerzyć zasięg |
| Samo-szmata | Kiedy pobieranie nie jest konieczne | Model samodzielnie decyduje, czy i kiedy odzyskać |
| Multi-hopowy RAG | Złożone, wieloetapowe pytania | Łańcuch iteracyjnych operacji wyszukiwania pozwalający na zbudowanie złożonego rozumowania |
| Wyszukiwanie hybrydowe | Granice samego wyszukiwania semantycznego | Połącz wyszukiwanie semantyczne (wektorowe) ze słowami kluczowymi (BM25) |
| Wykres RAG | Złożone relacje między podmiotami | Korzystaj z wykresów wiedzy, aby poruszać się po uporządkowanych relacjach i kontekstach |
NAIVE RAG:
Query ──> Embedding ──> Search ──> Top-K ──> LLM ──> Risposta
ADVANCED RAG:
Query ──> [Query Analysis]
│
├──> Query Rewriting ──> Embedding ──> Search ─┐
├──> HyDE Generation ──> Embedding ──> Search ─┤
└──> Multi-Query ──────> Embedding ──> Search ─┘
│
[Merge + Deduplica]
│
[Reranker Model]
│
[Context Compression]
│
[LLM + Citazioni]
│
[Risposta Verificata]
W kolejne artykuły z tej serii zagłębimy się w każdą z tych technik, szczególnie w artykule pt Odzyskiwanie hybrydowe i zmiana rankingu.
12. Kiedy stosować RAG: Ramy decyzyjne
RAG nie jest odpowiedzią na wszystkie problemy. Istnieją trzy główne podejścia do tego dostosuj zachowanie LLM, każdy z odrębnymi zaletami i ograniczeniami. Wybór zależy od konkretnego przypadku użycia.
RAG vs dostrajanie vs szybka inżynieria
| Kryterium | Szybka inżynieria | SZMATA | Dostrajanie |
|---|---|---|---|
| Koszt początkowy | Minimum | Średni | Wysoki |
| Niezbędne dane | Nikt | Baza wiedzy | Zestaw danych szkoleniowych |
| Aktualizacja | Natychmiastowa (szybka zmiana) | Szybko (aktualizuj dokumenty) | Powolny (ponowny trening) |
| Utajenie | Niski | Media (odzyskiwanie + generowanie) | Niski |
| Rzeczywista dokładność | To zależy od modelu | Wysoki (na podstawie dokumentu) | Średnia (zależy od treningu) |
| Cytowane | Nic | Wysoka (źródła utworów) | Nic |
| Złożoność | Niski | Przeciętny | Wysoki |
12.1 Praktyczne drzewo decyzyjne
Hai bisogno di personalizzare un LLM?
│
├── I dati cambiano frequentemente? (documenti, policy, catalogo)
│ └── SI ──> RAG
│ (I dati si aggiornano senza re-training)
│
├── Serve citare le fonti?
│ └── SI ──> RAG
│ (Tracciabilita delle risposte)
│
├── Il dominio è stabile e ben definito?
│ ├── Hai un grande dataset di training?
│ │ └── SI ──> Fine-Tuning
│ │ (Personalizzazione profonda del comportamento)
│ └── NO ──> RAG oppure Prompt Engineering
│
├── Serve solo cambiare tono/formato/stile?
│ └── SI ──> Prompt Engineering
│ (Nessuna infrastruttura aggiuntiva)
│
└── Serve ragionamento complesso su dati proprietari?
└── SI ──> RAG + Fine-Tuning (Approccio Ibrido)
(Il meglio di entrambi i mondi)
Złota zasada
Podejście zalecane przez społeczność inżynierów AI opiera się na skali złożoności rosnąco: zacznij od podpowiedzi inżynierskiej, następnie przechodzimy do SZMATA jeśli potrzebne są zewnętrzne dane lub cytaty, i rozważ dostrajanie tylko kiedy pierwsze dwa podejścia są niewystarczające. Postęp ten minimalizuje koszty i złożoności, maksymalizując zwrot z inwestycji.
12.2 Idealne przypadki użycia RAG
- Chatboty biznesowe: Odpowiadają na podstawie wewnętrznej dokumentacji
- Wyszukiwanie semantyczne: Znajdź dokumenty istotne pod względem znaczenia, a nie tylko słów kluczowych
- Baza wiedzy Pytania i odpowiedzi: Dynamiczne często zadawane pytania, które aktualizują się wraz z dokumentami
- Asystenci prawni: Odpowiedzi w oparciu o przepisy i orzecznictwo
- Wsparcie techniczne: Rozwiązania oparte na biletach wcześniejszych i ręcznych
- Analiza dokumentów: Wyciągaj wnioski z raportów, umów i artykułów naukowych
12.3 Kiedy NIE stosować RAG
- Zadania kreatywne: Kreatywne pisanie, burza mózgów, generowanie pomysłów (szablon musi być darmowy)
- Ogólna rozmowa: Chatboty społecznościowe, w których nie są potrzebne określone dane
- Zadania z małą ilością danych: Jeśli masz tylko kilka dokumentów, szybka inżynieria może wystarczyć
- Ścisłe reakcje w czasie rzeczywistym: Jeśli opóźnienie pobierania jest niedopuszczalne (poniżej 50 ms)
13. Rynek RAG: liczby i trendy
RAG nie jest już koncepcją akademicką: stała się przyjętą architekturą produkcyjną na dużą skalę. Liczby rynkowe potwierdzają jego strategiczne znaczenie.
RAG w liczbach (2024–2030)
| Metryczny | Dany |
|---|---|
| Globalny rynek RAG (2024) | ~1,2 miliarda dolarów |
| Projekcja rynku (2030) | ~11 miliardów dolarów |
| Roczna stopa wzrostu (CAGR) | 49,1% (2025-2030) |
| Adopcja w przedsiębiorstwie | 30-60% przypadków użycia LLM wykorzystuje RAG |
| Redukcja halucynacji | Do 71% przy dobrze wdrożonym RAG |
| Dominujące frameworki | 80,5% korzysta z FAISS lub Elasticsearch |
Branże napędzające adopcję to prawo, medycyna, obsługa klienta i usługi finansowe, czyli wszystkie dziedziny, w których wymagana jest rzetelność faktograficzna i cytowalność źródeł są wymaganiami niepodlegającymi negocjacjom. Trend w latach 2025-2026 to zmiana od eksperymentów po produkcję na dużą skalę, z coraz większym naciskiem na zgodność, monitorowanie i jakość danych.
14. Wnioski i dalsze kroki
W tym artykule zbudowaliśmy kompleksowe zrozumienie RAG: od problemu co prowadzi do (halucynacji LLM) kompleksowej architektury, przechodzącej każdego pojedynczego elementu rurociągu. Widzieliśmy działające, praktyczne wdrożenie i porównaliśmy RAG z alternatywami (dostrajanie, szybka inżynieria).
Podsumowanie kluczowych pojęć
- SZMATA łączy wyszukiwanie i generowanie w celu uzyskania odpowiedzi w oparciu o rzeczywiste dane
- La potok indeksowania przekształcaj dokumenty w wektory: Ładowanie, Dzielenie, Osadzanie, Przechowywanie
- La potok zapytań znajdź i wykorzystaj odpowiednie dokumenty: Osadzanie, Wyszukiwanie, Montaż, Generowanie
- Il kawałkowanie jest to jedna z najważniejszych decyzji: bezpośrednio wpływa na jakość wyszukiwania
- The osadzania oddają znaczenie semantyczne tekstu w wektorach numerycznych
- I sklep wektorowy umożliwiają wyszukiwanie podobieństw w milionach dokumentów
- Zaawansowany RAG wprowadza techniki takie jak reranking, HyDE i multi-hop, aby pokonać ograniczenia Naive RAG
- RAG jest idealny, gdy jest to potrzebne zaktualizowane, weryfikowalne i możliwe do cytowania odpowiedzi
Następny artykuł: Osadzanie i wyszukiwanie semantyczne
W kolejnym artykule z tej serii zagłębimy się w najbardziej fascynujący element RAG: niego osadzania. Zobaczymy jak sprawdzą się wewnętrznie, jak wybrać właściwy model, jak ocenić jego jakość i jak zoptymalizować wyszukiwanie semantyczne. Zbadamy także metryki ewaluacyjne i techniki porównawcze służące do pomiaru wydajność Twojego systemu wyszukiwania.
Seria AI Engineering i Advanced RAG
| Przedmiot | Temat |
|---|---|
| 01 - Jesteś tutaj | RAG: Wyjaśnienie generacji rozszerzonej odzyskiwania |
| 02 - Dalej | Osadzanie i głębokie wyszukiwanie semantyczne |
| 03 | Baza danych wektorowych: architektura i najlepsze praktyki |
| 04 | Budowa systemu RAG przy użyciu LangChain i Python |
| 05 | Pobieranie hybrydowe: słowo kluczowe + semantyka + zmiana rankingu |
| 06 | Okno kontekstowe i szybka inżynieria dla RAG |
| 07 | RAG w produkcji: monitorowanie, ocena, skalowanie |
| 08 | Grafy wiedzy i wyszukiwanie strukturalne |
| 09 | Systemy wieloagentowe i zorganizowane RAG |
| 10 | Przyszłość RAG: trendy i badania |







