{
"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\": \"<nav class=\\\"breadcrumb\\\">\\n <a href=\\\"\/docs\\\">Dokumentation<\/a> »\\n <a href=\\\"\/docs\/prozesse\\\">Prozesse<\/a> »\\n RAG-Prozess\\n<\/nav>\\n\\n<h1>RAG-Prozess<\/h1>\\n<p class=\\\"doc-meta\\\"><strong>Erstellt:<\/strong> 2025-12-24 | <strong>Aktualisiert:<\/strong> 2025-12-31<\/p>\\n\\n\\n<p><strong>Status:<\/strong> Aktualisiert 2025-12-31<\/p>\\n\\n<h2>Übersicht<\/h2>\\n\\n<p>Der RAG-Prozess (Retrieval Augmented Generation) bildet das Herzstück der KI-gestützten Wissensgenerierung. Die Architektur trennt strikt zwischen <strong>Offline-Pipeline<\/strong> (Wissensaufbau) und <strong>Online-Pipeline<\/strong> (Wissenskonsum).<\/p>\\n\\n<h3>Grundprinzip<\/h3>\\n<ul>\\n <li>Die <strong>Offline-Pipeline<\/strong> erzeugt und strukturiert Wissen (Python-Skripte)<\/li>\\n <li>Die <strong>Online-Pipeline<\/strong> konsumiert Wissen, ohne es zu verändern (PHP-Services)<\/li>\\n <li>Zwischen beiden Pipelines besteht <strong>keine Rückkopplung zur Laufzeit<\/strong><\/li>\\n<\/ul>\\n\\n<hr>\\n\\n<h2>Offline-Pipeline: Tatsächlicher Ablauf (IST)<\/h2>\\n\\n<p><strong>Pfad:<\/strong> <code>\/var\/www\/scripts\/pipeline\/<\/code><br>\\n<strong>Orchestrator:<\/strong> <code>pipeline.py<\/code><br>\\n<strong>Step-Module:<\/strong> <code>step_extract.py<\/code>, <code>step_load.py<\/code>, <code>step_transform.py<\/code>, <code>step_embed.py<\/code>, <code>step_semantic.py<\/code><\/p>\\n\\n<h3>Phase 0: Detection<\/h3>\\n\\n<table>\\n <thead>\\n <tr><th>Step<\/th><th>Modul<\/th><th>Beschreibung<\/th><\/tr>\\n <\/thead>\\n <tbody>\\n <tr><td>detect<\/td><td><code>detect.py<\/code><\/td><td>Dateien scannen, Hash-Vergleich<\/td><\/tr>\\n <tr><td>queue<\/td><td><code>detect.py<\/code><\/td><td>Neue\/geänderte Dateien in Queue<\/td><\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<h3>Phase 1: Extraction (pro Dokument)<\/h3>\\n\\n<table>\\n <thead>\\n <tr><th>Step<\/th><th>Modul<\/th><th>Beschreibung<\/th><\/tr>\\n <\/thead>\\n <tbody>\\n <tr><td>extract<\/td><td><code>step_extract.py<\/code> → <code>extract.py<\/code><\/td><td>Text aus PDF\/DOCX\/PPTX\/MD\/TXT<\/td><\/tr>\\n <tr><td>hash<\/td><td><code>step_extract.py<\/code><\/td><td>SHA256 Hash berechnen<\/td><\/tr>\\n <tr><td>rotation<\/td><td><code>orientation.py<\/code><\/td><td>Seitenrotation erkennen (PDF)<\/td><\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<h3>Phase 2: Load<\/h3>\\n\\n<table>\\n <thead>\\n <tr><th>Step<\/th><th>Modul<\/th><th>Beschreibung<\/th><\/tr>\\n <\/thead>\\n <tbody>\\n <tr><td>doc_create<\/td><td><code>step_load.py<\/code><\/td><td>Dokument in <code>documents<\/code> anlegen<\/td><\/tr>\\n <tr><td>page_store<\/td><td><code>step_load.py<\/code><\/td><td>Seiten in <code>document_pages<\/code> speichern<\/td><\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<h3>Phase 3: Vision (nur PDF)<\/h3>\\n\\n<table>\\n <thead>\\n <tr><th>Step<\/th><th>Modul<\/th><th>Beschreibung<\/th><\/tr>\\n <\/thead>\\n <tbody>\\n <tr><td>vision<\/td><td><code>step_transform.py<\/code> → <code>vision.py<\/code><\/td><td>Seiten mit llama3.2-vision:11b analysieren<\/td><\/tr>\\n <tr><td>vision_store<\/td><td><code>vision.py<\/code><\/td><td>Ergebnisse in <code>document_pages.vision_analysis<\/code><\/td><\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<h3>Phase 4: Chunking<\/h3>\\n\\n<table>\\n <thead>\\n <tr><th>Step<\/th><th>Modul<\/th><th>Beschreibung<\/th><\/tr>\\n <\/thead>\\n <tbody>\\n <tr><td>chunk<\/td><td><code>step_transform.py<\/code> → <code>chunk.py<\/code><\/td><td>Text in semantische Chunks zerlegen<\/td><\/tr>\\n <tr><td>chunk_store<\/td><td><code>step_load.py<\/code><\/td><td>Chunks in <code>chunks<\/code> speichern<\/td><\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<h3>Phase 5: Enrichment (nur PDF)<\/h3>\\n\\n<table>\\n <thead>\\n <tr><th>Step<\/th><th>Modul<\/th><th>Beschreibung<\/th><\/tr>\\n <\/thead>\\n <tbody>\\n <tr><td>enrich<\/td><td><code>step_transform.py<\/code> → <code>enrich.py<\/code><\/td><td>Vision-Kontext zu Chunks hinzufügen<\/td><\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<h3>Phase 6: Embedding (Layer 3 - Dokument wird suchbar)<\/h3>\\n\\n<table>\\n <thead>\\n <tr><th>Step<\/th><th>Modul<\/th><th>Beschreibung<\/th><\/tr>\\n <\/thead>\\n <tbody>\\n <tr><td>embed<\/td><td><code>step_embed.py<\/code> → <code>embed.py<\/code><\/td><td>Embeddings mit mxbai-embed-large<\/td><\/tr>\\n <tr><td>qdrant_store<\/td><td><code>embed.py<\/code><\/td><td>Vektoren in Qdrant speichern<\/td><\/tr>\\n <tr><td>status_embedded<\/td><td><code>step_load.py<\/code><\/td><td>Status = \\\"embedded\\\"<\/td><\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<p><strong>Nach Phase 6 ist das Dokument im Chat suchbar!<\/strong><\/p>\\n\\n<h3>Phase 7: Semantic Analysis (Layer 4 - optional\/async)<\/h3>\\n\\n<table>\\n <thead>\\n <tr><th>Step<\/th><th>Modul<\/th><th>Beschreibung<\/th><\/tr>\\n <\/thead>\\n <tbody>\\n <tr><td>entity_extract<\/td><td><code>analyzers\/entity_extractor.py<\/code><\/td><td>Entitäten extrahieren (Anthropic\/Ollama)<\/td><\/tr>\\n <tr><td>entity_store<\/td><td><code>analyzers\/entity_extractor.py<\/code><\/td><td>Entitäten in <code>entities<\/code> speichern<\/td><\/tr>\\n <tr><td>entity_normalize<\/td><td><code>analyzers\/entity_normalizer.py<\/code><\/td><td>canonical_name setzen<\/td><\/tr>\\n <tr><td>relation_extract<\/td><td><code>analyzers\/relation_extractor.py<\/code><\/td><td>Relationen extrahieren<\/td><\/tr>\\n <tr><td>relation_store<\/td><td><code>analyzers\/document_analyzer.py<\/code><\/td><td>In <code>entity_relations<\/code> speichern<\/td><\/tr>\\n <tr><td>taxonomy_classify<\/td><td><code>analyzers\/taxonomy_classifier.py<\/code><\/td><td>Taxonomie-Kategorien zuweisen<\/td><\/tr>\\n <tr><td>ontology_classify<\/td><td><code>analyzers\/ontology_classifier.py<\/code><\/td><td>Ontologie-Klassen zuweisen<\/td><\/tr>\\n <tr><td>chunk_entity_link<\/td><td><code>analyzers\/document_analyzer.py<\/code><\/td><td>Chunks mit Entitäten verknüpfen<\/td><\/tr>\\n <tr><td>chunk_taxonomy<\/td><td><code>analyzers\/document_analyzer.py<\/code><\/td><td>Taxonomie auf Chunks propagieren<\/td><\/tr>\\n <tr><td>entity_taxonomy<\/td><td><code>analyzers\/document_analyzer.py<\/code><\/td><td>Taxonomie auf Entitäten<\/td><\/tr>\\n <tr><td>chunk_semantics<\/td><td><code>analyzers\/semantic_analyzer.py<\/code><\/td><td>Chunk-Semantik analysieren<\/td><\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<h3>Phase 8: Finalization<\/h3>\\n\\n<table>\\n <thead>\\n <tr><th>Step<\/th><th>Modul<\/th><th>Beschreibung<\/th><\/tr>\\n <\/thead>\\n <tbody>\\n <tr><td>status_done<\/td><td><code>step_load.py<\/code><\/td><td>Status = \\\"done\\\"<\/td><\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<hr>\\n\\n<h2>Datenfluss-Diagramm<\/h2>\\n\\n<pre><code>┌─────────────────────────────────────────────────────────────────┐\\n│ Phase 0: DETECTION │\\n│ detect.py: scan_directory() → queue_files() │\\n└─────────────────────────────┬───────────────────────────────────┘\\n │\\n ▼\\n┌─────────────────────────────────────────────────────────────────┐\\n│ Phase 1: EXTRACTION │\\n│ step_extract.py → extract.py │\\n│ • Text aus PDF\/DOCX\/PPTX\/MD\/TXT │\\n│ • SHA256 Hash │\\n│ • Rotationserkennung (orientation.py) │\\n└─────────────────────────────┬───────────────────────────────────┘\\n │\\n ▼\\n┌─────────────────────────────────────────────────────────────────┐\\n│ Phase 2: LOAD │\\n│ step_load.py │\\n│ • documents Eintrag erstellen │\\n│ • document_pages speichern │\\n└─────────────────────────────┬───────────────────────────────────┘\\n │\\n ▼ (nur PDF)\\n┌─────────────────────────────────────────────────────────────────┐\\n│ Phase 3: VISION │\\n│ step_transform.py → vision.py │\\n│ • Seiten als Bilder rendern │\\n│ • llama3.2-vision:11b Analyse │\\n│ • Überschriften, Bilder, Tabellen, Layout erkennen │\\n└─────────────────────────────┬───────────────────────────────────┘\\n │\\n ▼\\n┌─────────────────────────────────────────────────────────────────┐\\n│ Phase 4: CHUNKING │\\n│ step_transform.py → chunk.py │\\n│ • Semantisches Chunking nach Struktur │\\n│ • Überlappung: 10% │\\n│ • Min: 100, Max: 2000 Zeichen │\\n└─────────────────────────────┬───────────────────────────────────┘\\n │\\n ▼ (nur PDF)\\n┌─────────────────────────────────────────────────────────────────┐\\n│ Phase 5: ENRICHMENT │\\n│ step_transform.py → enrich.py │\\n│ • Vision-Kontext zu Chunks hinzufügen │\\n└─────────────────────────────┬───────────────────────────────────┘\\n │\\n ▼\\n┌─────────────────────────────────────────────────────────────────┐\\n│ Phase 6: EMBEDDING (Layer 3) │\\n│ step_embed.py → embed.py │\\n│ • mxbai-embed-larg... [TRUNCATED-31de7417d6d0addd]"
}
]
}