RAG und Wissenssysteme

Retrieval Augmented Generation (RAG) verbindet die Sprachfähigkeiten von LLMs mit deinen eigenen Daten. Statt das Modell mit allem Wissen zu füttern, werden relevante Dokumente zur Laufzeit abgerufen und als Kontext bereitgestellt. Das Ergebnis: aktuelle, nachvollziehbare Antworten mit Quellenangaben.

Wie funktioniert RAG?

RAG besteht aus zwei Hauptphasen: Indexierung und Abfrage. In der Indexierungsphase werden Dokumente geladen, in Abschnitte (Chunks) zerlegt und als Vektoren in einer Datenbank gespeichert. Bei einer Abfrage wird die Nutzerfrage ebenfalls in einen Vektor umgewandelt, ähnliche Chunks werden abgerufen und dem LLM als Kontext mitgegeben.

Der Vorteil gegenüber Fine-Tuning: RAG-Systeme können aktualisiert werden, ohne das Modell neu zu trainieren. Neue Dokumente werden einfach in den Index aufgenommen. Zudem sind die Quellen nachvollziehbar.

Die RAG-Pipeline im Detail

1. Indexierung

  • Document LoadingPDFs, Word, HTML, Markdown, Datenbanken – verschiedene Quellen anbinden.
  • ChunkingDokumente in sinnvolle Abschnitte zerlegen (z.B. 500-1000 Tokens mit Overlap).
  • EmbeddingChunks werden in Vektoren umgewandelt, die semantische Bedeutung codieren.
  • SpeicherungVektoren in einer Datenbank ablegen: ChromaDB, Pinecone, Weaviate, Qdrant.

2. Abfrage

  • Query EmbeddingDie Nutzerfrage wird in denselben Vektorraum umgewandelt.
  • Similarity SearchDie ähnlichsten Chunks werden per Vektorsuche abgerufen (top_k).
  • RerankingOptional: Ergebnisse werden mit einem Reranker-Modell nachsortiert.
  • GenerationDas LLM erhält Frage + Kontext und generiert eine Antwort mit Zitaten.

Beispiel: Einfache RAG-Pipeline in Python

from langchain_community.document_loaders import DirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings, ChatOpenAI   # 1. Dokumente laden und chunken loader = DirectoryLoader("./dokumente", glob="**/*.pdf") docs = loader.load() splitter = RecursiveCharacterTextSplitter( chunk_size=800, chunk_overlap=120 ) chunks = splitter.split_documents(docs)   # 2. Embeddings erstellen und speichern vectorstore = Chroma.from_documents( chunks, OpenAIEmbeddings(), persist_directory="./chroma_db" )   # 3. Retrieval und Antwort retriever = vectorstore.as_retriever(search_kwargs={"k": 5}) relevant = retriever.invoke("Wie lautet die Kündigungsfrist?")   llm = ChatOpenAI(model="gpt-4", temperature=0.1) answer = llm.invoke( format_prompt(query, relevant) )

Best Practices für RAG

  • Chunking-Strategie testen: Die optimale Chunk-Größe hängt vom Dokumenttyp ab. Zu große Chunks verwässern, zu kleine verlieren Kontext.
  • Hybrides Retrieval nutzen: Kombiniere Vektorsuche mit Keyword-Suche (BM25) für bessere Ergebnisse.
  • Metadata mitgeben: Speichere Dateiname, Seitenzahl, Datum – das ermöglicht Filterung und Zitationen.
  • Reranking einsetzen: Ein zweiter Durchgang mit einem Cross-Encoder verbessert die Relevanz deutlich.
  • Kontext begrenzen: Nicht alle abgerufenen Chunks müssen ins Prompt. Weniger, aber relevanterer Kontext ist oft besser.

Passende Weiterbildung

Python für Data Science & Machine Learning

RAG-Pipelines werden primär in Python gebaut. Dieser Kurs schafft die Grundlage für Datenverarbeitung und ML-Integration.

Kurs ansehen *

Datenbankentwickler/in für Access & SQL

Wer RAG-Systeme baut, arbeitet intensiv mit Daten. SQL-Kenntnisse helfen bei der Datenaufbereitung und Metadatenverwaltung.

Kurs ansehen *