Startseite / Artikel

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.

Verlag: REACTAPP.TOP8 Min. Lesezeit1747 Wörter

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.