Titelbild für Aufbau eines privaten RAG-Systems: Architektur, Embeddings, Vektordatenbanken und Evaluierung

Auf einen Blick

Lesezeit

~200 Wörter/Min.

Veröffentlicht

vor 1 Monat

Jun 15, 2026 · Aktualisiert Jul 2, 2026

Aufrufe

351

Gesamt

Aufbau eines privaten RAG-Systems: Architektur, Embeddings, Vektordatenbanken und Evaluierung

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
i

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.

Werbung

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.

1

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.

2

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.

3

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.

2 Hälften

Retrieval-Qualität und Antwortqualität: messen Sie beide, sonst fliegen Sie blind

Werbung

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.

Bishrul Haq

Written by

Bishrul Haq

Software engineer writing practical tutorials on Laravel, PHP, Python, and the tools behind real projects. More about me

Newsletter

Want more posts like this?

Get practical software notes and tutorials delivered when something new is published.

Kein Spam. Jederzeit abbestellbar.

Wie fandest du den Beitrag?

Kommentare

0
Anmelden oder Registrieren um mitzudiskutieren und auf diesen Beitrag zu reagieren.

Noch keine Kommentare. Teile als Erste oder Erster deine Gedanken.

Related posts

Wichtige Sortieralgorithmen für Informatikstudenten

Algorithmen werden üblicherweise in Informatik- und Softwareentwicklungsstudiengängen im Bachelor oder Master gelehrt. Manchen fällt das Verständnis schwer, weil sie auf Auswendiglernen setzen.

vor 6 Jahren

GraphQL in Laravel mit Lighthouse

In der modernen Webentwicklung hat sich GraphQL aufgrund seiner Flexibilität und Effizienz als leistungsstarke Alternative zu REST-APIs etabliert.

vor 1 Jahr

Moderne reaktive Benutzeroberflächen mit Laravel 12 und Livewire 4: Ein Leitfaden für die Praxis

Ein produktionsreifer Durchlauf von Livewire 4 in Laravel 12: Formularobjekte, Lazy Components, Alpine-Interop, Dateiuploads, Pest-Tests und die Fallstricke beim Deployment, vor denen niemand warnt.

vor 2 Monaten

Leistungsstarke Admin-Panels mit Laravel 12 und Filament v5: Ein Produktionsleitfaden

Liefern Sie ein echtes Filament-v5-Admin-Panel auf Laravel 12 aus: Ressourcen, RBAC mit Spatie, Multi-Tenancy, benutzerdefinierte Widgets und eine Deployment-Checkliste für Teams, die über Hello-World hinausgehen.

vor 2 Monaten

Laravel 12 mit Octane und FrankenPHP skalieren: Ein Leitfaden für Produktions-Performance

Latenz von Laravel 12 mit Octane und FrankenPHP mehr als halbieren: installieren, konfigurieren, Singletons prüfen und Benchmarks durchführen, inklusive der Produktionsfallen, die Teams in Woche zwei erwischen.

vor 2 Monaten