Czym jest RAG i dlaczego każdy programista powinien to wiedzieć
I Model dużego języka (LLM) zrewolucjonizowały sposób, w jaki wchodzimy w interakcję informacji, ale borykają się z zasadniczym problemem: ich wiedza jest statyczny, zamrożone na czas treningu. Kiedy pytasz LLM o swoją dokumentację wewnętrznie, na Twoich produktach lub na zaktualizowanych danych, odpowiedź będzie ogólna, wymyślona lub po prostu źle. Zjawisko to nazywa się halucynacja.
Generacja wzmocniona odzyskiwaniem (RAG) rozwiązuje ten problem poprzez połączenie mocy generatywne LLM z precyzją systemu wyszukiwania informacji. Zamiast polegać tylko do pamięci modelu, RAG najpierw wyszukuje odpowiednie dokumenty w bazie wiedzy i tam zapewnia kontekst dla modelu w celu wygenerowania dokładnych odpowiedzi opartych na danych.
W pierwszym artykule z tej serii Sztuczna inteligencja dla twórców stron internetowych, będziemy odkrywać RAG szczegółowo: co to jest, jak działa, kiedy go używać, a kiedy go unikać. Na koniec będziesz miał jednego solidne zrozumienie architektury RAG i będziesz gotowy do jej wdrożenia w następnym artykule.
Przegląd serii
| # | Przedmiot | Centrum |
|---|---|---|
| 1 | Jesteś tutaj - Czym jest RAG | Fundamenty i architektura |
| 2 | RAG z TypeScript i LangChain.js | Praktyczne wdrożenie |
| 3 | Baza danych wektorowych dla twórców stron internetowych | Przechowywanie i wyszukiwanie podobieństw |
| 4 | OpenAI i Anthropic API | Integracja LLM |
| 5 | LLM Local z Ollamą | Modele na miejscu |
| 6 | Dostrajanie vs RAG | Kiedy czego używać |
| 7 | Agenci AI: architektura | Systemy autonomiczne |
| 8 | Sztuczna inteligencja w rurociągu CI/CD | Automatyzacja DevOps |
Czego się nauczysz
- Co to jest RAG i jaki problem rozwiązuje
- Kompletna architektura systemu RAG (odzyskiwanie + generowanie).
- Jak działa osadzanie i wyszukiwanie podobieństw
- Strategie dzielenia dokumentów w przygotowaniu
- Różnica między RAG a dostrajaniem
- Prawdziwe przypadki użycia: chatbot, wyszukiwanie semantyczne, pytania i odpowiedzi
- Ograniczenia RAG i kiedy NIE należy go używać
1. Problem: LLM i wiedza statyczna
Wyobraź sobie, że chcesz zbudować chatbota do obsługi klienta swojej firmy. Masz tysiące strony dokumentacji, często zadawane pytania, instrukcje techniczne i rozwiązane zgłoszenia. Używasz LLM, takiego jak GPT-4 lub Claude, ale wynik jest rozczarowujący: model nie zna Twoich produktów, wymyśla nieistniejące funkcje i zapewnia nieprawidłowe procedury z całkowitą pewnością.
Trzy podstawowe problemy LLM
| Problem | Opis | Uderzenie |
|---|---|---|
| Odcięcie wiedzy | Model zna jedynie dane uczące | Nie wie nic o Twoich zastrzeżonych danych |
| Halucynacje | Generuj wiarygodne, ale fałszywe odpowiedzi | Nieprawdziwe informacje z dużą pewnością |
| Brak cytatu | Nie jest w stanie wskazać źródła informacji | Nie można zweryfikować poprawności |
Problemów tych nie da się rozwiązać po prostu lepszym podpowiedzią. Potrzebujemy prawdziwych danych, zaktualizowane i specyficzne dla Twojej domeny. I to jest dokładnie to, co robi RAG.
2. Co to jest RAG: generacja wzmocniona odzyskiwaniem
SZMATA jest to architektura, która łączy w sobie dwie odrębne fazy: wyszukiwanie (pobieranie) odpowiednich dokumentów z bazy wiedzy jest generacja (pokolenie) odpowiedzi na podstawie tych dokumentów. Termin został wprowadzony w 2020 roku przez badaczy przez Meta AI w artykule „Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”.
Pomysł jest prosty, ale potężny: zanim poprosisz model o wygenerowanie odpowiedzi, wyszukaj dokumenty najbardziej odpowiednie dla pytania użytkownika i wstaw je do podpowiedzi jako dodatkowy kontekst. Modelka nie musi już wszystkiego „pamiętać”, musi po prostu rozumować na podanych informacjach.
LLM TRADIZIONALE:
Domanda utente --> [LLM] --> Risposta (basata solo su training data)
^-- Rischio allucinazione alto
RAG:
Domanda utente --> [Retrieval] --> Documenti rilevanti
|
v
Domanda + Documenti --> [LLM] --> Risposta (basata su dati reali)
^-- Rischio allucinazione basso
Praktyczna analogia
Pomyśl o RAG jako o jednym student podczas egzaminu z otwartą książką. Tradycyjny LLM jest uczniem, który musi odpowiedzieć na pamięć: wie dużo, ale może się pomylić lub wymyślić. Dzięki RAG uczeń może przed udzieleniem odpowiedzi zapoznać się ze swoimi notatkami i książkami. Odpowiedź będzie bardziej precyzyjna, bo oparta na konkretnych źródłach.
3. Kompletna architektura systemu RAG
System RAG składa się z dwóch głównych rurociągów: potok indeksowania (wykonywane offline, jednorazowo lub okresowo) oraz potok zapytań (wykonywany w czasie rzeczywistym przy każdym pytaniu użytkownika).
3.1 Potok indeksowania (offline)
Na tym etapie przygotowywane są dokumenty do badań. Kroki są następujące:
[Documenti Sorgente]
|
v
[1. Document Loader] -- Carica PDF, HTML, Markdown, CSV, database
|
v
[2. Text Splitter] --- Divide in chunk di dimensione gestibile
|
v
[3. Embedding Model] - Trasforma ogni chunk in un vettore numerico
|
v
[4. Vector Store] ---- Salva i vettori in un database vettoriale
3.2 Potok zapytań (online)
Ta faza obsługuje żądania użytkowników w czasie rzeczywistym:
[Domanda Utente]
|
v
[1. Embedding Model] --- Stessa funzione usata nell'indicizzazione
|
v
[2. Similarity Search] - Cerca i chunk più simili nel vector store
|
v
[3. Context Assembly] -- Assembla i chunk trovati in un contesto
|
v
[4. Prompt Template] --- "Rispondi alla domanda basandoti su: [contesto]"
|
v
[5. LLM Generation] --- Genera la risposta finale
|
v
[Risposta con Citazioni]
Zwróć uwagę na spójność osadzania
Ważne jest, aby z niego korzystać ten sam model osadzania zarówno w fazie indeksowanie niż w fazie zapytania. Jeśli użyjesz różnych modeli, wektory nie będą porównywalne i wyszukiwanie podobieństwa nie będzie działać poprawnie.
4. Osadzenia: serce RAG
The osadzania są to reprezentacje numeryczne (wektory) przechwytującego tekstu znaczenie semantyczne. Dwa zdania o podobnym znaczeniu będą miały wektory „blisko” w przestrzeń wielowymiarową, nawet jeśli używają zupełnie innych słów.
Frase: "Il gatto dorme sul divano"
Embedding: [0.23, -0.45, 0.67, 0.12, -0.89, ...] // vettore a 1536 dimensioni
Frase: "Il felino riposa sul sofa"
Embedding: [0.22, -0.44, 0.68, 0.11, -0.88, ...] // vettore molto simile!
Frase: "Il prezzo dell'oro sale"
Embedding: [-0.56, 0.78, -0.12, 0.91, 0.34, ...] // vettore molto diverso
Popularne szablony do osadzania
| Model | Wymiary | Dostawcy | Koszt |
|---|---|---|---|
text-embedding-3-small |
1536 | OpenAI | Tokeny o wartości 0,02 USD / 1 milion |
text-embedding-3-large |
3072 | OpenAI | Tokeny o wartości 0,13 USD / 1 milion |
voyage-3 |
1024 | AI podróży | Tokeny o wartości 0,06 USD / 1 milion |
all-MiniLM-L6-v2 |
384 | Przytulanie twarzy (bezpłatny) | Bezpłatny (własny hosting) |
nomic-embed-text |
768 | Ollama (lokalny) | Bezpłatnie (lokalnie) |
La cosinus podobieństwo jest najczęstszą miarą dla porównaj osadzania. Mierzy kąt między dwoma wektorami: wartość 1,0 oznacza wektory identyczne, 0,0 oznacza brak związku, -1,0 oznacza przeciwne znaczenia.
function cosineSimilarity(a: number[], b: number[]): number {
if (a.length !== b.length) {
throw new Error('I vettori devono avere la stessa lunghezza');
}
let dotProduct = 0;
let normA = 0;
let normB = 0;
for (let i = 0; i < a.length; i++) {
dotProduct += a[i] * b[i];
normA += a[i] * a[i];
normB += b[i] * b[i];
}
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
}
// Esempio d'uso
const embedding1 = [0.23, -0.45, 0.67, 0.12];
const embedding2 = [0.22, -0.44, 0.68, 0.11];
const similarity = cosineSimilarity(embedding1, embedding2);
console.log(similarity); // ~0.999 - molto simili!
5. Strategie dzielenia
Il kawałkowanie to proces dzielenia dokumentów na fragmenty (kawałek) o rozsądnej wielkości. Ta faza jest krytyczna: zbyt duże kawałki ulegają rozproszeniu co oznacza, że zbyt małe fragmenty tracą kontekst.
Kluczowe parametry fragmentowania
- Rozmiar kawałka: Maksymalny rozmiar każdego fragmentu (w znakach lub tokenach). Zwykle 500–2000 znaków
- Nakładanie się fragmentów: Nakładanie się kolejnych fragmentów (10-20% rozmiaru fragmentu). Unikaj przerywania koncepcji w połowie
- Separatory: Miejsca, w których preferowane jest wycinanie (akapity, zdania, tytuły)
FIXED SIZE CHUNKING:
Testo: "AAAA|BBBB|CCCC|DDDD" (ogni | = taglio ogni N caratteri)
Pro: Semplice e veloce
Contro: Può tagliare a meta frasi e concetti
RECURSIVE CHARACTER SPLITTING:
Testo diviso per: "\n\n" -> "\n" -> "." -> " " -> ""
Pro: Rispetta la struttura del testo
Contro: Chunk di dimensioni variabili
SEMANTIC CHUNKING:
Usa embeddings per trovare i "punti di rottura" semantici
Pro: Chunk coerenti semanticamente
Contro: Più lento e costoso (richiede embeddings)
DOCUMENT-AWARE CHUNKING:
Rispetta la struttura del documento (titoli, sezioni, tabelle)
Pro: Mantiene il contesto strutturale
Contro: Richiede parsing specifico per formato
Documento originale (600 caratteri):
"Angular è un framework TypeScript per applicazioni web.
Supporta il rendering lato server (SSR) per migliorare
le performance. I componenti standalone eliminano la
necessità di NgModule. I Signals offrono reattività
fine-grained senza Zone.js."
Con chunk_size=200, overlap=50:
Chunk 1: "Angular è un framework TypeScript per applicazioni web.
Supporta il rendering lato server (SSR) per migliorare
le performance."
Chunk 2: "per migliorare le performance. I componenti standalone
eliminano la necessità di NgModule."
Chunk 3: "eliminano la necessità di NgModule. I Signals offrono
reattività fine-grained senza Zone.js."
Najczęstsze błędy w dzieleniu
- Kawałki są zbyt duże (>4000 tokenów): Model może ignorować części kontekstu lub przekraczać limit tokenów
- Kawałki są za małe (<100 żetonów): Utrata kontekstu, fragmentaryczne odpowiedzi
- Zerowe nakładanie się: Koncepcje przecięte na pół, powrót do zdrowia niepełny
- Ignoruj metadane: Utrata informacji takich jak tytuł, autor, data dokumentu
6. RAG a dostrajanie: kiedy czego używać
Jednym z najczęstszych pytań jest: „Czy powinienem użyć RAG, czy doprecyzować model?”. Odpowiedź zależy od rodzaju wiedzy, którą chcesz dodać i sposobu, w jaki zostanie ona wykorzystana.
RAG vs dostrajanie - szczegółowe porównanie
| Czekam | SZMATA | Dostrajanie |
|---|---|---|
| Rodzaj wiedzy | Konkretne fakty, dane, dokumenty | Styl, format, zachowanie |
| Aktualizacja | Natychmiastowe (aktualizacja dokumentów) | Wymaga ponownego przeszkolenia |
| Koszt początkowy | Niski (infrastruktura + osadzanie) | Wysoki (GPU, dane oznaczone, czas) |
| Koszt zapytania | Średni (odzyskiwanie + generowanie) | Niski (tylko generacja) |
| Identyfikowalność | Wysoki (możesz cytować źródła) | Brak (wiedza zintegrowana) |
| Halucynacje | Zredukowane (rzeczywiste dane w kontekście) | Możliwe (nabyta wiedza) |
| Skalowalność danych | Miliony dokumentów | Ograniczone przez zestaw treningowy |
| Złożoność | Media (potok + wektor DB) | Wysoki (szkolenie, ocena, wdrożenie) |
Praktyczna zasada
USA SZMATA kiedy chcesz, aby model „znał” określone informacje (dokumenty, często zadawane pytania, instrukcje). USA dostrajanie kiedy chcesz model „zachowywać się” w określony sposób (ton, format, styl odpowiedzi). W wielu przypadkach najlepsze rezultaty daje połączenie obu podejść.
7. Rzeczywiste przypadki użycia RAG
RAG to nie tylko teoria: to podstawa wielu produktów, których używamy na co dzień. Oto najczęstsze przypadki użycia i sposób, w jaki RAG je umożliwia.
7.1 Chatboty korporacyjne
Najpopularniejszy przypadek użycia. Chatbot, który odpowiada na pytania klientów w oparciu o na prawdziwej dokumentacji firmy: podręczniki, często zadawane pytania, rozwiązane zgłoszenia, wewnętrzne polityki.
// Pseudocodice di un chatbot RAG
async function handleUserQuery(query: string): Promise<string> {
// 1. Cerca documenti rilevanti
const relevantDocs = await vectorStore.similaritySearch(query, 5);
// 2. Costruisci il contesto
const context = relevantDocs
.map(doc => `[Fonte: ${doc.metadata.source}]\n${doc.pageContent}`)
.join('\n\n');
// 3. Genera la risposta con contesto
const response = await llm.invoke(`
Sei un assistente del supporto clienti.
Rispondi SOLO basandoti sulle informazioni fornite.
Se non trovi la risposta nei documenti, dillo esplicitamente.
DOCUMENTI DI RIFERIMENTO:
${context}
DOMANDA DEL CLIENTE:
${query}
RISPOSTA:
`);
return response;
}
7.2 Wyszukiwanie semantyczne
W przeciwieństwie do tradycyjnego wyszukiwania opartego na słowach kluczowych, wyszukiwanie semantyczne za pomocą RAG zawiera oznaczający zapytania. „Jak zresetować hasło” przynosi rezultaty mimo że w dokumencie jest napisane „procedura odzyskiwania danych uwierzytelniających”.
7.3 Pytania i odpowiedzi dotyczące dokumentów
Umożliwia użytkownikom zadawanie pytań w języku naturalnym na temat dużych zbiorów dokumentów: umowy prawne, dokumentacja techniczna, artykuły naukowe, wewnętrzne bazy wiedzy.
7.4 Asystent kodu
Asystent kodu, który zna Twoją konkretną bazę kodu. Indeksuj kod źródłowy, Dokumentacja API, komentarze i testy zapewniające kontekstowe sugestie.
Porównanie przypadków użycia
| Przypadek użycia | Źródło danych | Częstotliwość aktualizacji | Złożoność |
|---|---|---|---|
| Wsparcie Chatbota | FAQ, instrukcje, bilety | Tygodnik | Przeciętny |
| Wyszukiwanie semantyczne | Katalog produktów, artykuły | Codziennie | Niski |
| Dokumenty pytań i odpowiedzi | PDF, umowy, raporty | Na żądanie | Przeciętny |
| Asystent kodu | Kod źródłowy, dokumentacja API | Przy każdym zatwierdzeniu | Wysoki |
8. Anatomia kompletnego rurociągu RAG
Przyjrzyjmy się szczegółowo każdemu elementowi rurociągu, uwzględniając wybory technologiczne z którymi będziesz musiał się zmierzyć podczas realizacji.
+------------------+--------------------------------------------+
| Componente | Opzioni Tecnologiche |
+------------------+--------------------------------------------+
| Document Loader | LangChain loaders, Unstructured, custom |
| Text Splitter | RecursiveCharacter, Semantic, Markdown |
| Embedding Model | OpenAI, Voyage, HuggingFace, Ollama |
| Vector Store | Pinecone, Chroma, Weaviate, pgvector |
| Retriever | Similarity, MMR, Self-Query, Ensemble |
| Prompt Template | LangChain templates, custom |
| LLM | GPT-4, Claude, Llama, Mistral |
| Post-processing | Citation extraction, confidence scoring |
+------------------+--------------------------------------------+
8.1 Ładowarki dokumentów
Programy ładujące dokumenty wyodrębniają tekst z różnych źródeł. Jakość ekstrakcji bezpośrednio wpływa na jakość odpowiedzi.
Formato | Loader Consigliato | Note
-----------------+---------------------------+---------------------------
PDF | PDFLoader, PyPDFLoader | Attenzione a tabelle/immagini
HTML/Web | CheerioWebBaseLoader | Rimuove tag, estrae testo
Markdown | MarkdownTextSplitter | Preserva la struttura
CSV/Excel | CSVLoader | Una riga = un documento
JSON | JSONLoader | Configura il percorso dati
Database SQL | Custom loader | Query -> documenti
Confluence/Notion| API-based loader | Richiede autenticazione
Codice sorgente | TextLoader + filtri | Splitta per funzione/classe
8.2 Retriever: poszukiwanie poza podobieństwem
Retriever nie tylko znajduje najbardziej podobne kawałki. Istnieją zaawansowane strategie w celu poprawy jakości odzyskiwania.
Strategie odzyskiwania
- Wyszukiwanie podobieństw: K fragmentów z najwyższym wynikiem podobieństwa. Proste, ale skuteczne
- MMR (maksymalna istotność krańcowa): Zrównoważ znaczenie i różnorodność. Unikaj kawałków, które są do siebie zbyt podobne
- Zapytanie własne: Model wyodrębnia filtry z pytania (np. „Dokumenty 2024” filtruje według daty)
- Ensemble: Połącz wyniki z wielu obiektów pobierających (np. słowa kluczowe + semantyka), aby uzyskać lepszy zasięg
- Dokument nadrzędny: Pobiera odpowiedni fragment, ale zwraca dokument nadrzędny w celu uzyskania pełnego kontekstu
9. Ograniczenia RAG i kiedy NIE należy go używać
RAG nie jest rozwiązaniem magicznym. Jak każda architektura, ma ona ograniczenia, o których należy pamiętać przed jego przyjęciem.
Kiedy RAG NIE jest właściwym wyborem
- Złożone rozumowanie: RAG przedstawia fakty, a nie rozumowanie. W przypadku analizy wieloetapowej lub złożonych dedukcji logicznych model musi mieć własne możliwości
- Dane strukturalne: Jeśli potrzebujesz agregacji SQL, obliczeń lub złączeń między tabelami, użyj relacyjnej bazy danych, a nie RAG
- Ultraszybkie reakcje w czasie rzeczywistym: Potok pobierania zwiększa opóźnienie (100–500 ms). Jeśli potrzebujesz odpowiedzi w czasie krótszym niż 50 ms, rozważ buforowanie
- Baza wiedzy jest za mała: Dzięki niewielkiej liczbie dokumentów (<10 stron) możesz zmieścić wszystko w podpowiedzi bez konieczności ich wyszukiwania
- Bardzo dynamiczne dane: Jeśli dane zmieniają się co sekundę (np. ceny giełdowe), aktualizacja RAG nie jest wystarczająco szybka
Typowe problemy i rozwiązania
| Problem | Przyczyna | Rozwiązanie |
|---|---|---|
| Nieistotne odpowiedzi | Kawałek za duży | Zmniejsz rozmiar porcji, zwiększ nakładanie się |
| Zbyt często odpowiada „nie wiem”. | Pobieranie jest zbyt restrykcyjne | Zwiększ k (liczbę wyników), użyj MMR |
| Ciągłe halucynacje | Niewystarczający lub niejednoznaczny kontekst | Popraw monit, dodaj wyraźne instrukcje |
| Wysokie opóźnienie | Za dużo fragmentów w kontekście | Zmniejsz k, użyj ponownego rankingu |
| Wysokie koszty | Zbyt wiele tokenów na zapytanie | Kompresuj kawałki, używaj tańszych modeli |
10. Metryki oceny RAG
Aby wiedzieć, czy Twój system RAG działa dobrze, musisz go zmierzyć. Oto główne wskaźniki.
Wskaźniki RAG
| Metryczny | Co mierzy | Cel |
|---|---|---|
| Znaczenie kontekstu | Czy odzyskane dokumenty mają związek z wnioskiem? | > 0,8 |
| Wierność | Czy odpowiedź opiera się na dostarczonych dokumentach? | > 0,9 |
| Odpowiedź na temat trafności | Czy odpowiedź ma związek z pytaniem? | > 0,85 |
| Utajenie | Całkowity czas na udzielenie odpowiedzi | < 3 sekundy |
| Częstotliwość halucynacji | Odsetek roszczeń niepopartych dokumentami | < 5% |
Tool di Valutazione:
- RAGAS (Retrieval Augmented Generation Assessment)
- LangSmith (by LangChain) - tracing e valutazione
- Phoenix (by Arize) - osservabilità LLM
- DeepEval - framework di testing per LLM
- TruLens - valutazione feedback-driven
Metriche Composite:
RAG Score = (Context Relevance + Faithfulness + Answer Relevance) / 3
Następne kroki
W tym artykule uzyskałeś solidną wiedzę na temat RAG: co to jest, jak działa, kluczowe elementy architektury i kiedy z niej korzystać (lub nie). Zrozumiałeś tę rolę podstawy osadzania, strategie fragmentowania i metryki oceny.
Nel następny artykuł przejdziemy od teorii do praktyki: będziemy wdrażać kompletny system RAG wykorzystujący TypeScript i LangChain.js, z wektorem prawdziwy sklep i interfejs konwersacyjny z pamięcią.
Dodatkowe zasoby
- Oryginalny papier RAG: „Generowanie wspomagane wyszukiwaniem do zadań NLP wymagających dużej wiedzy” (Lewis i in., 2020)
- Dokumentacja LangChain.js: Oficjalna dokumentacja dotycząca implementacji w TypeScript
- Książka kucharska OpenAI: Praktyczne przykłady RAG z API OpenAI
- Centrum edukacyjne Pinecone: Przewodniki po wektorowych bazach danych i osadzaniu
- RAGA: Struktura open source do oceny systemów RAG







