Retrieval-Augmented Generation (RAG) ist die Methode, mit der ein Sprachmodell Fragen zu Ihren Daten beantwortet: Ihre Dokumente, Tickets, Codebasis: ohne dass Sie es neu trainieren müssen. Ein „privates“ RAG-System hält diese Daten in Ihrer eigenen Infrastruktur, was für viele Organisationen die einzige Möglichkeit ist, die rechtliche Freigabe für das Projekt zu erhalten. Dieser Leitfaden führt Sie durch die gesamte Pipeline: Aufnahme, Chunking, Embeddings, den Vektorspeicher, Retrieval, Generierung und die Evaluierungsschleife, die Ihnen zeigt, ob das Ganze tatsächlich funktioniert.
Was Sie sich mental vorstellen können
- Die zweiphasige RAG-Pipeline: Offline-Indizierung und Online-Abfrage
- Wie Chunking und Embeddings Dokumente in durchsuchbare Vektoren verwandeln
- Auswahl einer Vektordatenbank und der passenden Ähnlichkeitsmetrik
- Einbindung des Retrievals in einen fundierten, zitierfreundlichen Prompt
- Evaluierung der Retrieval- und Antwortqualität, um Verbesserungen zu ermöglichen
Info
Warum RAG statt Fine-Tuning
Fine-Tuning bringt einem Modell einen Stil oder eine Fähigkeit bei; es ist eine schlechte und teure Methode, um ihm Fakten beizubringen, die sich ändern. RAG injiziert aktuelle, quellenbelegbare Fakten zum Zeitpunkt der Abfrage, sodass eine Wissensaktualisierung bedeutet, ein Dokument neu zu indizieren, nicht ein Modell neu zu trainieren. Für die meisten Anforderungen à la „Fragen zu unseren Daten beantworten“ ist RAG das richtige Werkzeug.
Das große Ganze: zwei Pipelines
Jedes RAG-System besteht eigentlich aus zwei Pipelines, die sich einen Vektorspeicher teilen. Die Offline-Pipeline läuft immer dann, wenn sich Ihre Daten ändern; die Online-Pipeline läuft bei jeder Benutzerfrage. Wenn Sie diese beiden gedanklich trennen, wird das gesamte Design handhabbar.
OFFLINE (indexing, runs when data changes)
documents ─▶ clean ─▶ chunk ─▶ embed ─▶ store vectors + metadata
│
[ VECTOR DB ]
│
ONLINE (querying, runs per question) ▼
question ─▶ embed ─▶ similarity search ─▶ top-k chunks
─▶ build grounded prompt ─▶ LLM ─▶ answer + citations
Schritt 1: Aufnahme und Bereinigung
Garbage in, garbage out gilt bei RAG besonders drastisch. Bevor Sie irgendetwas anderes tun, extrahieren Sie sauberen Text aus Ihren Quellen (PDFs, HTML, Wikis, Tickets), entfernen Sie Boilerplate wie Navigationsleisten und Fußzeilen und bewahren Sie die Struktur: Überschriften, Listen, Tabellen -, denn diese Struktur trägt Bedeutung, die das Modell nutzen wird. Hängen Sie jetzt Metadaten an jedes Dokument an: Quelle, URL, Autor, letzte Aktualisierung, Zugriffsebene. Sie werden sie später für Filterung und Zitate benötigen.
Schritt 2: Chunking: die am meisten unterschätzte Entscheidung
Modelle rufen Chunks ab und schlussfolgern über sie, nicht über ganze Dokumente. Chunken Sie zu groß, verwässern Sie die Relevanz und verschwenden Kontext; chunken Sie zu klein, durchtrennen Sie die Bedeutung, die sich über Sätze erstreckt. Gute Standardwerte sind einige hundert Token pro Chunk mit moderater Überlappung, damit Ideen, die eine Grenze überspannen, nicht verloren gehen: aber die richtige Größe ist inhaltsabhängig und sollte anhand Ihrer Evaluierungen abgestimmt werden.
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=800, # characters; tune against your eval set
chunk_overlap=120, # keep ideas that straddle a boundary
separators=["\n\n", "\n", ". ", " "], # prefer natural boundaries
)
chunks = splitter.split_text(clean_document_text)
Profitipp
Speichern Sie die Quellüberschrift und den Dokumenttitel zusammen mit jedem Chunk und stellen Sie sie dem Chunk-Text vor dem Embedding voran. Ein nackter Absatz ist mehrdeutig; derselbe Absatz unter „Rückerstattungen > Berechtigung“ wird in einen viel besser auffindbaren Vektor eingebettet. Dieser eine Trick verbessert die Retrieval-Qualität spürbar.
Schritt 3: Embeddings
Ein Embedding-Modell wandelt jeden Chunk in einen Vektor um: eine Liste von Zahlen -, sodass semantisch ähnlicher Text im Raum nahe beieinander liegt. Dasselbe Modell bettet Ihre Chunks zur Indexzeit und Ihre Fragen zur Abfragezeit ein; Sie müssen für beides dasselbe Modell verwenden, sonst passt die Geometrie nicht zusammen. Betreiben Sie für ein privates System ein offenes Embedding-Modell lokal, damit Ihr Text das Netzwerk nie verlässt.
Warnung
Mischen Sie niemals Embedding-Modelle
Vektoren von zwei verschiedenen Embedding-Modellen sind nicht vergleichbar: die Suche in einem Modell-A-Index mit einem Modell-B-Abfragevektor liefert Unsinn. Wenn Sie das Embedding-Modell wechseln, müssen Sie Ihren gesamten Korpus neu einbetten. Legen Sie Modell und Version fest und vermerken Sie sie in Ihren Index-Metadaten.
Schritt 4: Die Vektordatenbank
Der Vektorspeicher enthält Ihre Chunk-Vektoren plus Metadaten und beantwortet schnell die Frage: „Welche Chunks sind diesem Abfragevektor am ähnlichsten?“: unter Verwendung der approximativen Nächste-Nachbarn-Suche (ANN). Die Optionen reichen von eingebetteten Bibliotheken bis zu vollständigen Servern, und die richtige Wahl hängt von der Skalierung und dem Betriebsaufwand ab.
✓ Vorteile
- pgvector: fügt Vektoren zu Ihrem bereits laufenden Postgres hinzu; ideal für moderate Skalierung
- Qdrant / Milvus / Weaviate: speziell entwickelt, skalieren auf große Korpora
- FAISS / Chroma: eingebettet, perfekt für Prototyping und kleine Mengen
- Metadatenfilterung ermöglicht die Durchsetzung von Zugriffskontrollen zur Abfragezeit
✕ Nachteile
- Ein neuer Server bedeutet echten Betrieb: sichern, überwachen, absichern
- ANN tauscht ein wenig Recall gegen hohe Geschwindigkeit; stimmen Sie die Indexparameter ab
- Neuindizierung großer Korpora ist langsam: planen Sie Kapazität und Zeitpunkt
- Cosinus vs. Skalarprodukt vs. euklidisch muss zu Ihrem Embedding-Modell passen
Tipp
Wenn Sie bereits Postgres betreiben, beginnen Sie mit pgvector
Es hält Ihre Vektoren, Metadaten und vorhandenen relationalen Daten in einem System, das Sie bereits sichern und absichern. Viele private RAG-Systeme müssen nie darüber hinauswachsen: greifen Sie nur dann zu einer dedizierten Vektordatenbank, wenn Skalierung oder Recall es wirklich erfordern.
Schritt 5: Retrieval und der fundierte Prompt
Zur Abfragezeit betten Sie die Frage ein, rufen die Top-k ähnlichsten Chunks ab (gefiltert nach der Zugriffsebene des Benutzers) und erstellen einen Prompt, der diese Chunks mit strengen Anweisungen an das Modell übergibt: Antworten Sie nur aus dem bereitgestellten Kontext, zitieren Sie Quellen und sagen Sie „Ich weiß es nicht“, wenn der Kontext die Antwort nicht enthält. Diese letzte Anweisung macht aus einem selbstbewussten Halluzinierer einen vertrauenswürdigen Assistenten. Der Zugriffsfilter gehört in die Abfrage selbst, sodass ein Benutzer niemals einen Chunk abrufen kann, den er nicht sehen darf:
def retrieve(question: str, user, k: int = 6):
qvec = embed(question) # SAME model used at index time
# pgvector similarity search WITH access control pushed into the SQL.
rows = db.execute(
"""
SELECT id, title, text, (embedding <=> %(q)s) AS distance
FROM chunks
WHERE acl_level <= %(level)s -- never return chunks above the user's level
ORDER BY embedding <=> %(q)s -- cosine distance, ANN-indexed
LIMIT %(k)s
""",
{"q": qvec, "level": user.acl_level, "k": k},
).fetchall()
# Abstain instead of answering from weak evidence.
return [r for r in rows if r.distance < RELEVANCE_THRESHOLD]
SYSTEM = (
"Answer the question using ONLY the context below. "
"Cite the source id in brackets after each claim, e.g. [doc-12]. "
"If the context does not contain the answer, say you don't know."
)
context = "\n\n".join(f"[{c.id}] {c.title}\n{c.text}" for c in top_k_chunks)
prompt = f"{SYSTEM}\n\nContext:\n{context}\n\nQuestion: {question}"
answer = llm.complete(prompt)
Schritt 6: Evaluierung: der Teil, den Teams überspringen und dann bereuen
Ohne Evaluierung optimieren Sie blind. Die RAG-Qualität hat zwei Hälften, und Sie müssen beide messen, denn eine großartige Antwort ist unmöglich, wenn die Retrieval-Stufe dem Modell die falschen Chunks geliefert hat.
Retrieval evaluieren
Erstellen Sie einen Satz von Fragen mit bekannten relevanten Chunks und messen Sie dann, ob das Retrieval diese an die Oberfläche bringt: Recall und Precision bei k. Wenn der richtige Chunk nicht abgerufen wird, kann kein Prompt die Antwort retten.
Die Antworten evaluieren
Bewerten Sie für dieselben Fragen die generierten Antworten auf Faktenbindung (keine Behauptungen jenseits des Kontexts), Relevanz und korrekte Zitate. Ein LLM als Richter plus eine menschliche Stichprobe ist der praktische Standard.
Verfolgen Sie es über die Zeit
Führen Sie die Evaluierung bei jeder Änderung durch: neues Chunking, neues Einbettungsmodell, neuer Prompt. RAG ist ein System mit vielen Stellschrauben; die Evaluierung ist der einzige Weg zu erkennen, welche Drehung geholfen hat.
Retrieval-Qualität und Antwortqualität: messen Sie beide, sonst fliegen Sie blind
Halluzination kontrollieren
Grounding verhindert nicht automatisch, dass ein Modell Dinge erfindet, aber mehrere Kontrollen zusammen bringen Sie dem Ziel sehr nahe: Weisen Sie das Modell an, sich zu enthalten, wenn der Kontext unzureichend ist, verlangen Sie Zitate, damit Behauptungen nachvollziehbar sind, setzen Sie einen Relevanzschwellenwert, sodass schwache Abrufe ein „Ich weiß es nicht“ statt einer Vermutung auslösen, und erwägen Sie einen Reranking-Schritt, um die wirklich relevanten Chunks vor der Generierung nach oben zu schieben.
Gefahr
Eine selbstbewusste falsche Antwort ist schlimmer als keine Antwort
In einem privaten Wissenssystem vertrauen Benutzer der Ausgabe. Ein Assistent, der eine Rückerstattungsrichtlinie oder ein Sicherheitsverfahren erfindet, richtet echten Schaden an. Richten Sie Ihr System auf Enthaltung aus: „Das konnte ich nicht finden“ ist eine Funktion, kein Fehler.
Die private RAG-Checkliste
✓ Vorteile
- Lokale Einbettungs- und Generierungsmodelle: Daten verlassen niemals Ihr Netzwerk
- Metadatenbasierte Zugriffskontrolle, die zur Abrufzeit durchgesetzt wird
- Zitate bei jeder Antwort für Nachvollziehbarkeit und Vertrauen
- Ein Evaluierungsset, das sowohl Retrieval- als auch Antwortqualität abdeckt
- Eine Neuindizierungs-Pipeline, die läuft, wenn sich Quelldaten ändern
✕ Nachteile
- Kein Mischen von Einbettungsmodellen ohne vollständige Neuindizierung
- Kein Überspringen der Evaluierung: Sie können nicht verbessern, was Sie nicht messen
- Keine Auslieferung von Antworten ohne Zugriffskontrollfilterung
- Keine Bereitstellung, die halluziniert, anstatt sich zu enthalten
! Häufige Fehler, die es zu vermeiden gilt
-
✕Chunks mit einem Modell einbetten und Abfragen mit einem anderen.
✓Verwenden Sie exakt dasselbe Einbettungsmodell und dieselbe Version für beides; ein Wechsel bedeutet, alles neu einzubetten.
-
✕Ganze Dokumente als einzelne Chunks ablegen.
✓Teilen Sie in kohärente, in sich geschlossene Stücke mit Überlappung auf und stellen Sie die Abschnittsüberschrift voran.
-
✕Das Modell aus schwachen Abrufen antworten lassen.
✓Setzen Sie einen Relevanzschwellenwert und weisen Sie es an, „Ich weiß es nicht“ zu sagen, anstatt zu raten.
-
✕Evaluierung überspringen und blind optimieren.
✓Messen Sie Retrieval- und Antwortqualität getrennt an einem festen Fragensatz, bei jeder Änderung.
? Häufig gestellte Fragen
Wann sollte ich RAG anstelle von Fine-Tuning verwenden? +
Nutzen Sie RAG, um einem Modell aktuelle, quellenbelegbare Fakten zu geben; Wissen zu aktualisieren bedeutet dann, ein Dokument neu zu indizieren, nicht neu zu trainieren. Fine-Tuning lehrt Stil oder Fähigkeiten, nicht das Ändern von Fakten.
Welche Vektordatenbank sollte ich wählen? +
Wenn Sie bereits Postgres betreiben, beginnen Sie mit pgvector: es hält Vektoren, Metadaten und relationale Daten in einem gesicherten System. Wechseln Sie nur dann zu einem dedizierten Speicher wie Qdrant, Milvus oder Weaviate, wenn Skalierung oder Recall es erfordern.
Wie groß sollten meine Chunks sein? +
Einige hundert Token mit moderater Überlappung sind ein solider Standard, aber die richtige Größe ist inhaltsabhängig. Stimmen Sie sie anhand Ihres Evaluierungssets ab, anstatt zu raten.
Wie halte ich es privat? +
Führen Sie offene Einbettungs- und Generierungsmodelle lokal aus, sodass Text niemals Ihr Netzwerk verlässt, und erzwingen Sie eine benutzerbezogene Zugriffskontrolle mit Metadatenfiltern zur Abrufzeit.
Wie verhindere ich, dass es halluziniert? +
Binden Sie das Modell ausschließlich an den abgerufenen Kontext, verlangen Sie Zitate, setzen Sie einen Relevanzschwellenwert für die Enthaltung und richten Sie das System auf „Das konnte ich nicht finden“ statt auf eine selbstbewusste Vermutung aus.
Erfolg
RAG ist gut gemachtes Handwerk
Es gibt keine einzelne magische Komponente in RAG: Qualität entsteht dadurch, dass man jeden unspektakulären Schritt richtig macht: saubere Aufnahme, intelligentes Chunking, konsistente Einbettungen, gefiltertes Retrieval, einen disziplinierten Prompt und unermüdliche Evaluierung. Setzen Sie das innerhalb Ihrer eigenen Wände richtig um, und Sie haben einen privaten Assistenten, dem Ihre Benutzer tatsächlich vertrauen können.
Kommentare
0Noch keine Kommentare. Teile als Erste oder Erster deine Gedanken.