AI Engineering Academy · Lekcja

Dlaczego naiwne dzielenie na fragmenty pogarsza wyszukiwanie

Przeanalizuj rzeczywiste błędy wyszukiwania spowodowane niewłaściwym dzieleniem na fragmenty, w tym odpowiedzi podzielone na granicach fragmentów oraz utratę kontekstu nagłówków i tytułów sekcji.

Lekcja 1 z 413 kroki

Dlaczego naiwne dzielenie na fragmenty pogarsza wyszukiwanie to bezpłatna lekcja AI Engineering Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.

Koszt nieprawidłowego dzielenia na fragmenty

Dzielenie na fragmenty to proces dzielenia dokumentów na mniejsze części przed umieszczeniem ich w bazie wektorowej. Sposób podziału decyduje o tym, jaki kontekst będzie dostępny podczas wyszukiwania. Nieprawidłowe dzielenie na fragmenty jest jedną z najczęstszych i najbardziej znaczących przyczyn niepowodzeń systemów RAG.

Odpowiedzi podzielone na granicach fragmentów

Wyobraź sobie dokument zawierający zdanie: „Okres obowiązywania polityki zwrotów wynosi 30 dni od zakupu. Klienci muszą dołączyć oryginalny paragon.” Jeśli dzielnik o stałym rozmiarze przetnie tekst po słowie „zakupu.”, oba zdania trafią do różnych fragmentów. Zapytanie dotyczące polityki zwrotów może pobrać tylko pierwszą połowę, przez co model nie będzie w stanie wspomnieć o konieczności dołączenia paragonu.

Utrata kontekstu z nagłówków

Dokumenty często używają nagłówków sekcji, aby przekazywać znaczenie. Rozważ tabelę zatytułowaną „Ceny planów Enterprise”, po której następują wiersze z liczbami. Jeśli nagłówek i tabela trafią do różnych fragmentów, pobrany fragment tabeli będzie zawierał liczby bez etykiety — model nie będzie w stanie poprawnie odpowiedzieć na pytanie „Jaka jest cena Enterprise?”.

Problemy z dzieleniem na fragmenty o stałym rozmiarze

Dzielenie na fragmenty o stałym rozmiarze rozdziela tekst co N znaków lub tokenów, niezależnie od granic zdań. Jest szybkie i proste, ale często przecina tekst w środku zdania. Fragment kończący się na 'The model was trained on' oraz kolejny fragment zaczynający się od 'a dataset of 500 billion tokens' są osobno pozbawione znaczenia.

from langchain.text_splitter import CharacterTextSplitter

# Naive fixed-size: may break mid-sentence
splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=0)
chunks = splitter.split_text(document_text)
print(f'Created {len(chunks)} chunks')
print('First chunk:', chunks[0])

Nakładanie się fragmentów nie zawsze pomaga

Częstym rozwiązaniem jest dodanie nakładania się fragmentów — powtórzenie ostatnich N tokenów jednego fragmentu na początku następnego. Pomaga to w przypadku zdań podzielonych między fragmentami, ale wprowadza nadmiarowość i może dezorientować mechanizmy wyszukiwania, gdy pobrane zostaną dwa bardzo podobne fragmenty. Nakładanie się fragmentów to rozwiązanie tymczasowe, a nie lekarstwo na strukturalne problemy z dzieleniem.

# Overlap helps partially but adds redundancy
splitter = CharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50  # last 50 chars repeated in next chunk
)
chunks = splitter.split_text(document_text)

Pomiar wskaźnika niepowodzeń wyszukiwania

Możesz zmierzyć, jak często sposób dzielenia na fragmenty pogarsza wyszukiwanie, tworząc niewielki zestaw wzorcowy do oceny: listę pytań z ustalonymi poprawnymi fragmentami źródłowymi. Następnie sprawdź, jak często poprawny fragment znajduje się wśród k najlepszych pobranych fragmentów. Niski wskaźnik trafień często ujawnia problemy z dzieleniem na fragmenty, zanim w ogóle przeanalizujesz jakość generowania.

def hit_rate(queries_and_answers, retriever, k=5):
    hits = 0
    for query, expected_text in queries_and_answers:
        results = retriever.retrieve(query, k=k)
        retrieved_texts = [r.page_content for r in results]
        if any(expected_text in text for text in retrieved_texts):
            hits += 1
    return hits / len(queries_and_answers)

Problemy z kodem i danymi strukturalnymi

Pliki z kodem, JSON i tabele mają jednostki logiczne — funkcje, obiekty i wiersze tabel — których nie należy dzielić. Podzielenie definicji funkcji Pythona między dwa fragmenty sprawia, że żaden z nich nie jest samodzielnie zrozumiały. Mechanizm wyszukiwania, który znajdzie drugi fragment, zobaczy kod bez argumentów i bez kontekstu.

# Bad: splits code arbitrarily
bad_chunk_1 = 'def calculate_price(item, qty'  # incomplete!
bad_chunk_2 = ', discount):\n    return item.price * qty * (1 - discount)'

# Good: keep the full function together
good_chunk = 'def calculate_price(item, qty, discount):\n    return item.price * qty * (1 - discount)'

Długie dokumenty i utrata treści ze środka

Badania nad LLM-ami pokazują zjawisko „zagubienia w środku”: gdy wiele fragmentów zostanie pobranych i umieszczonych w promptcie, model zwraca uwagę na treści znajdujące się blisko początku i końca, ale ma tendencję do ignorowania środka. Nieprawidłowe dzielenie, które tworzy wiele małych fragmentów niskiej jakości, pogarsza ten problem, rozpraszając istotny sygnał.

Ręczne diagnozowanie nieprawidłowych fragmentów

Szybką metodą diagnostyczną jest wyświetlenie losowej próbki fragmentów i ich przeczytanie. Zadaj sobie pytanie: Czy ten fragment ma sens samodzielnie? Gdyby użytkownik zadał pytanie, czy model mógłby odpowiedzieć na nie na podstawie samego tego fragmentu? Fragmenty zawierające nieokreślone zaimki („On powiedział, że...”), niekompletny kod lub liczby pozbawione kontekstu są sygnałami ostrzegawczymi.

import random

def audit_chunks(chunks, sample_size=10):
    sample = random.sample(chunks, min(sample_size, len(chunks)))
    for i, chunk in enumerate(sample):
        print(f'--- Chunk {i+1} ({len(chunk)} chars) ---')
        print(chunk[:300])
        print()

Gdy rozmiar fragmentu jest zbyt duży

Bardzo duże fragmenty pogarszają precyzję wyszukiwania. Fragment o długości 2000 tokenów, dotyczący szerokiego tematu, może pasować do wielu zapytań, ale dostarczać LLM-owi zbyt dużo szumu. Model musi znaleźć igłę w stogu siana w obrębie tego fragmentu. Mniejsze, skoncentrowane fragmenty poprawiają precyzję kosztem potencjalnej utraty otaczającego kontekstu.

Strategie rozwiązujące te problemy

Lepsze alternatywy dla naiwnego dzielenia na fragmenty o stałym rozmiarze obejmują: dzielenie na granicach zdań, które nigdy nie przecina zdania w środku, dzielenie semantyczne, które rozdziela tekst na granicach tematów, dzielenie na fragmenty nadrzędne i podrzędne, zachowujące szerszy kontekst, oraz dzielenie uwzględniające strukturę dokumentu, które respektuje funkcje kodu, tagi HTML i nagłówki Markdown. Każda z kolejnych lekcji omawia jedną z tych metod.

Szybki test

Sprawdź swoją wiedzę na temat trybów niepowodzeń dzielenia na fragmenty omówionych w tej lekcji.

Podsumowanie lekcji

W tej lekcji nauczyłeś się, że: naiwne dzielenie na fragmenty o stałym rozmiarze narusza granice zdań i sekcji, nakładanie się fragmentów jest częściowym rozwiązaniem, ale wprowadza nadmiarowość oraz jakość fragmentów bezpośrednio decyduje o wskaźniku trafień wyszukiwania. Następnie zajmiemy się dzieleniem semantycznym, które rozdziela tekst na naturalnych granicach tematów, wykorzystując podobieństwo osadzeń.

Bezpłatny start

Ucz się Python dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
30
Lekcje
120

Często zadawane pytania

Czy lekcja „Dlaczego naiwne dzielenie na fragmenty pogarsza wyszukiwanie” jest bezpłatna?

Tak — pełny tekst „Dlaczego naiwne dzielenie na fragmenty pogarsza wyszukiwanie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Dlaczego naiwne dzielenie na fragmenty pogarsza wyszukiwanie”?

Przeanalizuj rzeczywiste błędy wyszukiwania spowodowane niewłaściwym dzieleniem na fragmenty, w tym odpowiedzi podzielone na granicach fragmentów oraz utratę kontekstu nagłówków i tytułów sekcji. Ćwiczysz AI Engineering Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Engineering Academy?

Nie wymagamy żadnego doświadczenia. AI Engineering Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Dlaczego naiwne dzielenie na fragmenty pogarsza wyszukiwanie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Engineering Academy?

Tak. Każda lekcja AI Engineering Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dlaczego naiwne dzielenie na fragmenty pogarsza wyszukiwanie
  2. Dzielenie semantyczne na podstawie podobieństwa embeddingów
  3. Wyszukiwanie nadrzędny–podrzędny i od małego do dużego
  4. Strategie dopasowane do dokumentów: kod i HTML
← Powrót do AI Engineering Academy