Skip to main content

Strategia dzielenia dokumentów (Chunking Strategies)

DLA AGENTÓW AIChatGPTClaude

Metodologia dekompozycji dużych dokumentów i baz kodu na samodzielne informacyjnie fragmenty (chunki) w celu generowania wektorowych osadzeń oraz precyzyjnego wyszukiwania w systemach RAG.

1. Przegląd koncepcji i problem systemowy

Modele embeddingów (np. text-embedding-3-large lub bge-m3) mają sztywno ograniczoną długość okna wejściowego (od 512 do 8192 tokenów). Nawet jeśli model technicznie jest w stanie przyjąć duży dokument PDF w całości, kompresuje on wszystkie informacje do pojedynczego wektora o stałym wymiarze (np. 1536 liczb).

Jeśli nie przeprowadzisz granularnego chunkingu:

  1. Uśrednianie semantyczne (Vector Dilution): Wektor dokumentu liczącego 50 stron staje się tak ogólny, że traci szczegóły dotyczące konkretnych funkcji czy konfiguracji.
  2. Brak możliwości precyzyjnego pobierania danych w RAG: System wyszukiwania wciągnie cały gigantyczny dokument do kontekstu generatywnej LLM, natychmiast wyczerpując budżet tokenów.
  3. „Zabójstwo” struktury przy naiwnym cięciu: Stały podział według liczby znaków (Character Splitting) rozrywa słowa na pół, oddziela nagłówek funkcji od jej implementacji i niszczy tabele.

Chunking to fundament inżynierii RAG: przekształca monolityczny surowy tekst w kolekcję informacyjnie autonomicznych, powiązanych ze sobą bloków znaczeniowych.

2. Taksonomia architektoniczna i model mentalny

W zależności od struktury danych wyróżnia się cztery poziomy architektoniczne chunkingu:

  • 1. Chunking o stałej wielkości z nakładaniem (Fixed-Size Sliding Window): Najprostsze podejście: tekst jest cięty na bloki po $N$ tokenów z nakładką wynoszącą $M$ tokenów. Szybkie, ale często narusza logiczne granice akapitów.
  • 2. Rekurencyjny chunking znakowy (Recursive Character Splitting): Podejście hierarchiczne (standard LangChain/LlamaIndex). Algorytm próbuje ciąć tekst najpierw według podwójnego znaku nowej linii (\n\n), jeśli fragment jest zbyt duży – według pojedynczego (\n), następnie według kropki (. ), a tylko w ostateczności według spacji.
  • 3. Chunking semantyczny (Semantic / Embedding-Distance Chunking): Tekst jest dzielony na pojedyncze zdania. Dla każdego generowany jest wektor, a następnie obliczana podobieństwo kosinusowe między sąsiednimi zdaniami. Granica chunka jest ustawiana w punktach gwałtownej zmiany semantyki (zmiana tematu rozmowy).
  • 4. Chunking składniowy AST/Markdown (Structural Chunking): Uwzględnia drzewo składniowe dokumentu: dzieli Markdown ściśle według poziomów nagłówków (#, ##, ###), zachowując ścieżkę nawigacyjną (breadcrumbs), a kod programistyczny – według węzłów klas i funkcji za pomocą Tree-sitter.

3. Pipeline techniczny i mechanika wewnętrzna

Pipeline profesjonalnego chunkingu składa się z 4 etapów:

  1. Document Ingestion & Pre-cleaning (Oczyszczanie): Usuwanie niewidocznych znaków specjalnych, ujednolicanie znaków nowej linii (\r\n -> \n) oraz normalizacja kodowania Unicode (NFC).
  2. Boundary Detection (Wykrywanie granic): Parser buduje drzewo składniowe (AST) lub znajduje bezpieczne punkty cięcia (separatory Markdown, puste linie między funkcjami).
  3. Window Formatting & Overlap Calculation (Cięcie i nakładanie): Tekst jest grupowany w bloki o rozmiarze 500–700 tokenów. Do początku każdego następnego chunka dodawany jest bufor nakładki (10–15%) z poprzedniego fragmentu.
  4. Metadata Enrichment & Context Injection (Wzbogacanie kontekstem): Do każdego chunka dodawany jest prefiks z metadanymi: [File: api/auth.ts | Class: AuthService | Method: validateToken] Gwarantuje to, że wektor fragmentu zostanie odnaleziony nawet przy zapytaniu, w którym nazwa metody nie występuje w jego ciele.

4. Praktyczne scenariusze inżynierskie w środowisku produkcyjnym

01. Indeksacja bazy kodowej repozytorium przez Tree-sitter

Każdy plik TypeScript jest parsowany do drzewa składniowego. Osobny chunk jest tworzony dla każdego eksportowanego interfejsu oraz każdej funkcji. Jeśli funkcja zajmuje 20 linii, staje się samodzielnym chunkiem wraz z komentarzem JSDoc i listą importowanych typów.

02. Przetwarzanie złożonych tabel i raportów finansowych

Zwykłe cięcie rozrywa wiersze tabeli, pozbawiając liczby sensu. Profesjonalny chunking konwertuje każdy wiersz tabeli na samodzielny tekst: „W 2024 roku przychód działu Cloud wyniósł $35B, co stanowi wzrost o 15% w porównaniu z rokiem 2023”, tworząc wektory o wysokiej precyzji wyszukiwania.

03. Parsowanie dokumentacji API (OpenAPI / Swagger)

Każdy endpoint (np. POST /v1/payments) jest wydzielany do osobnego chunka, zawierającego ścieżkę, metodę HTTP, opis parametrów, przykładową odpowiedź oraz kody błędów, co pozwala agentowi bezbłędnie generować kod klienta.

5. Pułapki, typowe błędy i bezpieczeństwo

  • Problem „wiszących zaimków” (Dangling Pronouns): Jeśli zdanie „Ta funkcja wymaga uprawnień administratora” trafiło do chunka 2, a sama nazwa funkcji pozostała w chunku 1, model nie będzie w stanie odpowiedzieć na zapytanie. Zawsze używaj metadanych z wzbogaceniem o kontekst nadrzędny (Parent Document Retrieval).
  • Rozrost bazy wektorowej przez nadmierne Overlap: Nakładka powyżej 25% prowadzi do duplikacji informacji w bazie danych, zwiększa koszt indeksacji i obciąża wyniki wyszukiwania identycznymi fragmentami.
  • Utrata kontekstu strukturalnego (Loss of Lineage): Chunk bez wskazania nazwy pliku i numeru linii zamienia się w bezimienny szum, utrudniając generowanie precyzyjnych przypisów w odpowiedziach agenta.
/ Najczęściej zadawane pytaniaSchema.org FAQPage

FAQ: Strategia dzielenia dokumentów (Chunking Strategies)

Małe chunki (100–300 tokenów) zapewniają bardzo precyzyjne wyszukiwanie wektorowe, ale mogą utracić kontekst całej myśli. Duże chunki (1000–2000 tokenów) zachowują pełny obraz, jednak ich osadzenia stają się „rozmyte”, przez co podobieństwo semantyczne do konkretnego, wąskiego zapytania spada. Złoty standard dla tekstów technicznych to 400–800 tokenów.
/ Linki wewnętrzne
Wszystkie hasła