{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 100,\n \"parent_id\": 91,\n \"slug\": \"rag-prozess\",\n \"path\": \"\/prozesse\/rag-prozess\",\n \"title\": \"RAG-Prozess\",\n \"description\": \"Dokumentation des gesamten RAG-Prozesses (Retrieval Augmented Generation) für Chat und Content Studio\",\n \"content\": \"<h2>Überblick<\/h2>\\n<p>Der RAG-Prozess (Retrieval Augmented Generation) bildet das Herzstück der KI-gestützten Wissensgenerierung. Er besteht aus zwei Phasen:<\/p>\\n\\n<h3>1. Indexierungsphase (Offline)<\/h3>\\n<ul>\\n<li><strong>Dokument-Import<\/strong> – PDF\/Text-Dokumente in die Pipeline laden<\/li>\\n<li><strong>Chunking<\/strong> – Texte in semantische Einheiten zerlegen<\/li>\\n<li><strong>Embedding-Generierung<\/strong> – Vektorrepräsentationen erstellen (Ollama)<\/li>\\n<li><strong>Vektorspeicherung<\/strong> – Embeddings in Qdrant speichern<\/li>\\n<\/ul>\\n\\n<h3>2. Abfragephase (Online)<\/h3>\\n<ul>\\n<li><strong>Anfrage-Embedding<\/strong> – Nutzerfrage in Vektor umwandeln<\/li>\\n<li><strong>Ähnlichkeitssuche<\/strong> – Relevante Chunks in Qdrant finden<\/li>\\n<li><strong>Kontext-Aufbau<\/strong> – Gefundene Chunks als Kontext formatieren<\/li>\\n<li><strong>LLM-Generierung<\/strong> – Antwort mit Claude\/Ollama erzeugen<\/li>\\n<\/ul>\\n\\n<h3>Anwendungsbereiche<\/h3>\\n<table>\\n<thead><tr><th>Anwendung<\/th><th>Beschreibung<\/th><th>Besonderheiten<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>KI-Chat<\/td><td>Interaktive Wissensfragen<\/td><td>Session-basiert, Konversationshistorie<\/td><\/tr>\\n<tr><td>Content Studio<\/td><td>Content-Generierung<\/td><td>Profile, Contracts, Struktur, Kritik-Runden<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Technologie-Stack<\/h3>\\n<ul>\\n<li><strong>Embedding-Modell:<\/strong> mxbai-embed-large (Ollama)<\/li>\\n<li><strong>Vektordatenbank:<\/strong> Qdrant (1536 Dimensionen, Cosine-Similarity)<\/li>\\n<li><strong>LLM:<\/strong> Claude API (Anthropic) oder lokale Ollama-Modelle<\/li>\\n<li><strong>Pipeline:<\/strong> Python-Scripts in <code>\/var\/www\/scripts\/pipeline\/<\/code><\/li>\\n<\/ul>\\n\\n<h3>Datenfluss-Diagramm<\/h3>\\n<pre>\\n┌─────────────┐ ┌──────────────┐ ┌─────────────┐\\n│ Dokument │────▶│ Chunking │────▶│ Embedding │\\n└─────────────┘ └──────────────┘ └──────┬──────┘\\n │\\n ▼\\n┌─────────────┐ ┌──────────────┐ ┌─────────────┐\\n│ Qdrant │◀────│ Speichern │◀────│ Vektor │\\n└──────┬──────┘ └──────────────┘ └─────────────┘\\n │\\n │ (Indexierungsphase abgeschlossen)\\n │\\n ▼\\n┌─────────────┐ ┌──────────────┐ ┌─────────────┐\\n│ Anfrage │────▶│ Q-Embedding │────▶│ Suche │\\n└─────────────┘ └──────────────┘ └──────┬──────┘\\n │\\n ▼\\n┌─────────────┐ ┌──────────────┐ ┌─────────────┐\\n│ Antwort │◀────│ LLM │◀────│ Kontext │\\n└─────────────┘ └──────────────┘ └─────────────┘\\n<\/pre>\\n\\n<hr>\\n\\n<h2>Prozessschritt 1: Dokument-Import<\/h2>\\n\\n<h3>Funktion<\/h3>\\n<ul>\\n<li>PDF- und Text-Dokumente in das System einlesen<\/li>\\n<li>Metadaten extrahieren (Titel, Autor, Erstellungsdatum)<\/li>\\n<li>Dokumentstruktur erkennen (Überschriften, Absätze)<\/li>\\n<li>Speicherung in MariaDB für Verwaltung und Tracking<\/li>\\n<\/ul>\\n\\n<h3>Eingabe<\/h3>\\n<ul>\\n<li>PDF-Dateien (via Content Pipeline Import)<\/li>\\n<li>Text-Dateien<\/li>\\n<li>Manuelle Eingabe über Web-UI<\/li>\\n<\/ul>\\n\\n<h3>Ausgabe<\/h3>\\n<ul>\\n<li>Datensatz in <code>ki_content.documents<\/code><\/li>\\n<li>Seitenweise Extraktion in <code>ki_content.document_pages<\/code><\/li>\\n<li>Status: <code>pending<\/code> (bereit für Chunking)<\/li>\\n<\/ul>\\n\\n<h3>Beteiligte Komponenten<\/h3>\\n<table>\\n<thead><tr><th>Komponente<\/th><th>Pfad<\/th><th>Funktion<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>Content Pipeline<\/td><td><code>\/content-pipeline<\/code><\/td><td>Web-UI für Imports<\/td><\/tr>\\n<tr><td>import_pdf()<\/td><td><code>pipeline\/import_pipeline.py<\/code><\/td><td>PDF-Extraktion mit pdfplumber<\/td><\/tr>\\n<tr><td>documents-Tabelle<\/td><td><code>ki_content.documents<\/code><\/td><td>Dokument-Metadaten<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Ablauf<\/h3>\\n<ol>\\n<li>Datei hochladen oder Pfad angeben<\/li>\\n<li>PDF-Text extrahieren (pdfplumber)<\/li>\\n<li>Metadaten erfassen (filename, source_path, file_size)<\/li>\\n<li>Dokument in DB speichern mit Status <code>pending<\/code><\/li>\\n<li>Seiten einzeln in <code>document_pages<\/code> speichern<\/li>\\n<\/ol>\\n\\n<h3>Datenbank-Schema<\/h3>\\n<pre>\\ndocuments:\\n id, filename, source_path, file_size, \\n page_count, status, created_at\\n \\ndocument_pages:\\n id, document_id, page_number, content, \\n metadata, created_at\\n<\/pre>\\n\\n<hr>\\n\\n<h2>Prozessschritt 2: Chunking<\/h2>\\n\\n<h3>Funktion<\/h3>\\n<ul>\\n<li>Lange Texte in kleinere, semantisch sinnvolle Einheiten zerlegen<\/li>\\n<li>Überlappung (Overlap) für Kontexterhalt<\/li>\\n<li>Heading-Path für Hierarchie-Kontext<\/li>\\n<li>Token-Count für Embedding-Limit-Prüfung<\/li>\\n<\/ul>\\n\\n<h3>Eingabe<\/h3>\\n<ul>\\n<li>Dokument aus <code>documents<\/code>-Tabelle<\/li>\\n<li>Extrahierter Text aus <code>document_pages<\/code><\/li>\\n<\/ul>\\n\\n<h3>Ausgabe<\/h3>\\n<ul>\\n<li>Chunks in <code>ki_content.chunks<\/code><\/li>\\n<li>Jeder Chunk: content, chunk_index, token_count, heading_path<\/li>\\n<\/ul>\\n\\n<h3>Parameter<\/h3>\\n<table>\\n<thead><tr><th>Parameter<\/th><th>Wert<\/th><th>Beschreibung<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>chunk_size<\/td><td>500-800 Token<\/td><td>Zielgröße pro Chunk<\/td><\/tr>\\n<tr><td>overlap<\/td><td>50-100 Token<\/td><td>Überlappung zwischen Chunks<\/td><\/tr>\\n<tr><td>max_embed_chars<\/td><td>800 Zeichen<\/td><td>Limit für mxbai-embed-large<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Beteiligte Komponenten<\/h3>\\n<table>\\n<thead><tr><th>Komponente<\/th><th>Pfad<\/th><th>Funktion<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>chunk_document()<\/td><td><code>pipeline\/chunk.py<\/code><\/td><td>Chunking-Logik<\/td><\/tr>\\n<tr><td>chunks-Tabelle<\/td><td><code>ki_content.chunks<\/code><\/td><td>Chunk-Speicherung<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Ablauf<\/h3>\\n<ol>\\n<li>Text aus Dokument laden<\/li>\\n<li>Überschriften-Hierarchie erkennen<\/li>\\n<li>Text an semantischen Grenzen splitten (Absätze, Sätze)<\/li>\\n<li>Chunks mit Overlap erstellen<\/li>\\n<li>Token-Count berechnen<\/li>\\n<li>Heading-Path für jeden Chunk speichern<\/li>\\n<li>Chunks in DB mit Status <code>pending<\/code> (bereit für Embedding)<\/li>\\n<\/ol>\\n\\n<h3>Datenbank-Schema<\/h3>\\n<pre>\\nchunks:\\n id, document_id, chunk_index, content,\\n token_count, heading_path, metadata,\\n qdrant_id, created_at\\n<\/pre>\\n\\n<h3>Beispiel<\/h3>\\n<pre>\\nDokument: \\\"Systemisches Coaching.pdf\\\"\\nSeite 5, Abschnitt \\\"Auftragsklärung\\\"\\n\\n→ Chunk 1: \\\"Die Wichtigkeit einer guten Auftragsklärung...\\\"\\n heading_path: [\\\"Kapitel 2\\\", \\\"Auftragsklärung\\\"]\\n token_count: 423\\n chunk_index: 0\\n\\n→ Chunk 2: \\\"Auftragsklärung erfolgt einerseits zum Start...\\\"\\n heading_path: [\\\"Kapitel 2\\\", \\\"Auftragsklärung\\\"]\\n token_count: 387\\n chunk_index: 1\\n<\/pre>\\n\\n<hr>\\n\\n<h2>Prozessschritt 3: Embedding-Generierung<\/h2>\\n\\n<h3>Funktion<\/h3>\\n<ul>\\n<li>Text-Chunks in numerische Vektorrepräsentationen umwandeln<\/li>\\n<li>Semantische Bedeutung in 1536-dimensionalem Vektor kodieren<\/li>\\n<li>Ermöglicht Ähnlichkeitssuche via Cosine-Similarity<\/li>\\n<\/ul>\\n\\n<h3>Eingabe<\/h3>\\n<ul>\\n<li>Chunk-Text aus <code>chunks<\/code>-Tabelle<\/li>\\n<li>Maximal 800 Zeichen pro Chunk (Modell-Limit)<\/li>\\n<\/ul>\\n\\n<h3>Ausgabe<\/h3>\\n<ul>\\n<li>Vektor mit 1536 Float-Werten<\/li>\\n<li>Normalisiert für Cosine-Similarity<\/li>\\n<\/ul>\\n\\n<h3>Embedding-Modell<\/h3>\\n<table>\\n<thead><tr><th>Eigenschaft<\/th><th>Wert<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>Modell<\/td><td>mxbai-embed-large<\/td><\/tr>\\n<tr><td>Anbieter<\/td><td>Ollama (lokal)<\/td><\/tr>\\n<tr><td>Dimensionen<\/td><td>1536<\/td><\/tr>\\n<tr><td>Max Context<\/td><td>512 Token (~800 Zeichen)<\/td><\/tr>\\n<tr><td>Sprachen<\/td><td>Multilingual (inkl. Deutsch)<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Beteiligte Komponenten<\/h3>\\n<table>\\n<thead><tr><th>Komponente<\/th><th>Pfad<\/th><th>Funktion<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>get_embedding()<\/td><td><code>pipeline\/embed.py:20<\/code><\/td><td>Embedding via Ollama API<\/td><\/tr>\\n<tr><td>Ollama API<\/td><td><code>localhost:11434<\/code><\/td><td>Lokaler Embedding-Service<\/td><\/tr>\\n<tr><td>config.py<\/td><td><code>pipeline\/config.py<\/code><\/td><td>EMBEDDING_MODEL, EMBEDDING_DIMENSION<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Ablauf<\/h3>\\n<ol>\\n<li>Chunk-Text laden<\/li>\\n<li>Text bereinigen (Punktfolgen reduzieren)<\/li>\\n<li>Auf 800 Zeichen truncaten falls nötig<\/li>\\n<li>POST an Ollama <code>\/api\/embeddings<\/code><\/li>\\n<li>Vektor aus Response extrahieren<\/li>\\n<li>Weiter an Vektorspeicherung<\/li>\\n<\/ol>\\n\\n<h3>Code-Beispiel<\/h3>\\n<pre>\\n# pipeline\/embed.py\\ndef get_embedding(text):\\n response = requests.post(\\n f\\\"{OLLAMA_HOST}\/api\/embeddings\\\",\\n json={\\\"model\\\": EMBEDDING_MODEL, \\\"prompt\\\": text},\\n timeout=60\\n )\\n return response.json().get(\\\"embedding\\\")\\n<\/pre>\\n\\n<h3>Fehlerbehandlung<\/h3>\\n<ul>\\n<li>Leerer Text → None zurückgeben, überspringen<\/li>\\n<li>Timeout → Logging, Retry<\/li>\\n<li>Ollama nicht erreichbar → Fehler loggen, Chunk als pending belassen<\/li>\\n<\/ul>\\n\\n<hr>\\n\\n<h2>Prozessschritt 4: Vektorspeicherung<\/h2>\\n\\n<h3>Funktion<\/h3>\\n<ul>\\n<li>Embedding-Vektoren in Qdrant persistieren<\/li>\\n<li>Payload mit Metadaten speichern (chunk_id, document_id, content)<\/li>\\n<li>Collection-basierte Organisation (documents, system-docs, etc.)<\/li>\\n<li>UUID als Point-ID für eindeutige Referenzierung<\/li>\\n<\/ul>\\n\\n<h3>Eingabe<\/h3>\\n<ul>\\n<li>Embedding-Vektor (1536 Floats)<\/li>\\n<li>Chunk-Metadaten (chunk_id, document_id, document_title, content)<\/li>\\n<li>Ziel-Collection (documents, system-docs)<\/li>\\n<\/ul>\\n\\n<h3>Ausgabe<\/h3>\\n<ul>\\n<li>Point in Qdrant Collection gespeichert<\/li>\\n<li>qdrant_id in <code>chunks<\/code>-Tabelle aktualisiert<\/li>\\n<\/ul>\\n\\n<h3>Qdrant-Konfiguration<\/h3>\\n<table>\\n... [TRUNCATED-7dd33fb64e63499f]"
}
]
}