RAG od początku do końca z Chroma, FastAPI i Llama 3.2
Kompletny asystent RAG oparty na rzeczywistości: dzielenie plików PDF na fragmenty, ponowna klasyfikacja za pomocą cross-encodera, Chroma, Llama 3.2 w Ollama, FastAPI, Docker, pytest oraz GitHub Actions w procesie CI.
Źródła: I Built a Production-Style RAG Knowledge Assistant with Python, ChromaDB, FastAPI, and Llama 3.2
RAG w formacie produkcyjnym: integracja z CI
Askontaktowany z rzeczywistością asystent wiedzy z odniesieniami do źródeł — import PDF, wyszukiwanie semantyczne, ponowna klasyfikacja, lokalna generacja za pomocą Llamy, FastAPI, Docker i GitHub Actions — zaprojektowany jako system uczenia się, a nie zwykły notatnik do eksperymentów.
Po pierwszym eksperymencie z MCP następną lukią była generacja wzbogacona o dane wyświetlane wraz z oceną i pakowaniem, a nie kolejna opcja „przeładowania PDF w Colab”.
Cele
Indeksowanie dokumentów w trwałym magazynie wektorowym; wyświetlanie, ponowna klasyfikacja oraz udzielanie odpowiedzi z odniesieniami do źródeł; dostarczanie treści przez HTTP; mierzenie jakości za pomocą prostych narzędzi oceny i pytest; konteneryzacja oraz połączenie z CI, aby regresje były łatwo wykrywalne.
Architektura
Szkic procesu indeksowania:
Documents
↓
Chunking
↓
Embeddings
↓
Vector Database
↓
Semantic Retrieval
↓
Reranking
↓
LLM
↓
Grounded Answer + Sources
Ścieżka ładowania dokumentów:
PDF Documents
↓
Document Loading
↓
Text Chunking
↓
Embeddings
↓
ChromaDB
Ścieżka odpowiadania na pytania:
User Question
↓
Semantic Retrieval
↓
Cross-Encoder Reranking
↓
Prompt Construction
↓
Llama 3.2
↓
Grounded Answer
↓
Source Citations
1. Integracja danych
Ładuj PDF-y do dokumentów w stylu LangChain, zachowując metadane stron dla późniejszych cytatów. Złe narzędzia ładowania powodują później ukryte błędy w cytowaniu.
2. Dzielenie na fragmenty
Chunk size: 1000 characters
Chunk overlap: 200 characters
Nadpakietowanie zapobiega znikaniu zdań znajdujących się na granicach fragmentów podczas wyświetlania danych. Utraktuj rozmiary jako parametry konfiguracyjne, a nie magiczne liczby ukryte w komórce notatnika.
3. Embeddingi
sentence-transformers/all-MiniLM-L6-v2
Niewielki model sentence-transformer umożliwia uruchomienie demonstracji na laptopie, jednocześnie pozostając wystarczająco dobrym do obsługi angielskich dokumentów technicznych.
4. Trwałość danych Chroma
Document
↓
Chunks
↓
Embedding Vectors
↓
ChromaDB
Fragmenty są zapisywane jako wektory na dysku, dzięki czemu ponowne uruchomienie nie wymusza całkowitego ponownego generowania embeddingów. Zmień nazwę kolekcji, gdy zmieni się strategia dzielenia na fragmenty.
5. Semantyczne wyszukiwanie
documents = vector_store.similarity_search(
query=query,
k=top_k
)
Użyj najbliższych k sąsiadów jako pierwszego etapu filtrowania, zanim wykorzystasz zasoby procesora do cross-encodera.
6. Ponowne sortowanie za pomocą cross-encodera
cross-encoder/ms-marco-MiniLM-L-6-v2
User Question
↓
Vector Search
↓
Candidate Documents
↓
CrossEncoder
↓
Reranked Documents
Recall w bi-encoderze w połączeniu z precyzją cross-encodera stanowi standardową dwuetapową metodę dla systemów RAG wrażliwych na jakość.
7. Ugruntowanie LLM
Konstrukcja promptu polega na włączaniu uszeregowanych fragmentów jako źródeł o numerach:
[Source 1]
Retrieved document content...
[Source 2]
Retrieved document content...[Source 3]
Retrieved document content...
Poinstruuj model, aby odpowiadał wyłącznie na podstawie tych bloków i cytował je. Odrzuć zapytanie, gdy kontekst jest pusty.
8. Lokalny Llama za pomocą Ollamy
Generowanie odbywa się bezpośrednio w systemie dla ochrony prywatności i obniżenia kosztów. Ustal tag w konfiguracji i sprawdź proces Ollamy przed przyjmowaniem ruchu.
9>Interfejs FastAPI
GET /health
POST /query
Sprawdzanie stanu poprzez sondy; zapytanie do ścieżki RAG. Zachowaj prostotę usługi — użyj tego samego procesu, co w interfejsie CLI.
Przypomnienie pełnego procesu zapytania:
Question
↓
Semantic Retrieval
↓
Retrieved Chunks
↓
CrossEncoder Reranking
↓
Grounded Prompt
↓
Llama 3.2
↓
Answer + Citations
10. Ocena
Questions evaluated: 5
Questions passed: 5
Keyword Match Rate: 100.00%
Hit Rate@K
Recall@K
MRR
Answer Relevance
Faithfulness
Citation Correctness
Kontrole słów kluczowych w połączeniu z metrykami wyszukiwania (wskaźnik trafień,召回率, MRR, relewność odpowiedzi) pomagają wykryć ukryte regresje, gdy zmieniają się embeddingi lub prompty.
11. pytest
API health endpoint
Document chunking
Document retrieval
3 passed
Testy sprawdzające stan pokrycia, dzielenie na fragmenty oraz funkcjonowanie wyszukiwania zapewniają szybkie wykrywanie błędów w procesie CI.
12. Lekcja o Dockerze
Częste są niespodzianki związane z rozmiarem obrazów, gdy modele trafiają do poszczególnych warstw:
1.36 GB
1.36 GB
2.56 KB
Należy prawidłowo ignorować cache’y i środowiska virtualenv:
.venv/
__pycache__/
*.pyc
.pytest_cache/
.git/
.github/
.env
chroma_db/
data/sample/*.pdf
*.log
Lepiej montować cache’y modeli w czasie wykonywania, aby ich rozmiar pozostawał niewielki.
13. GitHub Actions
Push / Pull Request
↓
GitHub Actions
↓
Checkout Repository
↓
Set Up Python
↓
Install Dependencies
↓
Run pytest
Zapytania push i pull request powinny uruchamiać narzędzia do sprawdzania formatowania, testy jednostkowe oraz opcjonalnie prosty proces oceny z użyciem fixitów.
Stack, poziom trudności, kolejne kroki
Document Processing
↓
Chunking
↓
Embeddings
↓
Vector Storage
↓
Retrieval
↓
Reranking
↓
Prompt Construction
↓
LLM Generation
↓
Citation Handling
↓
Evaluation
↓
API
↓
Testing
↓
Deployment
Trudne problemy dotyczyły raczej granic fragmentów, opóźnień w ponownym rankowaniu, formatowania cytatów oraz nadmiernego rozmiaru warstw Docker niż konieczności korzystania z LLM. Kolejne ulepszenia to: wyszukiwanie hybrydowe, większy zbiór danych do oceny z etykietami, autoryzacja przed FastAPI oraz możliwości monitorowania opóźnień przy pobieraniu danych.
Podejście typu produkcyjnego oznacza, że procesy oceny i pakowania odbywają się wraz z pomysłami zawartymi w notatniku — nie oznacza to jednak, że jeden laptop może zastąpić zespół odpowiedzialny za platformę.
Należy odnotowywać rozmiar i stopień nakładania się fragmentów w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Należy odnotowywać rozmiar i stopień nakładania się fragmentów w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Należy odnotowywać rozmiar i stopień nakładania się fragmentów w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Należy odnotowywać rozmiar i stopień nakładania się fragmentów w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Należy odnotowywać rozmiar i stopień nakładania się fragmentów w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się kawałków w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się kawałków, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się kawałków, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się kawałków, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się kawałków, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się kawałków, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się kawałków, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się kawałków, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się kawałków, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się kawałków, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Niech w konfiguracji jest określony rozmiar i stopień nakładania się fragmentów, aby eksperymenty były porównywalne pomiędzy różnymi gałęziami.
Natychmiast śledź rozmiar i stopień nakładania się fragmentów w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi wersjami.
Natychmiast śledź rozmiar i stopień nakładania się fragmentów w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi wersjami.
Natychmiast śledź rozmiar i stopień nakładania się fragmentów w konfiguracji, aby eksperymenty były porównywalne pomiędzy różnymi wersjami.