FortgeschrittenLesezeit 8 Min.·

Baue mit RAG ein Q&A-System für deine Wissensbasis

LLMs kennen dein privates, aktuelles Material nicht und neigen zu Halluzinationen. RAG (Retrieval-Augmented Generation) lässt das Modell auf Basis einer verlässlichen Wissensbasis antworten – nach dem Prinzip „erst abrufen, dann generieren“. Einer der praxistauglichsten Produktionsansätze heute.

VonAI Resource Hub

Warum RAG nötig ist

Wissen per Fine-Tuning direkt ins Modell zu bringen ist teuer und langsam zu aktualisieren. RAG hält das Wissen in einer externen Datenbank und ruft bei Bedarf die passenden Abschnitte ab, um sie dem Modell zu geben – günstig und stets aktuell.

Überblick über die Pipeline

Ein typisches RAG-System hat zwei Phasen: eine Offline-„Indexierungsphase“, die Dokumente in abrufbare Vektoren verwandelt, und eine Online-„Abfragephase“, die anhand der Nutzerfrage abruft und eine Antwort erzeugt.

Dokument-Chunking und Embeddings

Teile die Dokumente zunächst in passend große Abschnitte. Zu groß, und der Abruf wird ungenau; zu klein, und der Kontext geht verloren. Üblich sind einige hundert Tokens mit etwas Überlappung.

Wandle dann mit einem Embedding-Modell jeden Abschnitt in einen Vektor um und speichere ihn in einer Vektordatenbank (etwa pgvector, Milvus oder Qdrant).

Vektorabruf und Top-K

Stellt ein Nutzer eine Frage, wandle auch sie in einen Vektor um, führe eine Ähnlichkeitssuche in der Datenbank aus und rufe die relevantesten Abschnitte ab (Top-K).

Du kannst die Stichwortsuche für einen „hybriden Abruf“ kombinieren und mit Reranking die Recall-Qualität weiter steigern.

Kontext zusammenstellen und Antwort erzeugen

Füge die abgerufenen Abschnitte in den Prompt ein und weise das Modell an, „nur auf Basis des bereitgestellten Materials zu antworten und klar zu sagen, wenn das Material die Antwort nicht enthält“ – das senkt Halluzinationen deutlich.

Zu den fortgeschrittenen Optimierungen zählen das Umschreiben der Anfrage, das Zitieren von Quellen, das Steuern der Kontextlänge sowie das Entduplizieren und Filtern der Abrufergebnisse.

Eine Vektordatenbank wählen

Die Vektordatenbank steht im Herzen von RAG. Für Prototypen läuft Chroma ohne Setup im Speicher. Für Produktions-Workloads sind Qdrant (Rust-basiert) und Pinecone (vollständig verwaltet) für den Produktionseinsatz ausgelegt; prüfe aktuelle Limits und Skalierungsoptionen in der jeweiligen Dokumentation. Wenn du bereits PostgreSQL nutzt, vermeidet pgvector neue Infrastruktur. Weaviate glänzt, wenn du eingebaute Vektorisierungsmodule und eine GraphQL-API brauchst.

RAG-Qualität bewerten

Ein RAG-System ist nur so gut wie sein Abruf und seine Generierung. Bewerte den Abruf mit Recall@K (erscheint der richtige Abschnitt in den Top-K-Ergebnissen?) und die Generierung mit Faithfulness (bleibt die Antwort im abgerufenen Kontext geerdet?) und Relevanz (beantwortet sie wirklich die Frage?). Frameworks wie RAGAS automatisieren diese Metriken, sodass du die Qualität verfolgen kannst, während du Chunking-Strategien, Embedding-Modelle und Prompt-Templates iterierst.

Vor dem Start: Voraussetzungen

Du brauchst eine kleine, aber repräsentative Dokumentensammlung, die Erlaubnis, sie zu nutzen, und einen Parser, der sauberen Text extrahiert (PDFs und Scans brauchen oft OCR). Wähle ein Embedding-Modell und einen Vektorspeicher, den du in deiner Umgebung betreiben kannst, und prüfe Dimension sowie Sprachunterstützung. Bereite 20–50 echte Fragen vor und markiere jeweils das Dokument oder die Passage, die sie beantworten sollte. Lege schließlich fest, wie Dokumente aktualisiert werden und wer welche Sammlung lesen darf – Berechtigungen müssen beim Abruf durchgesetzt werden, nicht nur in der Oberfläche.

Für den Start brauchst du keinen riesigen Korpus. Einige hundert gut strukturierte Seiten reichen, um die Pipeline vor dem Ausbau zu validieren.

Verifikation: Prüfe den Abruf vor den Antworten

Teste zuerst den Abruf. Führe für jede markierte Frage die Suche aus und prüfe die Top-Ergebnisse: Die erwartete Passage sollte in den Top-K erscheinen, und irrelevante Abschnitte sollten nicht dominieren. Wenn nicht, passe Chunk-Größe, Überlappung, Metadatenfilter oder das Embedding-Modell an, bevor du den Generierungs-Prompt änderst. Prüfe dann die Antworten: Das Modell sollte die abgerufene Passage zitieren oder wiedergeben und klar sagen, wenn das Material die Antwort nicht enthält. Halte ein festes Evaluationsset und führe es nach jeder Änderung erneut aus, um Regressionen zu sehen. Teste außerdem eine Frage ohne Antwort, eine mit zwei ähnlichen Dokumenten und eine in jeder unterstützten Sprache.

Häufige RAG-Fehler beheben

Gehe in dieser Reihenfolge vor. Liefert der Abruf nichts, prüfe, ob Dokumente indexiert sind, ob Anfrage und Dokumente dasselbe Embedding-Modell und dieselbe Dimension nutzen und ob Filter die Sammlung ausschließen. Existiert der richtige Abschnitt, rankt aber niedrig, untersuche Chunk-Grenzen und probiere hybride Stichwortsuche oder Reranking. Ignoriert die Antwort den abgerufenen Kontext, prüfe, ob die Abschnitte wirklich im Prompt ankamen und nicht abgeschnitten wurden; verschärfe dann die Anweisung, nur aus dem bereitgestellten Material zu antworten und Quellen zu nennen. Sind Antworten veraltet, prüfe, ob die Neuindexierung nach der Dokumentänderung lief. Füllen Duplikate die Top-K, entdupliziere vor dem Einfügen nach Dokument-ID oder Inhalts-Hash. Prüfe zuletzt, ob Zugriffsfilter beim Abruf greifen, nicht erst nach der Generierung.

Wann RAG das falsche Werkzeug ist

RAG passt schlecht, wenn die gesamte Wissensbasis bequem ins Kontextfenster passt und sich selten ändert; die Dokumente direkt zu übergeben ist einfacher. Auch bei unzuverlässigen, widersprüchlichen oder überwiegend bildhaften Quellen ohne nutzbaren Text ist es schwach. Braucht die Aufgabe Berechnungen, Transaktionen oder Live-Zustand, rufe eine Datenbank oder API auf, statt Prosa darüber abzurufen. Für Fragen, die eine einzige autoritative Abfrage brauchen, sind ein Suchindex oder eine strukturierte Abfrage oft genauer. Und wenn niemand den Index pflegen kann, verfällt das Retrieval-System schnell; ein kleineres, kuratiertes Dokument kann Nutzern besser dienen.

Ein Chunking-Schritt

Diese Funktion löst den Indexierungsschritt, der ein Dokument vor dem Embedding teilt. Sie ist eine Startskizze, kein gemessenes Ergebnis. Fehler: ist overlap 0, landet ein Fakt auf dem Schnitt in keinem Abschnitt, und der Abruf kann ihn nicht zurückgeben.

def chunk_text(text, size=400, overlap=50):
    chunks = []
    start = 0
    while start < len(text):
        chunks.append(text[start:start + size])
        if start + size >= len(text):
            break
        start += size - overlap
    return chunks
RAGVektordatenbankEmbeddingWissensbasis

Verwandte Tutorials

Verwandte Bewertungen