RAG — Retrieval-Augmented Generation: Der komplette Guide
Wie Sie mit RAG Ihre KI-Anwendungen mit echtem Firmenwissen verbinden — Architektur, Implementierung und Best Practices aus der Praxis.
Harald Schwankl
Dipl.-Ing., Fullstack Developer & KI-Spezialist
Auf dieser Seite
Einleitung: Was ist RAG?
Retrieval-Augmented Generation — kurz RAG — ist eine der wirkungsvollsten Methoden, um Large Language Models (LLMs) mit aktuellem, unternehmensspezifischem Wissen zu verbinden. Das Prinzip ist elegant: Statt dem Sprachmodell alles waehrend des Trainings beibringen zu muessen, stellen wir ihm zur Laufzeit genau die Informationen bereit, die es fuer eine bestimmte Frage braucht.
Ich arbeite seit ueber zwei Jahren intensiv mit RAG-Systemen — von internen Wissensdatenbanken ueber Vertragsanalyse bis hin zur Kundensupport-Automatisierung. In diesem Guide teile ich mein gesamtes praktisches Wissen: Wie eine RAG-Pipeline aufgebaut ist, welche Entscheidungen an welcher Stelle wichtig sind und welche Fehler Sie vermeiden sollten.
Egal ob Sie einen KI-Assistenten fuer Ihr Unternehmen bauen, eine Dokumentensuche modernisieren oder verstehen moechten, wie RAG unter der Haube funktioniert — dieser Guide gibt Ihnen das noetige Fundament. Am Ende finden Sie einen Link zu unserer Live-RAG-Demo, in der Sie das Gelernte direkt ausprobieren koennen.
Das Problem: Warum LLMs allein nicht reichen
Large Language Models wie Mistral, GPT oder Claude sind beeindruckend — sie koennen Texte zusammenfassen, Code schreiben und komplexe Fragen beantworten. Doch sie haben drei fundamentale Schwaechen, die ihren Einsatz in Unternehmen ohne zusaetzliche Massnahmen riskant machen.
1. Halluzinationen LLMs generieren Text basierend auf statistischen Mustern. Wenn sie keine belastbare Information zu einem Thema haben, erfinden sie plausibel klingende Antworten. In einem geschaeftlichen Kontext — etwa bei rechtlichen Fragen, technischer Dokumentation oder Kundenkommunikation — kann das fatale Folgen haben. Ein Chatbot, der falsche Vertragsklauseln zitiert, ist schlimmer als gar kein Chatbot.
2. Veraltetes Wissen Das Wissen eines LLM ist auf den Zeitpunkt seines Trainings begrenzt. Ein Modell, das im Januar 2025 trainiert wurde, weiss nichts ueber Ereignisse im Maerz 2026. Fuer Unternehmen, deren Produkte, Preise und Richtlinien sich staendig aendern, ist das ein Ausschlusskriterium.
3. Kein Zugang zu Firmenwissen Kein oeffentlich verfuegbares LLM kennt Ihre internen Prozesse, Vertragsdokumente, Produktspezifikationen oder Kundendaten. Es ist schlicht nicht damit trainiert worden. Selbst wenn es koennte — Sie wollen Ihre vertraulichen Daten nicht in ein Trainingsdatensatz eines Drittanbieters einspeisen.
Die Loesung: RAG RAG loest alle drei Probleme gleichzeitig. Statt das Modell umzutrainieren, stellen wir ihm die richtigen Dokumente als Kontext bereit. Das Modell antwortet auf Basis von Fakten statt auf Basis von Mustern. Die Quellen sind nachvollziehbar, das Wissen ist aktuell, und vertrauliche Daten bleiben unter Ihrer Kontrolle.
Die RAG-Architektur im Detail
Eine RAG-Pipeline besteht aus zwei Phasen: der Indexierungsphase (einmalig pro Dokument) und der Abfragephase (bei jeder Nutzerfrage). Hier ist der vollstaendige Ablauf:
RAG-Pipeline — Gesamtarchitektur
INDEXIERUNGSPHASE (offline) ABFRAGEPHASE (pro Anfrage)
=========================== ============================
[Dokument] [Nutzerfrage]
| |
v v
1. Parsing 5. Query-Embedding
(PDF/MD/TXT -> Text) (Frage -> Vektor)
| |
v v
2. Chunking 6. Similarity Search
(Text -> Abschnitte) (Top-K aehnlichste Chunks)
| |
v v
3. Embedding 7. Context Assembly
(Chunks -> Vektoren) (Chunks + System Prompt)
| |
v v
4. Vector Store 8. LLM Generation
(pgvector/Supabase) (Antwort mit Quellenangaben)Phase 1: Indexierung
In der Indexierungsphase werden Ihre Dokumente vorbereitet und durchsuchbar gemacht. Zuerst werden sie geparst — das heisst, der reine Text wird aus PDFs, Markdown-Dateien oder anderen Formaten extrahiert. Dann wird der Text in kleinere Abschnitte (Chunks) unterteilt, typischerweise 500 bis 2000 Zeichen lang, mit Ueberlappungen um Kontextverlust an den Schnittgrenzen zu vermeiden.
Jeder Chunk wird anschliessend durch ein Embedding-Modell in einen hochdimensionalen Vektor umgewandelt — eine mathematische Repraesentation seiner Bedeutung. Diese Vektoren werden zusammen mit dem Originaltext in einer Vektordatenbank gespeichert.
Phase 2: Abfrage
Wenn ein Nutzer eine Frage stellt, durchlaeuft sie den gleichen Embedding-Prozess. Der resultierende Fragevektor wird mit allen gespeicherten Chunk-Vektoren verglichen. Die aehnlichsten Chunks — gemessen an der Cosine Similarity — werden als Kontext ausgewaehlt.
Dieser Kontext wird zusammen mit der Originalfrage und einem System Prompt an das LLM uebergeben. Das Modell generiert eine Antwort, die sich auf die bereitgestellten Fakten stuetzt, und verweist idealerweise auf die konkreten Quellen.
Das Ergebnis: praezise, belegbare Antworten auf Basis Ihrer eigenen Daten — ohne Halluzinationen, ohne veraltetes Wissen.
Document Ingestion & Chunking
Die Qualitaet Ihrer RAG-Antworten steht und faellt mit der Qualitaet des Chunking. Schlechte Chunks fuehren zu irrelevanten Retrieval-Ergebnissen, und das LLM kann auch aus schlechtem Kontext keine guten Antworten generieren.
Document Parsing
Der erste Schritt ist die Textextraktion. In unserer Implementierung unterstuetzen wir PDF, Markdown und Plaintext. PDF-Parsing ist dabei die groesste Herausforderung — Tabellen, mehrspaltige Layouts und eingescannte Dokumente erfordern spezielle Behandlung:
from PyPDF2 import PdfReader
import io
def parse_document(content: bytes, filename: str, content_type: str) -> str:
"""Extrahiert Text aus PDF, Markdown oder Plaintext."""
if content_type in ("text/plain", "text/markdown"):
return content.decode("utf-8", errors="replace")
if content_type == "application/pdf":
reader = PdfReader(io.BytesIO(content))
text_parts = []
for page in reader.pages:
text = page.extract_text()
if text:
text_parts.append(text)
return "\n\n".join(text_parts)
raise ValueError(f"Nicht unterstuetztes Format: {content_type}")Chunking-Strategien
Es gibt verschiedene Ansaetze, Text in Chunks zu unterteilen:
- Fixed-Size Chunking: Feste Zeichenanzahl, einfach aber kontextlos
- Paragraph-basiert: Splittet an Absatzgrenzen, respektiert natuerliche Textstruktur
- Semantic Chunking: Nutzt Embeddings um semantische Grenzen zu erkennen, aufwaendiger aber praeziser
- Recursive Character Splitting: Versucht an natuerlichen Grenzen zu splitten (Absaetze, Saetze, Woerter)
In der Praxis setze ich auf Paragraph-basiertes Chunking mit Sentence-Fallback — es bietet den besten Kompromiss zwischen Qualitaet und Einfachheit:
import re
def chunk_document(text: str, chunk_size: int = 2000, overlap: int = 200) -> list[str]:
"""Splittet Text in Chunks mit Overlap. Paragraph-basiert mit Sentence-Fallback."""
text = re.sub(r"\n{3,}", "\n\n", text).strip()
paragraphs = text.split("\n\n")
chunks: list[str] = []
current_chunk = ""
for paragraph in paragraphs:
paragraph = paragraph.strip()
if not paragraph:
continue
if len(current_chunk) + len(paragraph) + 2 <= chunk_size:
current_chunk += ("\n\n" if current_chunk else "") + paragraph
else:
if current_chunk:
chunks.append(current_chunk)
# Overlap: Ende des letzten Chunks als Start des naechsten
overlap_text = current_chunk[-overlap:]
current_chunk = overlap_text + "\n\n" + paragraph
else:
# Einzelner Absatz zu lang -> Satz-basierter Fallback
sentences = re.split(r"(?<=[.!?])\s+", paragraph)
for sentence in sentences:
if len(current_chunk) + len(sentence) + 1 <= chunk_size:
current_chunk += (" " if current_chunk else "") + sentence
else:
if current_chunk:
chunks.append(current_chunk)
current_chunk = sentence
if current_chunk:
chunks.append(current_chunk)
return chunksWarum Overlap wichtig ist: Ohne Ueberlappung kann es passieren, dass eine relevante Information genau an einer Chunk-Grenze zerschnitten wird. Mit 200 Zeichen Overlap stellen wir sicher, dass der Kontext erhalten bleibt. In unserer Implementierung verwenden wir 2000 Zeichen pro Chunk mit 200 Zeichen Overlap — das entspricht ungefaehr 500 Tokens pro Chunk, ein guter Wert fuer die meisten Anwendungsfaelle.
Embedding-Modelle: Das Herzstueck von RAG
Embeddings sind numerische Repraesentationen von Text in einem hochdimensionalen Vektorraum. Texte mit aehnlicher Bedeutung haben aehnliche Vektoren — das ist die Grundlage der semantischen Suche, die RAG so leistungsfaehig macht.
Was passiert beim Embedding?
Ein Embedding-Modell wandelt einen Text beliebiger Laenge in einen Vektor fester Dimension um. Der Satz "Wie kuendige ich meinen Vertrag?" und "Vertragskuendigung einreichen" liegen im Vektorraum nah beieinander, obwohl sie kaum Woerter teilen. Das ist der entscheidende Vorteil gegenueber klassischer Keyword-Suche.
Modellvergleich
| Modell | Dimensionen | Sprachen | Staerke |
|---|---|---|---|
| BGE-Gemma2 (Multilingual) | 1024 | 30+ | Mehrsprachig, stark bei DE/EN |
| OpenAI text-embedding-3-small | 1536 | 50+ | Gute Allround-Performance |
| OpenAI text-embedding-3-large | 3072 | 50+ | Hoechste Qualitaet, teuer |
| Cohere embed-v3 | 1024 | 100+ | Starke Multilingual-Performance |
| E5-Mistral-7B | 4096 | 30+ | Open Source, sehr praezise |
Unsere Wahl: BGE-Multilingual-Gemma2
Fuer schwankl.info setze ich auf das BGE-Multilingual-Gemma2-Modell ueber die Scaleway Inference API. Die Gruende:
- 1024 Dimensionen: Guter Kompromiss zwischen Qualitaet und Speicherbedarf
- Mehrsprachig: Hervorragende Performance bei Deutsch und Englisch — wichtig fuer unsere zweisprachige Plattform
- EU-Hosting: Scaleway betreibt die Inference-Server in Frankreich, DSGVO-konform
- Kosteneffizient: Deutlich guenstiger als OpenAI-Embeddings bei vergleichbarer Qualitaet
from openai import AsyncOpenAI
async def embed_text(text: str) -> list[float]:
"""Erzeugt einen 1024-dimensionalen Embedding-Vektor ueber Scaleway."""
client = AsyncOpenAI(
base_url="https://api.scaleway.ai/v1",
api_key=SCW_SECRET_KEY,
)
response = await client.embeddings.create(
model="bge-multilingual-gemma2",
input=text,
)
return response.data[0].embedding # list[float], Laenge 1024Wichtig bei Embeddings: Die gleiche Modell-Version muss fuer Indexierung und Abfrage verwendet werden. Wenn Sie das Embedding-Modell wechseln, muessen alle Dokumente neu indexiert werden — die Vektoren verschiedener Modelle sind nicht kompatibel.
Vektordatenbanken im Vergleich
Die Vektordatenbank speichert Ihre Embeddings und ermoelicht schnelle Aehnlichkeitssuchen. Die Wahl der richtigen Datenbank haengt von Ihrem Skalierungsbedarf, Budget und bestehender Infrastruktur ab.
Vergleichsuebersicht
| Kriterium | pgvector | Pinecone | Weaviate | Qdrant |
|---|---|---|---|---|
| Typ | PostgreSQL-Extension | Managed Service | Self-hosted / Cloud | Self-hosted / Cloud |
| Setup | Einfach (1 SQL) | Kein Setup noetig | Docker / Helm | Docker / Helm |
| Skalierung | Bis ~5M Vektoren | Unbegrenzt | Horizontal | Horizontal |
| Kosten | Kostenlos (OSS) | Ab $70/Monat | Kostenlos (OSS) | Kostenlos (OSS) |
| Filterung | SQL WHERE | Metadata Filter | GraphQL | Payload Filter |
| Besonderheit | In bestehender DB | Vollstaendig managed | Hybrid Search | Schnellster bei Latenz |
Unsere Wahl: pgvector + Supabase
Fuer schwankl.info nutze ich pgvector als PostgreSQL-Extension innerhalb von Supabase. Das hat mehrere Vorteile:
- Keine zusaetzliche Infrastruktur: Die Vektoren leben in derselben Datenbank wie alle anderen Daten — Nutzerdaten, Blog-Beitraege, Konfigurationen. Ein System weniger, das gewartet werden muss.
- SQL-basierte Filterung: Wir koennen Vektorsuche mit beliebigen SQL-Bedingungen kombinieren. Zum Beispiel: "Finde die aehnlichsten Chunks, aber nur aus Dokumenten mit Session-ID X und Status 'ready'."
- HNSW-Index: pgvector unterstuetzt den HNSW-Indextyp (Hierarchical Navigable Small World), der Suchen in Millisekunden ermoelicht — auch bei hunderttausenden Vektoren.
- Supabase RPC: Komplexe Vektorsuchen kapseln wir in PostgreSQL-Funktionen, die wir per RPC aufrufen:
CREATE FUNCTION match_document_chunks(
query_embedding vector(1024),
match_count INTEGER DEFAULT 5,
filter_session_id TEXT DEFAULT NULL
)
RETURNS TABLE (
id UUID, document_id UUID, chunk_text TEXT,
chunk_index INTEGER, metadata JSONB, similarity FLOAT
) AS $$
BEGIN
RETURN QUERY
SELECT dc.id, dc.document_id, dc.chunk_text,
dc.chunk_index, dc.metadata,
1 - (dc.embedding <=> query_embedding) AS similarity
FROM document_chunks dc
JOIN demo_documents dd ON dc.document_id = dd.id
WHERE dd.status = 'ready'
AND (filter_session_id IS NULL OR dd.session_id = filter_session_id)
ORDER BY dc.embedding <=> query_embedding
LIMIT match_count;
END;
$$ LANGUAGE plpgsql;Wann eine dedizierte Vektordatenbank sinnvoll ist: Wenn Sie mehr als 5 Millionen Vektoren haben, Sub-Millisekunden-Latenz brauchen oder komplexe Hybrid-Suche (Vektor + Volltext) benoetigen, lohnt sich der Blick auf Qdrant oder Weaviate. Fuer die meisten mittelstaendischen Anwendungsfaelle ist pgvector aber mehr als ausreichend.
Retrieval & Similarity Search
Das Retrieval ist der kritischste Schritt der RAG-Pipeline. Wenn die falschen Chunks abgerufen werden, kann auch das beste LLM keine gute Antwort generieren.
Cosine Similarity
Die Standardmetrik fuer Vektoraehnlichkeit ist die Cosine Similarity. Sie misst den Winkel zwischen zwei Vektoren im hochdimensionalen Raum:
- 1.0 = identische Bedeutung
- 0.0 = keine semantische Verbindung
- -1.0 = gegensaetzliche Bedeutung (in der Praxis selten)
In pgvector wird die Cosine Distance mit dem Operator <=> berechnet. Die Similarity ergibt sich als 1 - distance.
Top-K Retrieval
Wir rufen typischerweise die Top-5 aehnlichsten Chunks ab. Zu wenige Chunks bedeuten fehlender Kontext; zu viele verwirren das LLM mit irrelevanten Informationen und verbrauchen unnoetig Token.
async def retrieve_chunks(question: str, session_id: str, top_k: int = 5):
"""Vektorsuche: Frage embedden und aehnlichste Chunks finden."""
# Schritt 1: Frage in Vektor umwandeln
question_embedding = await embed_text(question)
# Schritt 2: Similarity Search via Supabase RPC
result = supabase.rpc("match_document_chunks", {
"query_embedding": question_embedding,
"match_count": top_k,
"filter_session_id": session_id,
}).execute()
return result.data # Top-K Chunks mit Similarity-ScoreReranking: Die zweite Stufe
Fuer hoehere Praezision kann nach dem initialen Retrieval ein Reranking-Schritt eingebaut werden. Dabei bewertet ein Cross-Encoder-Modell jedes (Frage, Chunk)-Paar einzeln — langsamer, aber deutlich praeziser als die reine Vektoraehnlichkeit.
Ein typisches Muster: Erst Top-20 per Vektorsuche abrufen, dann per Reranker auf Top-5 reduzieren. Das verbessert die Antwortqualitaet spuerbar, besonders bei ambigen Fragen.
Qualitaetsmetriken
- Recall@K: Wie viele relevante Chunks sind in den Top-K enthalten?
- MRR (Mean Reciprocal Rank): Auf welcher Position steht der erste relevante Chunk im Durchschnitt?
- Precision@K: Wie viele der Top-K Chunks sind tatsaechlich relevant?
In unserer Produktionsumgebung erreichen wir mit BGE-Gemma2 und pgvector eine Recall@5 von ueber 85% — das heisst, in 85% der Faelle enthaelt mindestens einer der Top-5 Chunks die relevante Information.
Generation mit Kontext
Der letzte Schritt der RAG-Pipeline ist die Antwortgenerierung. Hier wird der abgerufene Kontext zusammen mit der Nutzerfrage an das LLM uebergeben.
Context Assembly
Die Kunst liegt darin, den Kontext so aufzubereiten, dass das LLM ihn optimal nutzen kann. Wir nummerieren die Quellen, damit das Modell in seiner Antwort darauf verweisen kann:
def assemble_context(chunks: list[dict]) -> str:
"""Baut den Kontext-String mit nummerierten Quellen."""
parts = []
for i, chunk in enumerate(chunks):
parts.append(f"[Quelle {i + 1}]: {chunk['chunk_text']}")
return "\n\n".join(parts)System Prompt
Der System Prompt definiert das Verhalten des Modells. Fuer RAG sind klare Regeln entscheidend — das Modell soll NUR auf Basis des bereitgestellten Kontexts antworten:
RAG_SYSTEM_PROMPT = """Du bist ein Fachassistent, der Fragen basierend
auf bereitgestellten Dokumenten beantwortet.
Regeln:
- Beantworte Fragen NUR basierend auf dem bereitgestellten Kontext.
- Wenn der Kontext die Frage nicht beantwortet, sage das ehrlich.
- Zitiere die Quelle mit [Quelle X] am Ende relevanter Aussagen.
- Antworte praezise und informativ.
- Verwende Markdown-Formatierung."""LLM-Aufruf mit Streaming
In der Praxis verwende ich Streaming, damit der Nutzer die Antwort sofort Token fuer Token sieht — das fuehlt sich deutlich responsiver an als mehrere Sekunden auf eine vollstaendige Antwort zu warten:
async def generate_answer_stream(question: str, context: str):
"""Generiert eine RAG-Antwort als Stream via Scaleway Mistral."""
client = AsyncOpenAI(
base_url="https://api.scaleway.ai/v1",
api_key=SCW_SECRET_KEY,
)
stream = await client.chat.completions.create(
model="mistral-small-3.2-24b-instruct-2506",
messages=[
{"role": "system", "content": RAG_SYSTEM_PROMPT},
{"role": "user", "content": f"Kontext:\n{context}\n\nFrage: {question}"},
],
max_tokens=1000,
temperature=0.3, # Niedrig fuer faktenbasierte Antworten
stream=True,
)
async for chunk in stream:
token = chunk.choices[0].delta.content
if token:
yield tokenTemperatur-Einstellung: Fuer RAG-Anwendungen empfehle ich eine niedrige Temperatur (0.1—0.3). Das reduziert die Kreativitaet des Modells und sorgt dafuer, dass es sich staerker an den bereitgestellten Kontext haelt. Fuer kreative Aufgaben waere eine hoehere Temperatur sinnvoll, aber bei faktenbasierten Fragen wollen wir moeglichst praezise Antworten.
RAG vs. Fine-Tuning: Wann was?
Eine der haeufigsten Fragen, die ich von Kunden bekomme: "Sollen wir RAG machen oder das Modell fine-tunen?" Die Antwort ist fast immer: RAG zuerst. Aber es gibt Faelle, in denen Fine-Tuning die bessere Wahl ist.
Entscheidungsmatrix
| Kriterium | RAG | Fine-Tuning |
|---|---|---|
| Wissen aenderbar? | Ja, Dokumente austauschbar | Nein, erneutes Training noetig |
| Quellenangaben? | Ja, Chunks nachvollziehbar | Nein, Wissen "eingebrannt" |
| Kosten (Setup) | Gering (Pipeline + DB) | Hoch (GPU, Trainingsdaten) |
| Kosten (Betrieb) | Mittel (Embedding + LLM) | Gering (nur Inference) |
| Latenz | Hoeher (+Retrieval-Schritt) | Niedriger (direkte Antwort) |
| Datenvolumen | Beliebig gross | Begrenzt durch Trainingsbudget |
| Halluzinationsrisiko | Gering (Kontext vorhanden) | Mittel (Wissen kann verblassen) |
| Domainsprache | Gut (Kontext liefert Begriffe) | Sehr gut (Modell lernt Stil) |
- Ihr Wissen sich regelmaessig aendert (Produkte, Preise, Richtlinien)
- Nachvollziehbarkeit und Quellenangaben wichtig sind
- Sie verschiedene Dokumentensammlungen pro Nutzer/Kontext brauchen
- Sie schnell starten wollen, ohne wochenlang Trainingsdaten vorzubereiten
- Compliance erfordert, dass die KI ihre Quellen offenlegt
- Das Modell einen spezifischen Kommunikationsstil erlernen soll
- Antworten in einem festen Format generiert werden muessen
- Latenz kritisch ist und jede Millisekunde zaehlt
- Sie ein kleines Spezialmodell wollen, das eine Aufgabe exzellent beherrscht
Die Kombination: RAG + Fine-Tuning
In der Praxis kombiniere ich haeufig beides: Ein per Fine-Tuning optimiertes Modell, das den Kommunikationsstil des Unternehmens gelernt hat, wird mit RAG um aktuelles Wissen erweitert. So bekommt man das Beste aus beiden Welten — allerdings zum Preis hoeherer Komplexitaet.
Meine Empfehlung: Starten Sie immer mit RAG. Es ist schneller aufgesetzt, flexibler und liefert in den meisten Faellen ausreichend gute Ergebnisse. Fine-Tuning koennen Sie spaeter immer noch hinzufuegen.
Praxis: Unsere RAG-Implementierung auf schwankl.info
Auf schwankl.info betreibe ich eine vollstaendige RAG-Demo, die Sie als Besucher direkt im Browser ausprobieren koennen. Hier ist der Tech-Stack im Ueberblick:
- Frontend: Next.js 15, TypeScript — mit Streaming-Anzeige fuer die Antwortgenerierung
- Backend: FastAPI (Python 3.11), Gunicorn — asynchrone RAG-Pipeline mit SSE-Streaming
- Datenbank: Supabase PostgreSQL mit pgvector-Extension — Vektorspeicher und Metadaten in einer DB
- Embedding: Scaleway Inference API mit BGE-Multilingual-Gemma2 (1024 Dimensionen)
- LLM: Scaleway Inference API mit Mistral Small 3.2 24B Instruct
- Hosting: IONOS VPS in Deutschland, Docker-Container, Plesk/nginx Reverse Proxy
Der vollstaendige Flow
- Nutzer laedt ein Dokument hoch (PDF, Markdown oder Plaintext, max. 5 MB)
- FastAPI parsed das Dokument und extrahiert den Text
- Text wird in Chunks unterteilt (2000 Zeichen, 200 Zeichen Overlap)
- Jeder Chunk wird per Scaleway API in einen 1024-dimensionalen Vektor umgewandelt
- Chunks und Vektoren werden in Supabase (document_chunks-Tabelle) gespeichert
- Nutzer stellt eine Frage
- Frage wird embedded, Top-5 aehnlichste Chunks per pgvector-Suche abgerufen
- Chunks werden als Kontext zusammen mit der Frage an Mistral gesendet
- Antwort wird per SSE-Stream an das Frontend geliefert
- Quellen mit Similarity-Scores werden am Ende angezeigt
Datenschutz und Sicherheit
- Alle hochgeladenen Dokumente sind Session-gebunden und werden nach 24 Stunden automatisch geloescht
- PII (personenbezogene Daten) werden vor der Verarbeitung anonymisiert
- Alle KI-Inference laeuft ueber Scaleway in der EU (Frankreich)
- Keine Daten werden an US-Dienste uebermittelt
Haeufige Fehler und Best Practices
Nach dutzenden RAG-Implementierungen habe ich eine klare Liste von Dos und Don'ts zusammengestellt. Diese Lektionen koennen Ihnen Wochen an Debugging ersparen.
Fehler 1: Zu grosse Chunks Chunks mit 5000+ Zeichen enthalten zu viel irrelevante Information. Das LLM verliert den Fokus und die Antwort wird ungenau. Besser: 1000—2000 Zeichen, damit jeder Chunk eine klare, abgeschlossene Information enthaelt.
Fehler 2: Kein Overlap Ohne Ueberlappung zwischen Chunks gehen Informationen an den Schnittstellen verloren. Ein Satz, der genau an einer Chunk-Grenze durchgeschnitten wird, ist fuer das Retrieval unsichtbar. 10—15% Overlap (z.B. 200 Zeichen bei 2000-Zeichen-Chunks) ist ein guter Richtwert.
Fehler 3: Embedding-Modell wechseln ohne Neuindexierung Verschiedene Embedding-Modelle erzeugen inkompatible Vektoren. Wenn Sie das Modell wechseln, muessen Sie alle Dokumente neu embedden. Planen Sie das von Anfang an ein — mit einem Re-Indexierungs-Script und Versionierung der Embedding-Config.
Fehler 4: Zu viele oder zu wenige Chunks an das LLM senden Top-1 ist zu wenig (hohe Chance, den relevanten Chunk zu verpassen), Top-20 ist zu viel (das LLM verliert sich im Rauschen und das Context Window wird verschwendet). Top-3 bis Top-5 ist in den meisten Faellen optimal. Testen Sie mit Ihren echten Daten.
Fehler 5: System Prompt ohne klare Regeln Ohne explizite Anweisung "Antworte NUR basierend auf dem Kontext" wird das LLM sein Trainingswissen mit dem bereitgestellten Kontext vermischen — das fuehrt zu subtilen Halluzinationen, die schwer zu erkennen sind.
Best Practices im Ueberblick
- Messen Sie die Retrieval-Qualitaet mit realen Testfragen (Recall@K, MRR)
- Testen Sie verschiedene Chunk-Groessen mit Ihren spezifischen Dokumenten
- Implementieren Sie Monitoring fuer Antwortqualitaet und Nutzerzufriedenheit
- Verwenden Sie Metadata-Filterung um den Suchraum einzuschraenken (z.B. nach Dokumenttyp, Datum, Abteilung)
- Halten Sie den System Prompt simpel und spezifisch — jede Regel zaehlt
- Loggen Sie Fragen ohne relevante Chunks — das zeigt Ihnen, welche Dokumente fehlen
- Implementieren Sie eine Feedback-Schleife: Nutzer koennen Antworten als hilfreich/nicht hilfreich markieren
Fazit und naechste Schritte
RAG ist kein Hype, sondern eine erprobte Architektur, die LLMs von beeindruckenden Textgeneratoren zu zuverlaessigen Wissensassistenten macht. Mit der richtigen Pipeline — solides Chunking, gutes Embedding-Modell, performante Vektordatenbank und klarer System Prompt — koennen Sie KI-Anwendungen bauen, die echten Mehrwert fuer Ihr Unternehmen schaffen.
Die wichtigsten Takeaways aus diesem Guide:
- RAG loest die drei Kernprobleme von LLMs: Halluzinationen, veraltetes Wissen und fehlendes Firmenwissen
- Chunking-Qualitaet entscheidet ueber Antwortqualitaet: Investieren Sie Zeit in die richtige Chunk-Groesse und Overlap-Strategie
- Starten Sie einfach: pgvector + Supabase reicht fuer die meisten Anwendungsfaelle. Sie koennen spaeter skalieren.
- Messen Sie: Ohne Metriken wie Recall@K optimieren Sie blind. Bauen Sie ein Testset auf.
- RAG vor Fine-Tuning: In 90% der Faelle liefert RAG allein ausreichend gute Ergebnisse.
Probieren Sie es selbst aus
Auf unserer RAG-Demo koennen Sie Ihre eigenen Dokumente hochladen und Fragen stellen — direkt im Browser, ohne Anmeldung. Erleben Sie, wie RAG in der Praxis funktioniert.
Wenn Sie RAG fuer Ihr Unternehmen implementieren moechten — sei es ein interner Wissensassistent, eine intelligente Dokumentensuche oder ein Kundensupport-Bot — stehe ich Ihnen gerne zur Verfuegung. Lassen Sie uns in einem unverbindlichen Gespraech herausfinden, wie RAG Ihre Prozesse verbessern kann.
RAG in Aktion erleben
Probieren Sie unsere interaktive RAG-Demo aus — laden Sie Ihre Dokumente hoch und stellen Sie Fragen. Oder lassen Sie uns in einem persoenlichen Gespraech herausfinden, wie RAG Ihre Prozesse verbessern kann.