Protokoll #12883
| ID | 12883 |
|---|---|
| Zeitstempel | 2025-12-24 11:06:03.850901 |
| Client | root |
| IP | Warning: Undefined array key "request_ip" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 |
| Modell | claude-sonnet-4-20250514 |
| Status | completed |
| Tokens | 2,632 (Input: 0, Output: 0) |
| Dauer | 94 ms |
| Request-Zeit | Warning: Undefined array key "request_timestamp" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 18 |
| Response-Zeit | - |
Warning: Undefined array key "error_message" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 22
Request
{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_get",
"tool_input": {
"id": 100
}
}
Response
{
"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> » <a href=\\\"\/docs\/prozesse\\\">Prozesse<\/a> » RAG-Prozess\\n<\/nav>\\n\\n<h1>RAG-Prozess<\/h1>\\n\\n<section>\\n <h2>Übersicht<\/h2>\\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 <h3>Dokument-Struktur<\/h3>\\n <p>Dieses Dokument enthält zwei Perspektiven:<\/p>\\n <ul>\\n <li><strong>IST-Zustand:<\/strong> Faktische Dokumentation basierend auf Code-Analyse (verifiziert 2025-12-24)<\/li>\\n <li><strong>SOLL-Architektur:<\/strong> Zielzustand und Governance-Regeln für den Systembau<\/li>\\n <\/ul>\\n<\/section>\\n\\n<section>\\n <h2>Drei-Säulen-Architektur<\/h2>\\n <table>\\n <thead><tr><th>System<\/th><th>Rolle<\/th><th>Inhalt<\/th><\/tr><\/thead>\\n <tbody>\\n <tr><td><strong>SQL-Datenbank<\/strong><\/td><td>Single Source of Truth<\/td><td>Text, Struktur, Entitäten, Aussagen, Provenienz<\/td><\/tr>\\n <tr><td><strong>Vektordatenbank<\/strong><\/td><td>Ähnlichkeitsindex<\/td><td>Embeddings für Chunk-Retrieval (keine Semantik!)<\/td><\/tr>\\n <tr><td><strong>Graph<\/strong><\/td><td>Wissensmodell<\/td><td>Entitäten, Relationen, Ontologie, Taxonomie<\/td><\/tr>\\n <\/tbody>\\n <\/table>\\n \\n <h3>Einordnung des Graphen<\/h3>\\n <p>Der Graph ist <strong>logisch primär<\/strong> als Wissensmodell, <strong>physisch jedoch aus der SQL-Quelle materialisiert<\/strong>. Er repräsentiert einen veröffentlichten, versionierten Wissenszustand - kein eigenständiges Speichersystem.<\/p>\\n<\/section>\\n\\n<!-- ============================================================== -->\\n<!-- TEIL 1: IST-ZUSTAND (Code-Analyse) -->\\n<!-- ============================================================== -->\\n\\n<hr>\\n<h1>Teil 1: IST-Zustand (Code-Analyse)<\/h1>\\n<p><em>Basierend auf Code-Analyse am 2025-12-24. Alle Angaben verifiziert gegen tatsächlichen Quellcode.<\/em><\/p>\\n\\n<!-- OFFLINE-PIPELINE IST -->\\n<section>\\n <h2>Offline-Pipeline (Import) - IST<\/h2>\\n <p><strong>Pfad:<\/strong> <code>\/var\/www\/scripts\/pipeline\/<\/code><\/p>\\n \\n <h3>Orchestrierung<\/h3>\\n <p><strong>Hauptskript:<\/strong> <code>pipeline.py<\/code><\/p>\\n <pre>\\n# CLI-Befehle\\npython pipeline.py scan # Dokumente scannen\\npython pipeline.py process # Queue abarbeiten\\npython pipeline.py embed # Ausstehende Embeddings\\npython pipeline.py all # Vollständiger Durchlauf\\npython pipeline.py file <path> # Einzeldatei verarbeiten\\npython pipeline.py status # Status anzeigen\\n <\/pre>\\n \\n <h3>Verarbeitungsfluss (process_file)<\/h3>\\n <p><strong>Quelle:<\/strong> <code>pipeline.py:32-187<\/code><\/p>\\n <pre>\\n┌─────────────┐\\n│ Extract │ extract.py - Text aus PDF\/DOCX\/PPTX\/MD\/TXT\\n└──────┬──────┘\\n │ (nur PDF)\\n ▼\\n┌─────────────┐\\n│ Vision │ vision.py - Bild\/Tabellen-Analyse mit llama3.2-vision:11b\\n└──────┬──────┘\\n │\\n ▼\\n┌─────────────┐\\n│ Chunk │ chunk.py - Semantisches Chunking nach Struktur\\n└──────┬──────┘\\n │ (nur PDF)\\n ▼\\n┌─────────────┐\\n│ Enrich │ enrich.py - Vision-Kontext zu Chunks hinzufügen\\n└──────┬──────┘\\n │\\n ▼\\n┌─────────────┐\\n│ Embed │ embed.py - Vektorisierung → Qdrant\\n└──────┬──────┘\\n │\\n ▼\\n┌─────────────┐\\n│ Analyze │ analyze.py - Entitäten, Relationen, Taxonomie\\n└─────────────┘\\n <\/pre>\\n \\n <h3>Vollständiger Durchlauf (run_full_pipeline)<\/h3>\\n <p><strong>Quelle:<\/strong> <code>pipeline.py:234-365<\/code><\/p>\\n <pre>\\nPhase 1: SCAN\\n └─ scan_directory() → Dateien mit Hash-Vergleich finden\\n └─ queue_files() → In pipeline_queue einfügen\\n\\nPhase 2: PROCESS\\n └─ get_pending_queue_items(limit=100)\\n └─ Für jedes Item: process_file() aufrufen\\n └─ Status in pipeline_queue aktualisieren\\n\\nPhase 3: EMBED REMAINING\\n └─ embed_pending_chunks() → Chunks ohne qdrant_id verarbeiten\\n <\/pre>\\n<\/section>\\n\\n<section>\\n <h2>Konfiguration - IST<\/h2>\\n <p><strong>Quelle:<\/strong> <code>config.py<\/code><\/p>\\n \\n <table>\\n <thead><tr><th>Parameter<\/th><th>Wert<\/th><th>Beschreibung<\/th><\/tr><\/thead>\\n <tbody>\\n <tr><td>NEXTCLOUD_PATH<\/td><td><code>\/var\/www\/nextcloud\/data\/root\/files\/Documents<\/code><\/td><td>Quellverzeichnis<\/td><\/tr>\\n <tr><td>SUPPORTED_EXTENSIONS<\/td><td><code>[\\\".pdf\\\", \\\".pptx\\\", \\\".docx\\\", \\\".md\\\", \\\".txt\\\"]<\/code><\/td><td>Dateitypen<\/td><\/tr>\\n <tr><td>EMBEDDING_MODEL<\/td><td><code>mxbai-embed-large<\/code><\/td><td>Ollama-Modell<\/td><\/tr>\\n <tr><td>EMBEDDING_DIMENSION<\/td><td><code>1024<\/code><\/td><td>Vektordimension<\/td><\/tr>\\n <tr><td>MAX_EMBED_CHARS<\/td><td><code>800<\/code><\/td><td>Max. Zeichen pro Embedding<\/td><\/tr>\\n <tr><td>MIN_CHUNK_SIZE<\/td><td><code>100<\/code><\/td><td>Min. Chunk-Größe<\/td><\/tr>\\n <tr><td>MAX_CHUNK_SIZE<\/td><td><code>2000<\/code><\/td><td>Max. Chunk-Größe<\/td><\/tr>\\n <tr><td>CHUNK_OVERLAP_PERCENT<\/td><td><code>10<\/code><\/td><td>Überlappung<\/td><\/tr>\\n <tr><td>DB_CONFIG.database<\/td><td><code>ki_content<\/code><\/td><td>Content-Datenbank<\/td><\/tr>\\n <tr><td>DB_LOG_CONFIG.database<\/td><td><code>ki_dev<\/code><\/td><td>Log-Datenbank<\/td><\/tr>\\n <tr><td>QDRANT_HOST<\/td><td><code>localhost<\/code><\/td><td>Qdrant-Server<\/td><\/tr>\\n <tr><td>QDRANT_PORT<\/td><td><code>6333<\/code><\/td><td>Qdrant-Port<\/td><\/tr>\\n <\/tbody>\\n <\/table>\\n \\n <h3>Qdrant Collections<\/h3>\\n <pre>\\nQDRANT_COLLECTIONS = {\\n \\\"documents\\\": {\\\"size\\\": 1024, \\\"distance\\\": \\\"Cosine\\\"},\\n \\\"mail\\\": {\\\"size\\\": 1024, \\\"distance\\\": \\\"Cosine\\\"},\\n \\\"entities\\\": {\\\"size\\\": 1024, \\\"distance\\\": \\\"Cosine\\\"}\\n}\\n <\/pre>\\n<\/section>\\n\\n<section>\\n <h2>Skript-Details - IST<\/h2>\\n \\n <h3>detect.py - Datei-Erkennung<\/h3>\\n <p><strong>Quelle:<\/strong> <code>detect.py:23-86<\/code><\/p>\\n <pre>\\nFunktion: scan_directory(path=NEXTCLOUD_PATH)\\n - Rekursiver Scan, versteckte Dateien\/Ordner ignoriert\\n - SHA-256 Hash-Berechnung pro Datei\\n - Prüfung gegen documents.file_hash\\n - Rückgabe: Liste mit {path, name, ext, size, hash, action: \\\"new\\\"|\\\"update\\\"}\\n\\nFunktion: queue_files(files)\\n - Einfügen in pipeline_queue via db.add_to_queue()\\n <\/pre>\\n \\n <h3>embed.py - Embedding<\/h3>\\n <p><strong>Quelle:<\/strong> <code>embed.py:20-116<\/code><\/p>\\n <pre>\\nFunktion: get_embedding(text)\\n - Kollabiert mehrfache Punkte (z.B. \\\"...\\\" für Inhaltsverzeichnis)\\n - Truncation bei MAX_EMBED_CHARS (800 Zeichen)\\n - POST an {OLLAMA_HOST}\/api\/embeddings\\n - Modell: mxbai-embed-large\\n\\nFunktion: store_in_qdrant(collection, point_id, vector, payload)\\n - PUT an \/collections\/{collection}\/points\\n - Payload enthält: document_id, document_title, chunk_index, \\n content (truncated 1000 chars), heading_path, source_path\\n\\nFunktion: embed_chunks(chunks, document_id, document_title, source_path)\\n - Iteriert über Chunks\\n - Erzeugt UUID v4 für Qdrant point_id\\n - Speichert in Qdrant und aktualisiert chunks.qdrant_id\\n <\/pre>\\n \\n <h3>analyze.py - Semantische Analyse<\/h3>\\n <pre>\\nFunktion: analyze_document(document_id, text, use_anthropic=True)\\n - Extrahiert Entitäten → entities Tabelle\\n - Extrahiert Relationen → entity_relations Tabelle\\n - Klassifiziert in Taxonomie → document_taxonomy Tabelle\\n - Analysiert Chunks → chunk_semantics Tabelle\\n \\nGespeicherte Felder in chunk_semantics:\\n - summary, keywords, sentiment, topics\\n - analysis_model (z.B. \\\"claude-opus-4-5-20251101\\\")\\n <\/pre>\\n<\/section>\\n\\n<section>\\n <h2>Pipeline-Konfigurationen (DB) - IST<\/h2>\\n <p><strong>Tabellen:<\/strong> <code>ki_content.pipeline_configs<\/code>, <code>ki_content.pipeline_steps<\/code><\/p>\\n \\n <h3>Bestehende Pipelines<\/h3>\\n <table>\\n <thead><tr><th>ID<\/th><th>Name<\/th><th>Steps<\/th><th>Default<\/th><th>Status<\/th><\/tr><\/thead>\\n <tbody>\\n <tr><td>1<\/td><td>Standard<\/td><td>5<\/td><td>Ja<\/td><td>Produktiv<\/td><\/tr>\\n <tr><td>2<\/td><td>Schulungsunterlagen<\/td><td>20<\/td><td>Nein<\/td><td>Spezialisiert<\/td><\/tr>\\n <\/tbody>\\n <\/table>\\n \\n <h3>Verfügbare Step-Types (ENUM)<\/h3>\\n <pre>\\ndetect, validate, page_split, vision_analyze, extract, structure,\\nsegment, chunk, metadata_store, embed, collection_setup, vector_store,\\nindex_optimize, entity_extract, relation_extract, taxonomy_build,\\nsemantic_analyze, summarize, question_generate, finalize, analyze,\\nknowledge_page, knowledge_section, knowledge_document, knowledge_validate\\n <\/pre>\\n<\/section>\\n\\n<!-- ONLINE-PIPELINE IST -->\\n<section>\\n <h2>Online-Pipeline (Query) - IST<\/h2>\\n \\n <h3>Komponenten<\/h3>\\n <table>\\n <thead><tr><th>Komponente<\/th><th>Datei<\/th><th>Verantwortung<\/th><\/tr><\/thead>\\n <tbody>\\n <tr><td>ChatController<\/td><td><code>src\/Controller\/ChatController.php<\/code><\/td><td>HTTP-Endpunkte<\/td><\/tr>\\n <tr><td>SendChatMessageUseCase<\/td><td><code>src\/UseCases\/Chat\/SendChatMessageUseCase.php<\/code><\/... [TRUNCATED-fbc693d0e1e55925]"
}
]
}