End-to-End RAG mit Chroma, FastAPI und Llama 3.2
Ein vollständig implementierter RAG-Assistent: PDF-Zerlegung, Cross-Encoder zur Neubewertung, Chroma, Llama 3.2 auf Ollama, FastAPI, Docker, pytest sowie GitHub Actions im CI.
Quellen: I Built a Production-Style RAG Knowledge Assistant with Python, ChromaDB, FastAPI, and Llama 3.2
Produktionsreifes RAG: Eingabe in das CI
Ein fundierter, mit Quellen belegter Wissensassistent – PDF-Eingabe, semantische Suche, Neuranking, lokale Llama-Generierung, FastAPI, Docker und GitHub Actions – konzipiert als Lernsystem statt als einfaches Notizbuch.
Nach einem ersten MCP-Experiment bestand das nächste Problem in der retrieval-augmented generation inklusive Bewertung und Verpackung, nicht wieder nur im „Hochladen von PDFs in Colab“.
Ziele
Dokumente in einen persistenten Vektorlagern indizieren; Antworten mit Zitaten abrufen, neu ranken und belegen; über HTTP bereitstellen; Qualität mit einfachen Bewertungen und pytest messen; in Container packen und mit dem CI verbinden, damit Regressionen deutlich sichtbar werden.
Architektur
Skizze der Indizierung:
Documents
↓
Chunking
↓
Embeddings
↓
Vector Database
↓
Semantic Retrieval
↓
Reranking
↓
LLM
↓
Grounded Answer + Sources
Path zum Laden von Dokumenten:
PDF Documents
↓
Document Loading
↓
Text Chunking
↓
Embeddings
↓
ChromaDB
Path für die Frage-Antwort-Verarbeitung:
User Question
↓
Semantic Retrieval
↓
Cross-Encoder Reranking
↓
Prompt Construction
↓
Llama 3.2
↓
Grounded Answer
↓
Source Citations
1. Eingabe
Laden Sie PDFs in LangChain-ähnliche Dokumente hoch und bewahren Sie dabei die Seitenmetadaten für spätere Zitate auf. Schlechte Lader verursachen später stille Fehler bei den Zitaten.
2. Chunking
Chunk size: 1000 characters
Chunk overlap: 200 characters
Durch Überschneidungen verschwinden Sätze, die an Grenzen liegen, beim Abrufen nicht. Behandeln Sie die Größen als Konfigurationseinstellungen und nicht als magische Zahlen, die in einer Notebook-Zelle versteckt sind.
3. Embeddings
sentence-transformers/all-MiniLM-L6-v2
Ein kleiner Sentence-Transformer sorgt dafür, dass die Demo auf einem Laptop lauffähig bleibt, und ist dennoch gut genug für englische technische Dokumente.
4. Chroma-Persistenz
Document
↓
Chunks
↓
Embedding Vectors
↓
ChromaDB
Die Chunks werden als Vektoren auf der Festplatte gespeichert, sodass ein Neustart kein vollständiges Neu-Embedding erzwingt. Versionieren Sie den Sammlungsnamen, wenn sich die Chunking-Strategie ändert.
5. Semantisches Abrufen
documents = vector_store.similarity_search(
query=query,
k=top_k
)
Nehmen Sie die top-k Nachbarn als ersten Schnittpunkt, bevor Rechenleistung für den Cross-Encoder verwendet wird.
6. Neuranking mit dem Cross-Encoder
cross-encoder/ms-marco-MiniLM-L-6-v2
User Question
↓
Vector Search
↓
Candidate Documents
↓
CrossEncoder
↓
Reranked Documents
Der Bi-Encoder-Recall zusammen mit der Präzision des Cross-Encoders stellt das standardmäßige zweistufige Muster für RAG-Anwendungen mit Qualitätsanforderungen dar.
7. Verknüpfung mit externen Daten
Durch die Erstellung von Prompts werden die gerankten Auszüge als nummerierte Quellen eingeführt:
[Source 1]
Retrieved document content...
[Source 2]
Retrieved document content...[Source 3]
Retrieved document content...
Weisen Sie das Modell an, ausschließlich aus diesen Blöcken zu antworten und diese zu zitieren. Lehnen Sie Anfragen ab, wenn der Kontext leer ist.
8. Lokaler Llama-Modell via Ollama
Durch die Generierung im eigenen System werden Privatsphäre und Kosten geschützt. Legen Sie den entsprechenden Tag in der Konfiguration fest und überprüfen Sie den Ollama-Prozess vor der Annahme von Anfragen.
9. Schnittstelle über FastAPI
GET /health
POST /query
Überwachung der Funktionsfähigkeit durch Probes; Abfrage des RAG-Pfades. Halten Sie den Service schlank – nutzen Sie denselben Pipeline wie die CLI.
Einführung zum vollständigen Abfragen-Fluss:
Question
↓
Semantic Retrieval
↓
Retrieved Chunks
↓
CrossEncoder Reranking
↓
Grounded Prompt
↓
Llama 3.2
↓
Answer + Citations
10. Bewertung
Questions evaluated: 5
Questions passed: 5
Keyword Match Rate: 100.00%
Hit Rate@K
Recall@K
MRR
Answer Relevance
Faithfulness
Citation Correctness
Schlüsselwortprüfungen sowie Abrufmetriken (Trefferquote, Recall, MRR, Relevanz der Antworten) erkennen stille Regressionen, wenn sich Embeddings oder Prompts ändern.
11. pytest
API health endpoint
Document chunking
Document retrieval
3 passed
Teste die Abdeckungsqualität, das Chunking sowie Smoke-Tests für den Abrufprozess, damit der CI-Prozess schnell fehlschlägt.
12. Lektion zu Docker
Überraschungen bezüglich der Bildgröße treten häufig auf, wenn Modelle in die Schichten eindringen:
1.36 GB
1.36 GB
2.56 KB
Berücksichtige Caches und virtualenvs ordnungsgemäß:
.venv/
__pycache__/
*.pyc
.pytest_cache/
.git/
.github/
.env
chroma_db/
data/sample/*.pdf
*.log
Ziehe es vor, Modellicaches zur Laufzeit zu mounten, damit die Neuerrichtung der Bilder klein bleibt.
13. GitHub Actions
Push / Pull Request
↓
GitHub Actions
↓
Checkout Repository
↓
Set Up Python
↓
Install Dependencies
↓
Run pytest
Push- und Pull-Request-Ausführungen sollten Lint-Tests, Unit-Tests sowie gegebenenfalls eine schlanke Evaluierungsarbeit mit Fixtures ausführen.
Stack, Schwierigkeitsgrad, nächste Schritte
Document Processing
↓
Chunking
↓
Embeddings
↓
Vector Storage
↓
Retrieval
↓
Reranking
↓
Prompt Construction
↓
LLM Generation
↓
Citation Handling
↓
Evaluation
↓
API
↓
Testing
↓
Deployment
Die schwierigen Aspekte betrafen weniger den Einsatz eines LLM, sondern eher Grenzen zwischen Datenblöcken, Latenz bei der Neubewertung, Formatierung von Zitaten sowie übermäßigen Speicherbedarf durch Docker-Schichten. Zukünftige Verbesserungen umfassen eine hybride Suchfunktion, einen größeren, beschrifteten Evaluationsdatensatz, Authentifizierung vor FastAPI sowie Überwachung der Abruflatenz.
Unter Produktionsbedingungen werden Bewertungen und Verpackungsprozesse zusammen mit den Notizbuchideen umgesetzt – das bedeutet jedoch nicht, dass ein einzelner Laptop ein gesamtes Plattformteam ersetzen kann.
Verfolgen Sie in der Konfiguration die Größe und das Überschneidungsniveau der Datenblöcke, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie in der Konfiguration die Größe und das Überschneidungsniveau der Datenblöcke, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie in der Konfiguration die Größe und das Überschneidungsniveau der Datenblöcke, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie in der Konfiguration die Größe und das Überschneidungsniveau der Datenblöcke, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie in der Konfiguration die Größe und das Überschneidungsniveau der Datenblöcke, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie die Größe der Blöcke sowie das Überschneidungsniveau in der Konfiguration, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie in der Konfiguration die Größe und das Überschneidungsniveau der Blöcke, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie in der Konfiguration die Größe und das Überschneidungsniveau der Blöcke, damit Experimente zwischen den Branchen vergleichbar bleiben.
Verfolgen Sie in der Konfiguration die Größe und das Überschneidungsniveau der Blöcke, damit Experimente zwischen den Branchen vergleichbar bleiben.