Einführung in RAG und die CRAG-Architektur

Was ist RAG?

In der heutigen digitalen Landschaft, in der Informationen explosionsartig zunehmen, stehen wir oft vor der Herausforderung, präzise und kontextbezogene Antworten auf unsere Fragen zu erhalten. Herkömmliche generative KI-Modelle, wie große Sprachmodelle (LLMs), sind zwar beeindruckend in ihrer Fähigkeit, kohärente Texte zu erzeugen, doch sie haben oft Schwierigkeiten, auf spezifische oder aktuelle Informationen zuzugreifen, die nicht in ihren Trainingsdaten enthalten waren. Genau hier kommt Retrieval Augmented Generation (RAG) ins Spiel.

RAG ist ein leistungsstarkes Framework, das die Stärken von Informationsabruf (Retrieval) und Textgenerierung kombiniert. Im Wesentlichen funktioniert RAG, indem es vor der Generierung einer Antwort relevante Informationen aus einer Wissensdatenbank abruft. Diese abgerufenen Informationen werden dann dem generativen Modell als Kontext bereitgestellt, sodass es präzisere, fundiertere und aktuellere Antworten liefern kann. Dies reduziert die Wahrscheinlichkeit von "Halluzinationen" (generierten falschen Informationen) und verbessert die Relevanz der Ausgabe erheblich.

Übersicht über CRAG: Die Architektur deines Systems

Dein Conversational Retrieval Augmented Generation (CRAG)-System ist modular aufgebaut und darauf ausgelegt, flexibel und skalierbar zu sein. Es nutzt Docker und Docker Compose, um die einzelnen Komponenten in isolierten Containern zu betreiben, was die Entwicklung, Bereitstellung und Wartung erheblich vereinfacht.

Die Hauptkomponenten deines CRAG-Systems umfassen:

  • Frontend (Benutzeroberfläche): Dies ist die Schnittstelle, mit der du und andere Benutzer interagieren. Es handelt sich um eine schlanke, webbasierte Anwendung (HTML/JavaScript), die Benutzeranfragen entgegennimmt und die generierten Antworten anzeigt. Der Zugriff erfolgt über einen Nginx-Webserver, der auch als Reverse-Proxy für das Backend dient.

  • Backend (API-Logik): Das Herzstück des Systems. Eine FastAPI-Anwendung in Python, die für die Verarbeitung der Benutzeranfragen zuständig ist. Das Backend orchestriert den gesamten RAG-Prozess: Es nimmt die Anfragen vom Frontend entgegen, ruft relevante Dokumente aus der Wissensdatenbank ab und übergibt diese zusammen mit der Benutzerfrage an ein großes Sprachmodell (LLM) zur Generierung einer Antwort.

  • Datenvorverarbeitung (Ingestion-Pipeline): Ein separater Dienst, der für das Einlesen, Parsen und Vorbereiten von Quelldokumenten (z.B. PDFs) zuständig ist. Dieser Dienst extrahiert Text, zerlegt ihn in kleinere Abschnitte (Chunks), generiert Vektor-Embeddings für diese Chunks und indiziert sie anschließend in der Wissensdatenbank.

  • OpenSearch (Speicherung und Suche von Dokumenten und Vektoren): Dies ist die zentrale Datenbank für deine Wissensdatenbank.

    • OpenSearch: Eine Open-Source-Such- und Analyse-Engine, die auf Elasticsearch basiert. Du nutzt sie zur Speicherung der Textchunks und zur Durchführung von Keyword-basierten sowie Vektor-basierten Ähnlichkeitssuchen. OpenSearch wird also deine einzige Datenbank für beide Sucharten sein.
  • Zusätzliche Dienste:

    • MinIO: Ein Open-Source-Objektspeicherdienst, der mit S3-Kompatibilität arbeitet. Du verwendest ihn, um die Rohdokumente (z.B. PDFs deines Kafka-Buches) zu speichern, bevor sie verarbeitet werden.

Vorteile der modularen und containerisierten Architektur:

Die Wahl einer modularen und containerisierten Architektur mit Docker und Docker Compose bietet dir mehrere entscheidende Vorteile:

  1. Isolierung: Jede Komponente läuft in ihrem eigenen Container, was Konflikte zwischen Abhängigkeiten vermeidet und die Stabilität des Gesamtsystems erhöht.

  2. Portabilität: Die gesamte Anwendung kann auf jeder Plattform ausgeführt werden, die Docker unterstützt, unabhängig vom darunterliegenden Betriebssystem.

  3. Skalierbarkeit: Einzelne Dienste können bei Bedarf unabhängig voneinander skaliert werden, um höhere Lasten zu bewältigen.

  4. Einfache Entwicklung: Du kannst dich auf die Implementierung einer Komponente konzentrieren, ohne dich um die Konfiguration anderer Dienste kümmern zu müssen.

  5. Vereinfachte Bereitstellung: Docker Compose ermöglicht die Definition und den Start aller Dienste mit einem einzigen Befehl, was die Bereitstellung erheblich beschleunigt und vereinfacht.

Einführung in RAG und die CRAG-Architektur - Evangelos Dimitriadis