Jak przygotować dane do RAG: dokumenty, embeddingi i pre-processing

Dowiedz się, jak przygotować dane do systemu Retrieval-Augmented Generation (RAG): od czyszczenia dokumentów po embeddingi i optymalizację wyników.
31 grudnia 2025
blog
Poziom: Średnio zaawansowany

Artykuł przeznaczony dla analityków, inżynierów danych oraz osób wdrażających systemy RAG, które chcą zrozumieć przygotowanie danych, embeddingi i optymalizację wyszukiwania.

Z tego artykułu dowiesz się

  • Jakie etapy obejmuje przygotowanie danych do systemu RAG i dlaczego są kluczowe dla jakości odpowiedzi?
  • Jak skutecznie czyścić dane oraz dzielić dokumenty na fragmenty (chunking), aby poprawić trafność wyszukiwania?
  • Jak generować embeddingi, budować bazę wektorową i optymalizować wyszukiwanie (metryki, Top-K, re-ranking) w systemie RAG?

Wprowadzenie do systemu RAG i przygotowania danych

Systemy Retrieval-Augmented Generation (RAG) stanowią połączenie mocy dużych modeli językowych (LLM) z możliwościami wyszukiwania informacji w zewnętrznych źródłach wiedzy. Ich głównym celem jest generowanie odpowiedzi opartych na danych spoza oryginalnego zbioru treningowego modelu, dzięki czemu możliwe jest uzyskanie aktualnych, precyzyjnych i kontekstowych odpowiedzi.

W przeciwieństwie do klasycznych modeli językowych, które operują wyłącznie na swojej wewnętrznej reprezentacji wiedzy, system RAG pobiera najpierw istotne informacje z własnej bazy wiedzy (np. kolekcji dokumentów, artykułów, plików technicznych), a następnie wykorzystuje je do wygenerowania odpowiedzi. Taki mechanizm znacząco zwiększa przejrzystość, wiarygodność i aktualność tworzonych odpowiedzi.

Kluczowym elementem skutecznego działania systemu RAG jest odpowiednie przygotowanie danych źródłowych. Proces ten obejmuje kilka etapów – od wstępnego czyszczenia dokumentów, przez ich segmentację, nadanie metadanych, aż po stworzenie wektorowej reprezentacji treści (embeddingów). Każdy z tych kroków wpływa na jakość wyszukiwania oraz trafność generowanych odpowiedzi.

Poprawnie przygotowane dane odgrywają fundamentalną rolę w efektywności systemu RAG. Nie chodzi tu jedynie o samą treść, ale również o sposób jej reprezentacji, strukturyzacji i indeksowania. Przemyślany pipeline przygotowania danych może znacząco podnieść wartość informacyjną całego systemu i zwiększyć jego użyteczność w praktycznych zastosowaniach, takich jak chatboty, wyszukiwarki semantyczne, wirtualni asystenci czy narzędzia do wspomagania decyzji.

Czyszczenie i wstępne przetwarzanie danych źródłowych

Jednym z kluczowych etapów przygotowania danych do systemu Retrieval-Augmented Generation (RAG) jest odpowiednie oczyszczenie i wstępne przetworzenie materiałów źródłowych. Na tym etapie celem jest usunięcie elementów, które mogą zakłócać proces wyszukiwania kontekstowego oraz generowania odpowiedzi przez model językowy. Temat tego artykułu pojawia się w niemal każdej sesji szkoleniowej Cognity – czasem w formie pytania, czasem w formie frustracji.

W praktyce dane źródłowe pochodzą z różnych formatów i środowisk – mogą to być dokumenty tekstowe, strony internetowe, raporty PDF, prezentacje czy bazy danych. Różnorodność ta sprawia, że wstępne przetwarzanie musi być dostosowane do charakterystyki konkretnego źródła.

Proces czyszczenia i wstępnego przetwarzania zazwyczaj obejmuje:

  • Usuwanie zbędnych elementów: takich jak nagłówki stron, stopki, numeracja, reklamy, skrypty czy komentarze techniczne, które nie wnoszą wartości semantycznej.
  • Normalizację tekstu: czyli ujednolicenie znaków specjalnych, usunięcie nadmiarowych spacji, poprawę błędów kodowania oraz konwersję do formatu, z którym system może efektywnie pracować.
  • Standaryzację językową: sprowadzanie różnych wariantów tego samego wyrażenia do jednej formy, np. poprzez lematyzację lub zamianę skrótów na pełne wersje.
  • Obsługę języka naturalnego: uwzględnienie detekcji języka, usuwanie nieistotnych fragmentów (np. spisów treści, przypisów) i eliminację powtórzeń.
  • Filtrowanie treści: selekcję tylko tych fragmentów, które są istotne z punktu widzenia późniejszego wyszukiwania i generowania odpowiedzi.

Na tym etapie warto również zadbać o odpowiedni format wyjściowy tekstu – najlepiej w formie ustrukturyzowanej, która ułatwi późniejsze etapy, takie jak dzielenie dokumentu na fragmenty czy generowanie embeddingów.

Dzielenie dokumentów na fragmenty (chunking)

Dzielenie dokumentów na fragmenty, znane jako chunking, to kluczowy etap przygotowania danych w systemach Retrieval-Augmented Generation (RAG). Jego głównym celem jest podział dużych bloków tekstu na mniejsze jednostki, które można efektywnie indeksować, przeszukiwać oraz przekazywać jako kontekst do modeli językowych. Dobrze zaprojektowany chunking wpływa na jakość wyszukiwania i trafność generowanych odpowiedzi.

Najczęściej stosowane podejścia do dzielenia tekstu to:

  • Dzielenie oparte na liczbie słów lub tokenów – fragmenty są tworzone na podstawie długości tekstu (np. 200 tokenów), co pozwala zachować kontrolę nad limitem wejściowym modelu.
  • Dzielenie semantyczne – fragmenty są oddzielane na podstawie struktury treści, np. akapitów, nagłówków lub logicznych sekcji, co sprzyja zachowaniu spójności znaczeniowej.

Poniższa tabela pokazuje podstawowe różnice między tymi podejściami:

Rodzaj chunkingu Zalety Wady
Na podstawie tokenów Łatwe do zaimplementowania, kontrola długości Może ucinać zdania lub myśli w połowie
Semantyczne Lepsze zrozumienie kontekstu, spójność treści Trudniejsze do zaimplementowania, mniej przewidywalne rozmiary

Dobór metody zależy od charakterystyki danych oraz docelowego zastosowania systemu RAG. Często stosuje się także nakładanie fragmentów (ang. overlapping chunks), które pozwala uniknąć utraty kontekstu na granicach fragmentów.

Przykładowa implementacja prostego dzielenia tekstu na fragmenty po 200 tokenów w Pythonie z użyciem biblioteki tiktoken może wyglądać następująco:

import tiktoken

def split_into_chunks(text, max_tokens=200):
    enc = tiktoken.get_encoding("cl100k_base")
    tokens = enc.encode(text)
    chunks = [tokens[i:i+max_tokens] for i in range(0, len(tokens), max_tokens)]
    return [enc.decode(chunk) for chunk in chunks]

Efektywny chunking ma bezpośredni wpływ na jakość dopasowania embeddingów oraz trafność odpowiedzi generowanych przez model. Właściwy kompromis między długością fragmentów a ich spójnością znaczeniową jest kluczowy dla sukcesu systemu RAG. Jeśli chcesz zgłębić ten temat i nauczyć się stosować go w praktyce, sprawdź Kurs RAG w praktyce - nowoczesne techniki wydobywania i generowania danych.

Dodawanie metadanych do fragmentów tekstu

Metadane odgrywają kluczową rolę w kontekście systemów Retrieval-Augmented Generation (RAG), ponieważ stanowią dodatkowy kontekst wykorzystywany podczas wyszukiwania i generacji odpowiedzi. Są to informacje towarzyszące fragmentowi tekstu (ang. chunk), które nie są częścią jego treści głównej, ale pomagają w filtrowaniu, klasyfikowaniu, indeksowaniu i lepszym dopasowaniu zapytań użytkownika.

Najczęściej stosowane metadane obejmują:

  • Źródło dokumentu – np. nazwa pliku, URL, repozytorium danych
  • Data publikacji lub aktualizacji – pomocna przy rozwiązywaniu konfliktów wersji i ocenie aktualności
  • Typ dokumentu – np. instrukcja techniczna, email, artykuł, raport
  • Identyfikator fragmentu – ułatwia odwoływanie się do konkretnego chunka lub jego lokalizację w oryginalnym dokumencie
  • Tematyka lub kategoria – np. „prawo”, „finanse”, „obsługa klienta”

Poniższa tabela przedstawia porównanie funkcji różnych typów metadanych i ich potencjalne zastosowania w systemie RAG:

Typ metadanych Przykład Zastosowanie
Źródło "dokumentacja/faq_2023.pdf" Nawigacja i śledzenie pochodzenia informacji
Data "2023-08-15" Filtrowanie wyników wg aktualności
Kategoria "techniczne wsparcie" Lepsze dopasowanie do zapytań z określonego obszaru
ID fragmentu "faq_2023_001_chunk03" Mapowanie wyników na oryginalne źródła

W praktyce metadane są najczęściej przechowywane w strukturze obiektu JSON razem z treścią chunku. Oto uproszczony przykład:

{
  "text": "Jak zresetować hasło do konta? Przejdź do ustawień -> Bezpieczeństwo...",
  "metadata": {
    "source": "faq_2023.pdf",
    "date": "2023-08-15",
    "category": "bezpieczeństwo",
    "chunk_id": "faq_2023_001_chunk03"
  }
}

Dobre praktyki w zakresie metadanych obejmują ich spójność, jednoznaczność i możliwość łatwego filtrowania. Odpowiednio przygotowane metadane zwiększają skuteczność dopasowania wyników i umożliwiają bardziej precyzyjne kontrolowanie działania systemu RAG. W czasie szkoleń Cognity ten temat bardzo często budzi ożywione dyskusje między uczestnikami.

Generowanie embeddingów i budowa wektoryzowanej bazy wiedzy

Po przygotowaniu i podzieleniu dokumentów na mniejsze fragmenty, kluczowym krokiem w systemie RAG (Retrieval-Augmented Generation) jest przekształcenie tych fragmentów w reprezentacje numeryczne — tzw. embeddingi. Embeddingi umożliwiają szybkie i skuteczne porównywanie treści dokumentów i zapytań użytkownika w przestrzeni wektorowej.

Czym są embeddingi?

Embedding to wektor liczb rzeczywistych, który reprezentuje znaczenie danego fragmentu tekstu. Dzięki temu teksty o podobnej semantyce znajdują się blisko siebie w przestrzeni wektorowej, co umożliwia precyzyjne dopasowywanie wyników podczas wyszukiwania kontekstowego.

Wybór modelu embeddingów

Na rynku dostępne są różne modele embeddingujące, zarówno ogólnego przeznaczenia, jak i specjalizowane. Oto krótkie porównanie:

Model Zalety Wady Przykłady użycia
OpenAI Ada v2 Szybki, niedrogi, dobre wyniki ogólne Model zamknięty, dane przesyłane na zewnątrz Małe i średnie projekty, prototypy
Sentence-BERT (SBERT) Open source, dobre wyniki semantyczne Wymaga większych zasobów do trenowania Systemy działające lokalnie, projekty z ograniczeniami prywatności
Instructor-XL Kontekstowo zoptymalizowany, wspiera taski z instrukcją Większe wymagania obliczeniowe Zaawansowane systemy z wyrafinowaną strukturą zapytań

Wybór odpowiedniego modelu zależy od wielu czynników, takich jak: wymagania dotyczące prywatności, dostępność mocy obliczeniowej, koszt, jakość wyników czy język dokumentów.

Proces generowania embeddingów

Embeddingi generuje się poprzez przekazanie każdego przygotowanego fragmentu tekstu do wybranego modelu. W efekcie otrzymujemy wektor, który można zapisać w bazie danych do późniejszego wyszukiwania.

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')

chunks = ["Pierwszy fragment tekstu.", "Drugi fragment tekstu."]
embeddings = model.encode(chunks)

Budowa wektoryzowanej bazy wiedzy

Uzyskane embeddingi zapisuje się w wyspecjalizowanych strukturach danych umożliwiających szybkie wyszukiwanie najbliższych wektorów (nearest neighbor search). Popularne rozwiązania to m.in.:

  • FAISS (Facebook AI Similarity Search)
  • Chroma
  • Weaviate
  • Pinecone
  • ElasticSearch z pluginem vector search

Podczas zapisu embeddingów warto dołączać metadane, takie jak źródło dokumentu, numer fragmentu czy data publikacji. Dzięki temu wyszukiwarka może zwracać nie tylko trafne, ale i kontekstowo zrozumiałe wyniki.

Proces generowania embeddingów i budowy bazy wektorowej stanowi fundament każdego systemu RAG — to tutaj zaczyna się transformacja surowej wiedzy w strukturę umożliwiającą inteligentne przeszukiwanie i generowanie odpowiedzi dopasowanych do kontekstu. Jeśli chcesz nauczyć się tego procesu w praktyce i zdobyć solidne podstawy pracy z RAG, zapraszamy do Kursu Praktyczne narzędzia AI: Machine Learning, Deep Learning i RAG dla analityków i nieprogramistów.

Optymalizacja jakości wyszukiwania i dopasowania wyników

W systemach Retrieval-Augmented Generation (RAG) kluczową rolę odgrywa jakość wyszukiwanych fragmentów tekstu, które stają się podstawą odpowiedzi generowanej przez model językowy. W tej sekcji omówimy podstawowe strategie poprawy trafności dopasowania wyników oraz sposoby zwiększenia precyzji wyszukiwania w bazie embeddingów.

Wybór odpowiedniego algorytmu wyszukiwania

Jednym z najważniejszych aspektów jest wybór skutecznej metody porównywania wektorów embeddingów. Najpopularniejsze podejścia to:

  • Cosine Similarity – dobrze sprawdza się przy porównywaniu kierunku wektorów, powszechnie używana w zadaniach semantycznego dopasowania.
  • Dot Product – preferowany w przypadku, gdy embeddingi są nieznormalizowane lub trenowane z myślą o użyciu tego typu miary.
  • Euclidean Distance – może być mniej skuteczna w przestrzeniach o wysokiej wymiarowości, lecz bywa wykorzystywana w specyficznych przypadkach.
Miara podobieństwa Zalecane zastosowanie Plusy Minusy
Cosine Similarity Teksty znormalizowane semantycznie Skuteczna w wysokowymiarowych przestrzeniach Ignoruje różnice w długościach wektorów
Dot Product Embeddingi trenowane z funkcją punktową Bardzo szybka w obliczeniach Wrażliwa na skalę wektorów
Euclidean Distance Obszary embeddingów o małej gęstości Intuicyjna interpretacja Gorzej działa w wysokich wymiarach

Dobór liczby wyników (Top-K)

Parametr k w zapytaniach do bazy embeddingów określa, ile najbardziej podobnych fragmentów zostanie zwróconych. Wartość ta wpływa zarówno na jakość odpowiedzi, jak i na ich zwięzłość:

  • Niższe wartości k (np. 3–5) są szybsze i bardziej precyzyjne, ale mogą pominąć istotne konteksty.
  • Wyższe wartości k (np. 10–20) zwiększają szansę na trafienie właściwego kontekstu, ale mogą wprowadzić szum informacyjny.

Filtrowanie i ważenie wyników

Po zwróceniu podobnych fragmentów można wprowadzić dodatkowe techniki optymalizacyjne, takie jak:

  • Filtrowanie po metadanych – ograniczanie wyników do określonych źródeł lub tematów.
  • Dopasowanie kontekstowe – re-ranking wyników na podstawie podobieństwa do całej treści zapytania, a nie tylko embeddingu.
  • Dynamiczne ważenie – nadawanie większej wagi fragmentom dokumentów o wysokiej jakości lub aktualności.

Przykład re-rankingu wyników

from sentence_transformers import CrossEncoder

reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')

# query i retrieved_docs to odpowiednio: zapytanie i lista stringów
scores = reranker.predict([(query, doc) for doc in retrieved_docs])
top_docs = [doc for doc, score in sorted(zip(retrieved_docs, scores), key=lambda x: x[1], reverse=True)[:5]]

W powyższym przykładzie wykorzystano model re-rankujący do ponownego uporządkowania wyników na podstawie ich dopasowania semantycznego do zapytania użytkownika.

Podsumowanie

Optymalizacja wyszukiwania w systemach RAG wymaga świadomego doboru metryk, parametrów oraz technik wspomagających selekcję wyników. Dzięki temu mechanizm retrieval staje się bardziej precyzyjny, co bezpośrednio wpływa na jakość generowanych odpowiedzi.

Przykładowe skrypty i narzędzia wspomagające proces

Przygotowanie danych do systemu Retrieval-Augmented Generation (RAG) obejmuje kilka etapów, w których można wykorzystać szereg gotowych narzędzi oraz skryptów. W zależności od potrzeb projektu, dostępne są zarówno rozwiązania typu open source, jak i komercyjne, wspierające różne aspekty tego procesu — od czyszczenia danych po budowę wektorowej bazy wiedzy.

W środowisku Python popularnością cieszą się biblioteki takie jak LangChain, Haystack czy LlamaIndex, które dostarczają wysokopoziomowe interfejsy ułatwiające implementację pipeline'ów RAG. Umożliwiają one m.in. wczytywanie różnych formatów dokumentów, przetwarzanie językowe, generowanie embeddingów oraz integrację z wektorowymi bazami danych.

W zakresie generowania embeddingów i budowy bazy wiedzy najczęściej wykorzystywane są modele osadzeń takie jak sentence-transformers czy API dostarczane przez OpenAI i Cohere. Do przechowywania i przeszukiwania wektorów służą narzędzia takie jak FAISS, Pinecone, Weaviate czy Qdrant, które umożliwiają szybkie wyszukiwanie najbliższych sąsiadów w przestrzeni wektorowej.

Wiele projektów korzysta również z gotowych skryptów do dzielenia tekstu na fragmenty, wzbogacania ich o metadane czy optymalizacji parametrów wyszukiwania. Często są one dostępne jako część dokumentacji wspomnianych wyżej bibliotek lub udostępniane przez społeczność na platformach takich jak GitHub.

Dobór odpowiednich narzędzi zależy od konkretnego przypadku użycia, rodzaju danych źródłowych oraz wymagań dotyczących wydajności i skalowalności. Dzięki szerokiemu ekosystemowi dostępnych rozwiązań możliwe jest szybkie zbudowanie funkcjonalnego systemu RAG, dostosowanego do indywidualnych potrzeb użytkownika.

Dobre praktyki i najczęstsze błędy do uniknięcia

Systemy RAG (Retrieval-Augmented Generation) łączą możliwości dużych modeli językowych z wyszukiwaniem informacji w zewnętrznych zbiorach danych. Aby taki system działał efektywnie, kluczowe znaczenie ma jakość i sposób przygotowania danych. Poniżej zebraliśmy listę dobrych praktyk oraz typowych błędów, których warto unikać na etapie budowy i przygotowania zbioru wiedzy.

Dobre praktyki

  • Zadbaj o spójność źródeł danych: Przed rozpoczęciem procesu przetwarzania danych warto upewnić się, że pochodzą one z zaufanych, aktualnych i jednolitych źródeł. Mieszanie niespójnych formatów i jakości może obniżyć skuteczność wyszukiwania i generowania odpowiedzi.
  • Stosuj ustandaryzowane metadane: Dodanie metadanych, takich jak tytuł dokumentu, data publikacji czy kategoria tematyczna, ułatwia filtrowanie wyników i poprawia trafność odpowiedzi.
  • Regularnie aktualizuj bazę wiedzy: Systemy RAG korzystają ze statycznych baz dokumentów — ich jakość i aktualność bezpośrednio wpływają na trafność generowanych treści. Automatyzacja aktualizacji danych może znacząco zwiększyć skuteczność całego systemu.
  • Testuj na różnych zapytaniach: Przed wdrożeniem warto przeprowadzić testy jakości odpowiedzi na zestawie reprezentatywnych pytań, aby sprawdzić, czy dane są dobrze dobrane i odpowiednio przygotowane.

Najczęstsze błędy

  • Brak wstępnego oczyszczenia danych: Pozostawienie w treści zbędnych elementów (np. nagłówków technicznych, reklam, stopki stron) może zakłócać działanie modelu i obniżać jakość odpowiedzi.
  • Nieprawidłowe lub zbyt duże fragmenty tekstu: Dzielenie dokumentów na nieoptymalne fragmenty (np. zbyt długie lub nielogiczne) utrudnia trafne dopasowanie odpowiedzi i może prowadzić do pomijania istotnych informacji.
  • Pomijanie kontekstu przy tworzeniu embeddingów: Tworzenie embeddingów bez zachowania odpowiednich relacji między fragmentami może prowadzić do utraty znaczeń kontekstowych, co wpływa na skuteczność wyszukiwania.
  • Niedostosowanie danych do języka zapytań: Jeżeli dokumenty są w innym języku niż zapytania użytkowników, konieczne może być przetłumaczenie lub użycie wielojęzycznych modeli embeddingów. Brak takiego dostosowania obniża jakość wyników.
  • Przeciążenie systemu zbędnymi danymi: Dodawanie dużych ilości niskiej jakości lub zduplikowanych informacji prowadzi do spadku wydajności systemu i pogorszenia trafności odpowiedzi.

Przemyślane przygotowanie danych do systemu RAG to fundament jego skuteczności. Dbałość o jakość, strukturę i aktualność źródeł znacząco wpływa na końcowe rezultaty generowane przez model, dlatego warto poświęcić odpowiednio dużo uwagi każdemu etapowi tego procesu. W Cognity uczymy, jak skutecznie radzić sobie z podobnymi wyzwaniami – zarówno indywidualnie, jak i zespołowo.

icon

Formularz kontaktowyContact form

Imię *Name
NazwiskoSurname
Adres e-mail *E-mail address
Telefon *Phone number
UwagiComments