Indeksowanie zbioru dokumentów
Utwórz embedding każdego fragmentu i zapisz wektory w indeksie — to etap przygotowania offline każdego systemu RAG.
Indeksowanie zbioru dokumentów to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 3 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 Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.
Potok ingestii
Proces RAG wykonywany offline składa się z czterech etapów:
- Wczytaj dokumenty (PDF, HTML, MD)
- Podziel na fragmenty każdy dokument
- Utwórz osadzenia dla każdego fragmentu
- Zapisz wektory i metadane w indeksie
Krok 1: Wczytaj dokumenty
Używaj wyspecjalizowanych loaderów dla różnych formatów:
# PDFs
from pypdf import PdfReader
text = ''
for page in PdfReader('doc.pdf').pages:
text += page.extract_text()
# HTML
from bs4 import BeautifulSoup
text = BeautifulSoup(html, 'html.parser').get_text()
# Markdown — just read the file
text = open('doc.md').read()Krok 2: Podziel na fragmenty
Użyj splittera z poprzedniej lekcji:
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
chunks = splitter.split_text(text)Krok 3: Twórz osadzenia partiami
Twórz osadzenia dla wielu fragmentów w jednym wywołaniu API:
from openai import OpenAI
client = OpenAI()
def embed_batch(texts, batch_size=100):
vectors = []
for i in range(0, len(texts), batch_size):
batch = texts[i:i + batch_size]
resp = client.embeddings.create(model='text-embedding-3-small', input=batch)
vectors.extend(d.embedding for d in resp.data)
return vectorsKrok 4: Zapisz
Dla 10–50 tys. fragmentów wystarczy FAISS lub Chroma:
import chromadb
client = chromadb.Client()
collection = client.create_collection('docs')
collection.add(
ids=[f'doc-{i}' for i in range(len(chunks))],
embeddings=vectors,
documents=chunks,
metadatas=[{'source': 'doc.pdf', 'page': i} for i in range(len(chunks))]
)Idempotentna ingestia
Zadbaj o bezpieczne ponowne uruchamianie ingestii. Używaj deterministycznych identyfikatorów (haszy treści), aby ponowne uruchomienie nie powodowało duplikatów:
import hashlib
def chunk_id(source, text):
h = hashlib.sha256(text.encode()).hexdigest()[:16]
return f'{source}:{h}'
print(chunk_id('handbook.pdf', 'Employees get 20 vacation days per year.'))
print(chunk_id('handbook.pdf', 'Employees get 20 vacation days per year.'))
Aktualizacje przyrostowe
Gdy dokument się zmieni:
- Oblicz nowe fragmenty
- Porównaj je z istniejącymi identyfikatorami
- Usuń usunięte, dodaj nowe, pozostaw niezmienione
Naiwne podejście (usunięcie wszystkich danych i ponowne wstawienie) sprawdza się w przypadku małych korpusów, ale marnuje wywołania API do tworzenia osadzeń.
Metadane do filtrowania
Uwzględnij każde pole, według którego możesz chcieć filtrować w przyszłości:
metadata = {
'source': '/docs/handbook.pdf',
'page': 42,
'department': 'engineering',
'updated_at': '2024-08-12',
'access_level': 'internal'
}
for k, v in metadata.items():
print(f"{k}: {v}")
Postęp i punkty kontrolne
W przypadku dużych procesów ingestii rejestruj postęp i twórz punkty kontrolne:
for i, batch in enumerate(batches):
embed_and_store(batch)
if i % 10 == 0:
save_checkpoint(i)
print(f'Processed {i * 100} chunks')Limity szybkości
Limity szybkości dla osadzeń OpenAI są wysokie, ale istnieją. Używaj semaforów lub ponawiania prób za pomocą `tenacity`:
from asyncio import Semaphore
sem = Semaphore(10) # 10 concurrent embed calls max
async def safe_embed(batch):
async with sem:
return await client.embeddings.create(...)Kontrola poprawności indeksu
Po ingestii wykonaj kilka testowych zapytań i ręcznie sprawdź wyniki. Jeśli nie pojawia się nic istotnego, podział na fragmenty lub tworzenie osadzeń nie działa poprawnie — wykryj problem, zanim zrobią to użytkownicy.
Wersjonowanie indeksu
Wersjonuj indeks, aby móc przełączyć się na nowy sposób dzielenia na fragmenty lub nowy model osadzeń bez przestoju:
collection = client.create_collection(f'docs-v2-{date.today()}')
# old collection stays live until new one is validatedIdempotentne identyfikatory
Dlaczego używać hashy treści jako identyfikatorów fragmentów?
Podsumowanie
Wczytaj → podziel na fragmenty → utwórz osadzenia → zapisz, używając idempotentnych identyfikatorów i metadanych. Indeks jest fundamentem każdego kolejnego etapu wyszukiwania.
Często zadawane pytania
Czy lekcja „Indeksowanie zbioru dokumentów” jest bezpłatna?
Tak — pełny tekst „Indeksowanie zbioru dokumentów” 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 Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.
Co nauczysz się w „Indeksowanie zbioru dokumentów”?
Utwórz embedding każdego fragmentu i zapisz wektory w indeksie — to etap przygotowania offline każdego systemu RAG. Ćwiczysz AI Agents 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 Agents?
Nie wymagamy żadnego doświadczenia. AI Agents 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 3 z 4.
Ile czasu zajmuje lekcja „Indeksowanie zbioru dokumentów”?
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 Agents?
Tak. Każda lekcja AI Agents 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
- Co rozwiązuje RAG (odcięcie wiedzy, halucynacje)
- Strategie dzielenia na fragmenty (stałe, zdaniowe, semantyczne)
- Indeksowanie zbioru dokumentów
- Budowanie prostego RAG z FAISS lub Chroma