{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_update",
"tool_input": {
"id": 100,
"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\n<p><strong>Status:<\/strong> Aktualisiert 2025-12-27<\/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-large (1024 dim) │\n│ • Qdrant: Collection \"documents\" │\n│ • Status: \"embedded\" ✓ SUCHBAR │\n└─────────────────────────────┬───────────────────────────────────┘\n │\n ▼\n┌─────────────────────────────────────────────────────────────────┐\n│ Phase 7: SEMANTIC (Layer 4) - Optional │\n│ step_semantic.py → analyzers\/* │\n│ • Entity-Extraktion (Anthropic oder Ollama) │\n│ • Relationen ... [TRUNCATED-9c87166e34797471]"
}
}
{
"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\\n<p><strong>Status:<\/strong> Aktualisiert 2025-12-27<\/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-large (1024 dim) │\\n│ • Qdrant: Collection \\\"documents\\\" ... [TRUNCATED-fc6505f21c90e4b7]"
}
]
}