RAG-Prozess

Erstellt: 2025-12-24 | Aktualisiert: 2025-12-31

Status: Aktualisiert 2025-12-31

Übersicht

Der RAG-Prozess (Retrieval Augmented Generation) bildet das Herzstück der KI-gestützten Wissensgenerierung. Die Architektur trennt strikt zwischen Offline-Pipeline (Wissensaufbau) und Online-Pipeline (Wissenskonsum).

Grundprinzip


Offline-Pipeline: Tatsächlicher Ablauf (IST)

Pfad: /var/www/scripts/pipeline/
Orchestrator: pipeline.py
Step-Module: step_extract.py, step_load.py, step_transform.py, step_embed.py, step_semantic.py

Phase 0: Detection

StepModulBeschreibung
detectdetect.pyDateien scannen, Hash-Vergleich
queuedetect.pyNeue/geänderte Dateien in Queue

Phase 1: Extraction (pro Dokument)

StepModulBeschreibung
extractstep_extract.pyextract.pyText aus PDF/DOCX/PPTX/MD/TXT
hashstep_extract.pySHA256 Hash berechnen
rotationorientation.pySeitenrotation erkennen (PDF)

Phase 2: Load

StepModulBeschreibung
doc_createstep_load.pyDokument in documents anlegen
page_storestep_load.pySeiten in document_pages speichern

Phase 3: Vision (nur PDF)

StepModulBeschreibung
visionstep_transform.pyvision.pySeiten mit llama3.2-vision:11b analysieren
vision_storevision.pyErgebnisse in document_pages.vision_analysis

Phase 4: Chunking

StepModulBeschreibung
chunkstep_transform.pychunk.pyText in semantische Chunks zerlegen
chunk_storestep_load.pyChunks in chunks speichern

Phase 5: Enrichment (nur PDF)

StepModulBeschreibung
enrichstep_transform.pyenrich.pyVision-Kontext zu Chunks hinzufügen

Phase 6: Embedding (Layer 3 - Dokument wird suchbar)

StepModulBeschreibung
embedstep_embed.pyembed.pyEmbeddings mit mxbai-embed-large
qdrant_storeembed.pyVektoren in Qdrant speichern
status_embeddedstep_load.pyStatus = "embedded"

Nach Phase 6 ist das Dokument im Chat suchbar!

Phase 7: Semantic Analysis (Layer 4 - optional/async)

StepModulBeschreibung
entity_extractanalyzers/entity_extractor.pyEntitäten extrahieren (Anthropic/Ollama)
entity_storeanalyzers/entity_extractor.pyEntitäten in entities speichern
entity_normalizeanalyzers/entity_normalizer.pycanonical_name setzen
relation_extractanalyzers/relation_extractor.pyRelationen extrahieren
relation_storeanalyzers/document_analyzer.pyIn entity_relations speichern
taxonomy_classifyanalyzers/taxonomy_classifier.pyTaxonomie-Kategorien zuweisen
ontology_classifyanalyzers/ontology_classifier.pyOntologie-Klassen zuweisen
chunk_entity_linkanalyzers/document_analyzer.pyChunks mit Entitäten verknüpfen
chunk_taxonomyanalyzers/document_analyzer.pyTaxonomie auf Chunks propagieren
entity_taxonomyanalyzers/document_analyzer.pyTaxonomie auf Entitäten
chunk_semanticsanalyzers/semantic_analyzer.pyChunk-Semantik analysieren

Phase 8: Finalization

StepModulBeschreibung
status_donestep_load.pyStatus = "done"

Datenfluss-Diagramm

┌─────────────────────────────────────────────────────────────────┐
│ Phase 0: DETECTION                                               │
│ detect.py: scan_directory() → queue_files()                     │
└─────────────────────────────┬───────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 1: EXTRACTION                                              │
│ step_extract.py → extract.py                                    │
│   • Text aus PDF/DOCX/PPTX/MD/TXT                               │
│   • SHA256 Hash                                                 │
│   • Rotationserkennung (orientation.py)                         │
└─────────────────────────────┬───────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 2: LOAD                                                    │
│ step_load.py                                                    │
│   • documents Eintrag erstellen                                 │
│   • document_pages speichern                                    │
└─────────────────────────────┬───────────────────────────────────┘
                              │
                              ▼ (nur PDF)
┌─────────────────────────────────────────────────────────────────┐
│ Phase 3: VISION                                                  │
│ step_transform.py → vision.py                                   │
│   • Seiten als Bilder rendern                                   │
│   • llama3.2-vision:11b Analyse                                 │
│   • Überschriften, Bilder, Tabellen, Layout erkennen            │
└─────────────────────────────┬───────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 4: CHUNKING                                                │
│ step_transform.py → chunk.py                                    │
│   • Semantisches Chunking nach Struktur                         │
│   • Überlappung: 10%                                            │
│   • Min: 100, Max: 2000 Zeichen                                 │
└─────────────────────────────┬───────────────────────────────────┘
                              │
                              ▼ (nur PDF)
┌─────────────────────────────────────────────────────────────────┐
│ Phase 5: ENRICHMENT                                              │
│ step_transform.py → enrich.py                                   │
│   • Vision-Kontext zu Chunks hinzufügen                         │
└─────────────────────────────┬───────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 6: EMBEDDING (Layer 3)                                     │
│ step_embed.py → embed.py                                        │
│   • mxbai-embed-large (1024 dim)                                │
│   • Qdrant: Collection "documents"                              │
│   • Status: "embedded" ✓ SUCHBAR                                │
└─────────────────────────────┬───────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 7: SEMANTIC (Layer 4) - Optional                           │
│ step_semantic.py → analyzers/*                                  │
│   • Entity-Extraktion (Anthropic oder Ollama)                   │
│   • Relationen                                                  │
│   • Taxonomie-Klassifikation                                    │
│   • Ontologie-Zuordnung                                         │
│   • Chunk-Semantik (summary, keywords, sentiment)               │
└─────────────────────────────┬───────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 8: FINALIZATION                                            │
│   • Status: "done" ✓                                            │
└─────────────────────────────────────────────────────────────────┘

Konfiguration

Quelle: config.py

ParameterWertBeschreibung
NEXTCLOUD_PATH/var/www/nextcloud/data/root/files/DocumentsQuellverzeichnis
SUPPORTED_EXTENSIONS[".pdf", ".pptx", ".docx", ".md", ".txt"]Dateitypen
EMBEDDING_MODELmxbai-embed-largeOllama Embedding-Modell
EMBEDDING_DIMENSION1024Vektordimension
MIN_CHUNK_SIZE100Min. Chunk-Größe
MAX_CHUNK_SIZE2000Max. Chunk-Größe
CHUNK_OVERLAP_PERCENT10Überlappung
OCR_ENABLEDTrueOCR für Scans
OCR_LANGUAGEdeuOCR-Sprache
ROTATION_DETECTION_ENABLEDTrueSeitenrotation erkennen
ROTATION_OSD_CONFIDENCE_THRESHOLD2.0OSD Confidence-Schwelle
SEMANTIC_SYNCTrueSynchrone Semantik-Analyse
SEMANTIC_USE_ANTHROPICFalseAnthropic oder Ollama

Datei-Referenzen

Pipeline-Kern

/var/www/scripts/pipeline/
├── pipeline.py           # Orchestrator
├── config.py             # Konfiguration
├── db.py                 # Datenbank-Wrapper
├── detect.py             # Datei-Erkennung
├── extract.py            # Text-Extraktion
├── orientation.py        # Rotationserkennung (NEU!)
├── chunk.py              # Chunking
├── embed.py              # Embedding
├── vision.py             # Vision-Analyse
├── enrich.py             # Vision-Enrichment

Step-Module

├── step_extract.py       # Extraktions-Step
├── step_load.py          # Lade-Step
├── step_transform.py     # Transform-Step (Vision, Chunk, Enrich)
├── step_embed.py         # Embedding-Step
└── step_semantic.py      # Semantik-Step

Analyzer-Module

├── analyzers/
│   ├── document_analyzer.py     # Haupt-Orchestrator
│   ├── entity_extractor.py      # Entitäten
│   ├── entity_normalizer.py     # Normalisierung
│   ├── relation_extractor.py    # Relationen
│   ├── taxonomy_classifier.py   # Taxonomie
│   ├── ontology_classifier.py   # Ontologie
│   ├── semantic_analyzer.py     # Chunk-Semantik
│   └── statement_analyzer.py    # SPO-Aussagen

CLI-Befehle

# Vollständiger Durchlauf
python pipeline.py all

# Mit Tracking (für Web-UI)
python pipeline.py all --pipeline-id=4 --run-id=6

# Einzelne Phasen
python pipeline.py scan      # Nur scannen
python pipeline.py process   # Queue abarbeiten
python pipeline.py embed     # Ausstehende Embeddings
python pipeline.py semantic 123  # Semantik für Dokument 123
python pipeline.py status    # Status anzeigen

# Einzeldatei
python pipeline.py file /path/to/document.pdf

Datenbank-Tabellen

Content-Datenbank (ki_content)

TabelleZweck
documentsImportierte Dokumente
document_pagesEinzelne Seiten mit Vision-Analyse
chunksText-Chunks
entitiesExtrahierte Entitäten
entity_relationsRelationen zwischen Entitäten
chunk_entitiesChunk-Entity-Verknüpfungen
chunk_semanticsChunk-Analyse (summary, keywords)
taxonomy_termsTaxonomie-Begriffe
document_taxonomyDokument-Taxonomie-Zuordnung
entity_taxonomy_mappingEntity-Taxonomie-Zuordnung
ontology_classesOntologie-Klassen
pipeline_configsPipeline-Konfigurationen
pipeline_stepsPipeline-Schritte
pipeline_runsPipeline-Ausführungen
pipeline_queuePipeline-Warteschlange
semantic_queueSemantik-Warteschlange

Dev-Datenbank (ki_dev)

TabelleZweck
pipeline_logPipeline-Logs

Referenz

Verwandte Themen

Erstellt: 2025-12-24 | Aktualisiert: 2025-12-24

Dokument-Import (Phase 0-1)

Ziel

Ein Dokument wird kontrolliert übernommen, eindeutig identifiziert und unverändert archiviert. Der extrahierte Inhalt wird vollständig und reproduzierbar in der SQL-Datenbank als Single Source of Truth gespeichert.

Eingangskanäle

Akzeptierte Formate

Identität und Versionierung

KonzeptBeschreibung
Content HashPrimäre Dublettenerkennung über SHA256 der Originaldatei
Dokumenten-IDStabile, systemgenerierte ID über gesamten Lebenszyklus
VersionierungNeue Version bei geändertem Inhalt, referenziert Original-ID

Archivierung

Die Originaldatei wird unverändert archiviert und dient als Quelle für Reprocessing:

Textgewinnung

Normalisierung

Beteiligte Komponenten

KomponentePfadFunktion
Content Pipeline/content-pipelineWeb-UI für Imports
import_pdf()pipeline/import_pipeline.pyPDF-Extraktion
documents-Tabelleki_content.documentsDokument-Metadaten
document_pageski_content.document_pagesSeitenweise Extraktion

Datenbank-Schema

documents:
  id, filename, source_path, file_size, content_hash,
  page_count, status, version, created_at

document_pages:
  id, document_id, page_number, content, 
  metadata, created_at

Prüfbedingungen für Supervision

Erstellt: 2025-12-24 | Aktualisiert: 2025-12-24

Chunking (Phase 2-3)

Ziel

Der gespeicherte Volltext wird in explizite Struktureinheiten zerlegt und daraus technisch handhabbare Verarbeitungseinheiten (Chunks) erzeugt. Chunking ist eine technische Maßnahme, keine semantische Interpretation.

Phase 2: Strukturelle Zerlegung

Seitenzerlegung

Semantische Abschnitte

Phase 3: Chunk-Erzeugung

Chunking-Regeln

ParameterWertBeschreibung
chunk_size500-800 TokenZielgröße pro Chunk
overlap50-100 TokenÜberlappung für Kontextstabilisierung
max_embed_chars800 ZeichenLimit für mxbai-embed-large

Erzeugungsregeln

Semantische Rolle

Jedem Chunk wird eine semantische Rolle zugewiesen:

Chunk-Metadaten

Beteiligte Komponenten

KomponentePfadFunktion
chunk_document()pipeline/chunk.pyChunking-Logik
chunks-Tabelleki_content.chunksChunk-Speicherung (SQL = Source of Truth)

Datenbank-Schema

chunks:
  id, document_id, section_id, chunk_index, content,
  token_count, heading_path, semantic_role, metadata,
  qdrant_id, created_at

Prüfbedingungen für Supervision

Erstellt: 2025-12-24 | Aktualisiert: 2025-12-24

Embedding-Generierung

Funktion

Eingabe

Ausgabe

Embedding-Modell

EigenschaftWert
Modellmxbai-embed-large
AnbieterOllama (lokal)
Dimensionen1536
Max Context512 Token (~800 Zeichen)
SprachenMultilingual (inkl. Deutsch)

Beteiligte Komponenten

KomponentePfadFunktion
get_embedding()pipeline/embed.py:20Embedding via Ollama API
Ollama APIlocalhost:11434Lokaler Embedding-Service
config.pypipeline/config.pyEMBEDDING_MODEL, EMBEDDING_DIMENSION

Ablauf

  1. Chunk-Text laden
  2. Text bereinigen (Punktfolgen reduzieren)
  3. Auf 800 Zeichen truncaten falls nötig
  4. POST an Ollama /api/embeddings
  5. Vektor aus Response extrahieren
  6. Weiter an Vektorspeicherung

Code-Beispiel

# pipeline/embed.py
def get_embedding(text):
    response = requests.post(
        f"{OLLAMA_HOST}/api/embeddings",
        json={"model": EMBEDDING_MODEL, "prompt": text},
        timeout=60
    )
    return response.json().get("embedding")

Fehlerbehandlung

Vektorspeicherung (Phase 4)

Ziel

Chunks werden in einen mathematischen Ähnlichkeitsraum überführt. Die Vektordatenbank dient ausschließlich dem Auffinden inhaltlich ähnlicher Chunks. Sie ist kein Wissensspeicher und trägt keine semantische Wahrheit.

Vektorisierung

Qdrant-Konfiguration

EigenschaftWert
Hostlocalhost:6333
Dimensionen1536
Distance MetricCosine
Collectionsdocuments, system-docs

Payload-Struktur (erlaubt)

{
  "chunk_id": 1234,
  "document_id": 42,
  "section_id": 15,
  "language": "de",
  "document_type": "pdf"
}

Payload enthält KEINE

Rolle der Vektordatenbank

Wird genutzt fürWird NICHT genutzt für
ÄhnlichkeitssucheFaktenhaltung
KontextretrievalSchlussfolgerung
Vorfilterung relevanter ChunksKonsistenzprüfung

Abgrenzung zur Semantik

Beteiligte Komponenten

KomponentePfadFunktion
store_in_qdrant()pipeline/embed.py:47Speicherung via REST API
Qdrant REST APIPUT /collections/{name}/pointsUpsert Points

Prüfbedingungen für Supervision

Anfrage-Verarbeitung (Phase A0-A1)

Grundsatz

Der Abfrageprozess ist kein Spiegel der Importpipeline. Er ist ein konsumierender Prozess, der ausschließlich auf bereits validierten, versionierten Zuständen arbeitet.

Phase A0: Anfrage-Eingang und Kontextdefinition

Ziel

Eindeutige Definition dessen, was gefragt wird und in welchem Rahmen.

Ablauf

  1. Eine Anfrage wird vom Nutzer über eine Anwendung initiiert:
    • KI-Chat
    • Content Studio
  2. Die Anfrage besteht aus:
    • Primärfrage oder Briefing
    • Anwendungs-Kontext
    • optionalen Parametern
  3. Kontextparameter sind explizit:
    • Ziel-Collection(s)
    • gewünschte Kontext-Tiefe (top_k)
    • Modellwahl
    • Token-Limits
  4. Die Anfrage wird als Abfrageobjekt behandelt, nicht als Textfragment

Ergebnisartefakte

Phase A1: Anfrage-Einbettung

Ziel

Überführung der Anfrage in einen Suchvektor für Ähnlichkeitsretrieval.

Ablauf

  1. Der Anfragetext wird technisch normalisiert
  2. Die Anfrage wird mit demselben Embedding-Modell eingebettet wie die Chunks
  3. Es entsteht genau ein Query-Vektor

Abgrenzung

Ergebnisartefakte

Beteiligte Komponenten

KomponentePfadFunktion
ChatControllersrc/Controller/ChatController.phpAnfrage-Entgegennahme
ContentControllersrc/Controller/ContentController.phpBriefing-Verarbeitung
get_embedding()pipeline/embed.pyQuery-Embedding

Prüfbedingungen für Supervision

Vektorbasierte Vorselektion (Phase A2)

Ziel

Reduktion des Suchraums auf potenziell relevante Chunks. Dies ist eine Vorselektion, keine Wahrheitsfindung.

Ablauf

  1. Der Query-Vektor wird gegen die definierte Collection gesucht
  2. Die Vektordatenbank liefert:
    • Chunk-Referenzen (IDs)
    • Relevanz-Scores (Cosine Similarity)
  3. Es werden ausschließlich Chunk-IDs und Payload-Metadaten verwendet
  4. Anzahl der Ergebnisse wird durch top_k begrenzt

Kritische Abgrenzung

Scores sindScores sind NICHT
DistanzmaßeWahrheitsmaße
HeuristischSemantisch valide
VorselektionEndergebnis

Ähnlichkeit ≠ Relevanz ≠ Wahrheit

Qdrant-Abfrage

POST /collections/documents/points/search
{
  "vector": [0.123, -0.456, ...],  // 1536 Dimensionen
  "limit": 10,
  "with_payload": true,
  "filter": {
    "must": [
      {"key": "collection", "match": {"value": "documents"}}
    ]
  }
}

Ergebnisartefakte

Beteiligte Komponenten

KomponentePfadFunktion
search_similar()pipeline/rag.pyQdrant-Suche
Qdrant REST APIlocalhost:6333Vektor-Suche

Prüfbedingungen für Supervision

Kontext-Aufbau (Phase A4-A5)

Phase A4: Kontext-Selektion und Priorisierung

Ziel

Zusammenstellung eines sinnvollen, begrenzten Arbeitskontextes aus den nachgeladenen Chunks.

Ablauf

  1. Chunks werden priorisiert nach:
    • Relevanz-Score (aus Vorselektion)
    • Dokumentenvielfalt (nicht alle Chunks aus einem Dokument)
    • Redundanzfreiheit (keine inhaltlichen Dopplungen)
  2. Auswahl erfolgt bis zum:
    • Token-Limit (Modell-abhängig)
    • Kontext-Limit (konfiguriert als top_k)
  3. Reihenfolge wird festgelegt und stabilisiert

Abgrenzung

Ergebnisartefakte

Phase A5: Kontext-Formalisierung

Ziel

Übersetzung der ausgewählten Chunks in ein LLM-verwertbares Kontextformat.

Ablauf

  1. Jeder Chunk wird versehen mit:
    • Quellenkennzeichnung (z.B. [Quelle 1])
    • Dokumentenreferenz (Dateiname, Seite)
  2. Trennmarker werden eingefügt zwischen Chunks
  3. Token-Limits werden technisch geprüft

Kontextformat

[Quelle 1: Systemisches Coaching.pdf, S. 12]
Die Auftragsklärung ist der erste Schritt im Coaching-Prozess...

---

[Quelle 2: Methodenhandbuch.pdf, S. 45]
Skalenfragen ermöglichen eine differenzierte Einschätzung...

---

[Quelle 3: Grundlagen der Systemik.pdf, S. 8]
Ressourcenorientierung bedeutet, den Fokus auf vorhandene Stärken...

Ergebnisartefakte

Beteiligte Komponenten

KomponentePfadFunktion
build_context()pipeline/rag.pyKontext-Zusammenstellung
format_sources()pipeline/rag.pyQuellenformatierung

Prüfbedingungen für Supervision

Kanonisches SQL-Nachladen (Phase A3)

Ziel

Rückführung der vorselektierten Chunks in den kanonischen Datenbestand. Ab dieser Phase spielt die Vektordatenbank keine Rolle mehr.

Grundprinzip

Kein Vertrauen in Payload-Content. Die Vektordatenbank liefert nur IDs. Der tatsächliche Content wird ausschließlich aus der SQL-Datenbank geladen.

Ablauf

  1. Für jede Chunk-ID werden aus der SQL-Datenbank geladen:
    • Chunk-Text (vollständig)
    • Dokumenten-Referenz
    • Abschnitts-Referenz
    • Provenienzinformationen
  2. Die Vektordatenbank spielt keine Rolle mehr
  3. SQL ist alleinige Quelle der Wahrheit

SQL-Abfrage

SELECT 
    c.id, c.content, c.heading_path, c.token_count,
    d.id AS document_id, d.filename, d.source_path,
    dp.page_number
FROM chunks c
JOIN documents d ON c.document_id = d.id
LEFT JOIN document_pages dp ON c.page_id = dp.id
WHERE c.id IN (?, ?, ?, ...)

Warum nicht direkt aus Qdrant-Payload?

Qdrant-PayloadSQL-Datenbank
Kann veraltet seinIst kanonisch und aktuell
Keine VersionierungVersioniert und nachvollziehbar
Keine ProvenienzVollständige Quellenreferenz
Optimiert für SucheOptimiert für Wahrheit

Ergebnisartefakte

Beteiligte Komponenten

KomponentePfadFunktion
ChunkRepositorysrc/Infrastructure/SQL-Abfrage
chunks-Tabelleki_content.chunksChunk-Speicher
documents-Tabelleki_content.documentsDokument-Metadaten

Prüfbedingungen für Supervision

LLM-Generierung (Phase A7)

Ziel

Erzeugung einer Antwort auf Basis des bereitgestellten Kontextes. Das LLM ist reiner Formulierer, kein Wissensproduzent.

Grundprinzip

Ablauf

  1. Prompt wird an das gewählte LLM übergeben
  2. LLM generiert Text innerhalb:
    • Token-Limit (max_tokens)
    • Temperature (Kreativität vs. Präzision)
    • Systemregeln (aus System-Prompt)
  3. Ausgabe wird nicht verändert oder nachbearbeitet

Modell-Konfiguration

ModellAnbieterEinsatz
Claude Sonnet 4Anthropic APIProduktion (Chat, Content)
Claude Opus 4.5Anthropic APIKomplexe Aufgaben
MistralOllama (lokal)Entwicklung, Tests
Gemma 2Ollama (lokal)Schnelle Aufgaben

API-Aufruf (Claude)

POST https://api.anthropic.com/v1/messages
{
  "model": "claude-sonnet-4-20250514",
  "max_tokens": 4096,
  "system": "Du bist ein hilfreicher Assistent...",
  "messages": [
    {"role": "user", "content": "[Kontext]\n...\n[Frage]\n..."}
  ]
}

Ergebnisartefakte

Beteiligte Komponenten

KomponentePfadFunktion
generate_response()pipeline/rag.pyLLM-Aufruf
AnthropicClientpipeline/llm_client.pyClaude API
OllamaClientpipeline/llm_client.pyLokale Modelle

Prüfbedingungen für Supervision

Prompt-Komposition (Phase A6)

Ziel

Zusammenführung von Kontext, Anfrage und Steuerinformationen zu einem vollständigen, reproduzierbaren Prompt.

Ablauf

  1. System-Prompt definiert:
    • Rolle des Assistenten
    • Verhaltensregeln
    • Antwortgrenzen und -format
  2. Kontext-Block enthält:
    • Formatierte Chunks mit Quellenreferenzen
    • Trennmarker
  3. User-Prompt enthält:
    • Originalfrage oder Briefing
    • Eventuell Anweisungen zur Antwortstruktur

Prompt-Struktur

┌─────────────────────────────────────┐
│ SYSTEM-PROMPT                       │
│ - Rolle: "Du bist ein Assistent..." │
│ - Regeln: "Antworte nur basierend   │
│   auf den bereitgestellten Quellen" │
│ - Format: "Strukturiere deine       │
│   Antwort mit Überschriften"        │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ KONTEXT                             │
│ [Quelle 1: ...]                     │
│ Text aus Chunk 1...                 │
│ ---                                 │
│ [Quelle 2: ...]                     │
│ Text aus Chunk 2...                 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ USER-PROMPT                         │
│ "Erkläre mir die Auftragsklärung    │
│ im systemischen Coaching."          │
└─────────────────────────────────────┘

Kritische Abgrenzung

Anwendungsspezifische Varianten

AnwendungSystem-Prompt Fokus
KI-ChatKonversationell, quellenbasiert
Content StudioStrukturiert, Briefing-orientiert
Kritik-RundeAnalytisch, bewertend

Ergebnisartefakte

Beteiligte Komponenten

KomponentePfadFunktion
compose_prompt()pipeline/rag.pyPrompt-Zusammenstellung
Prompts-Tabelleki_dev.promptsSystem-Prompt Templates

Prüfbedingungen für Supervision

KI-Chat Anwendung (Phase A8)

Ziel

Nachvollziehbare Übergabe der Antwort an den Nutzer mit vollständiger Quellenrückverfolgung.

Grundprinzip: Transparenz als Prozessbestandteil

Transparenz ist kein UI-Feature, sondern Prozessbestandteil. Jede Antwort ist auf ihre Quellen rückführbar.

Ablauf

  1. Antwort wird in der Chat-Oberfläche angezeigt
  2. Verwendete Quellen werden explizit ausgewiesen
  3. Speicherung in Session:
    • Nachricht (Frage + Antwort)
    • Verwendete Chunks
    • Modell und Token-Verbrauch
  4. Session kann exportiert werden (JSON/Markdown)

Session-Struktur

chat_sessions:
  id (UUID), title, model, created_at, updated_at

chat_messages:
  id, session_id, role (user/assistant), 
  content, created_at

chat_sources:
  id, message_id, chunk_id, document_id,
  relevance_score, document_name

Quellenanzeige

Jede Antwort zeigt die verwendeten Quellen:

┌────────────────────────────────────┐
│ Antwort des Assistenten            │
│ ...                                │
├────────────────────────────────────┤
│ Quellen:                           │
│ [1] Systemisches Coaching.pdf, S.12│
│ [2] Methodenhandbuch.pdf, S.45     │
│ [3] Grundlagen der Systemik.pdf    │
└────────────────────────────────────┘

Beteiligte Komponenten

KomponentePfadFunktion
ChatControllersrc/Controller/ChatController.phpRequest/Response
ChatRepositorysrc/Infrastructure/Session-Speicherung
chat/show.phpsrc/View/chat/Chat-UI

Datenbank

Export-Formate

FormatInhalt
JSONVollständige Session mit Metadaten
MarkdownLesbares Protokoll

Prüfbedingungen für Supervision

Semantische Roh-Extraktion (Phase 5)

Ziel

Aus Chunk-Texten werden bedeutungstragende Elemente erkannt. Diese Phase dient der vollständigen Erfassung potenzieller semantischer Signale. Korrektheit, Konsistenz und Vereinheitlichung sind ausdrücklich nicht Ziel dieser Phase.

Eingangsbasis

Analyseverfahren

Chunk-Texte werden mit festgelegten, versionierten Verfahren verarbeitet:

Entitätsextraktion

Alle erkennbaren Entitäten werden extrahiert:

EntitätstypBeispiele
PersonenNamen, Rollen, Titel
OrganisationenFirmen, Institute, Verbände
OrteStädte, Länder, Gebäude
FachbegriffeDomänenspezifische Konzepte
Sonstige KonzepteAbstrakte benennbare Einheiten

Wichtig

Relationsextraktion

Roh-Aussagen

Textuelle Aussagen werden als Rohformen identifiziert:

{
  "subject": "Systemisches Coaching",
  "predicate": "basiert auf",
  "object": "konstruktivistischer Grundhaltung"
}

Temporärer Status

Abgrenzung zur Persistenz

Ergebnisartefakte

Prüfbedingungen für Supervision

Content Studio Anwendung (Phase A8)

Ziel

Strukturierte Content-Erstellung mit RAG-gestützter Generierung, Kritik-Runden und Versionierung.

Workflow-Phasen

  1. Auftrag erstellen - Briefing definieren
  2. Content generieren - RAG-basierte Erstgenerierung
  3. Kritik-Runde - Automatisierte Qualitätsprüfung
  4. Revision - Überarbeitung basierend auf Kritik
  5. Freigabe - Genehmigung oder Ablehnung

Auftrag-Struktur

content_orders:
  id, title, briefing, status,
  model, collections, context_limit,
  profile_id, contract_id, structure_id,
  created_at, updated_at

Versionierung

Jede Generierung erzeugt eine neue Version:

content_versions:
  id, order_id, version_number,
  content, model_used,
  tokens_input, tokens_output,
  created_at

Kritik-System

Automatisierte Qualitätsprüfung durch konfigurierte Kritiker:

KritikerFokusSchwelle
FaktenprüferQuellenvalidierung, Konsistenz7/10
StilistSprache, Lesbarkeit, Struktur7/10
StrukturanalystRoter Faden, Kohärenz7/10

Kritik-Ergebnis

content_critiques:
  id, version_id, critic_name, round,
  rating, passed, issues, suggestions,
  summary, created_at

Quellen-Tracking

Alle verwendeten RAG-Quellen werden persistiert:

content_sources:
  id, version_id, chunk_id, document_id,
  document_name, relevance_score

Status-Flow

draft → generate → critique → revision → validate → approved
                      ↓                      ↓
                   revision              declined

Beteiligte Komponenten

KomponentePfadFunktion
ContentControllersrc/Controller/ContentController.phpAuftrags-Management
GenerateContentUseCasesrc/UseCases/Content-Generierung
CritiqueContentUseCasesrc/UseCases/Kritik-Durchführung
ContentRepositorysrc/Infrastructure/Persistenz

Datenbank

Prüfbedingungen für Supervision

Normalisierung und Konsolidierung (Phase 6)

Ziel

Aus temporären Rohdaten entsteht ein konsistenter, referenzierbarer Wissensbestand. Diese Phase überführt extrahierte Signale in stabile Entitäten und Relationen. Ab hier beginnt semantische Verlässlichkeit.

Eingangsbasis

Normalisierung von Entitäten

Entitäten werden sprachlich und formal normalisiert:

NormalisierungBeispiel
Schreibweisen"SystemCoaching" → "System-Coaching"
Abkürzungen"NLP" → "Neuro-Linguistisches Programmieren"
Synonyme"Klient", "Coachee" → kanonische Form
Singular/Plural"Coaches" → "Coach"

Normalisierung verändert die Darstellung, nicht die Bedeutung.

Koreferenzauflösung

Vergabe stabiler Identitäten

EigenschaftBeschreibung
Entity-IDSystemweit eindeutig
StabilitätUnabhängig von Textvarianten oder Fundstellen
WiederverwendungEinmal vergeben, nie wiederverwendet

Konsolidierung von Relationen

Dublettenerkennung und Bereinigung

Persistenz

Abgrenzung zur Ontologie

Ergebnisartefakte

Prüfbedingungen für Supervision

Semantische Aussagen als Graphkern (Phase 7)

Ziel

Explizite Bedeutung entsteht. Diese Phase bildet den eigentlichen Wissenskern des Systems. Der Graph entsteht hier als Datenmodell, unabhängig von der konkreten Speichertechnologie.

Grundprinzip

Modellierung von Aussagen

Bestandteile einer Aussage

KomponenteBeschreibung
EntitätenBeteiligte Entitäten mit stabilen Entity-IDs
RelationKlar typisierte Beziehung
Aussage-TypDefinition, Faktische Behauptung, Regel, Beschreibung, Beispiel
KontextThematischer Rahmen, zeitlicher Bezug, Geltungsraum
Modalitätbehauptend, einschränkend, hypothetisch, normativ, zitierend

Aussage-Typ

Der Aussage-Typ beschreibt die Art der Behauptung:

Der Typ beeinflusst nicht den Wahrheitsgehalt, sondern die Interpretierbarkeit.

Kontext

Der Kontext beschreibt die Geltungsbedingungen der Aussage:

Kontext ist explizit modelliert und nicht implizit aus dem Text abzuleiten.

Modalität

Die Modalität beschreibt den Aussagecharakter:

Modalität macht Aussagen vergleichbar und widerspruchsfähig.

Graphbildung

Abgrenzung

Persistenz

Prüfbedingungen für Supervision

Ontologie (Phase 8)

Ziel

Entitäten und Aussagen werden in ein explizites Weltmodell eingeordnet. Die Ontologie definiert die begriffliche Struktur dessen, was im System existieren darf. Sie schafft semantische Stabilität über einzelne Dokumente hinaus.

Grundprinzip

Ontologie-Klassen

Ontologie-Klassen werden explizit modelliert:

AttributBeschreibung
KlassennameEindeutig, z.B. "Coaching-Methode"
BeschreibungFormale Definition der Klasse
VersionVersioniert und eindeutig identifizierbar

Klassen besitzen keine Textfragmente und keine Dokumentabhängigkeit.

Beispiel-Ontologie (Systemisches Coaching)

Coaching-Konzept
├── Methode (z.B. Auftragsklärung, Zielarbeit)
├── Haltung (z.B. Ressourcenorientierung, Wertschätzung)
├── Intervention (z.B. Skalenfrage, Wunderfrage)
└── Kontext (z.B. Einzelcoaching, Teamcoaching)

Person
├── Coach
├── Klient
└── Auftraggeber

Zuordnung von Entitäten

Stabilität und Erweiterung

Abgrenzung zur Taxonomie

OntologieTaxonomie
Definiert KlassenDefiniert Hierarchien
"Was existiert?""Wie sind Klassen geordnet?"
Keine ist-ein-Beziehungenist-ein, Teil-von, gehört-zu

Abgrenzung zur Semantik

Persistenz

Ergebnisartefakte

Prüfbedingungen für Supervision

Taxonomie (Phase 9)

Ziel

Ontologie-Klassen werden in eine explizite Ordnungsstruktur gebracht. Die Taxonomie definiert Hierarchien und Zugehörigkeiten zwischen Klassen. Sie dient der Navigation, Aggregation und systematischen Einordnung.

Grundprinzip

Taxonomische Beziehungen

Erlaubte Beziehungstypen sind explizit definiert:

BeziehungBedeutungBeispiel
ist-einSpezialisierung/GeneralisierungSkalenfrage ist-ein Intervention
Teil-vonKomposition/AggregationAuftragsklärung Teil-von Coaching-Prozess
gehört-zuZugehörigkeit/KontextWunderfrage gehört-zu Lösungsfokussierung

Andere Beziehungstypen sind in der Taxonomie nicht zulässig.

Aufbau der Hierarchie


Implementierung: Taxonomie-Mapping (2025-12-25)

Übersicht

Die Taxonomie-Mapping-Komponenten ermöglichen die Zuordnung von Chunks und Entities zu Taxonomie-Begriffen. Dies erweitert die klassische Taxonomie um eine semantische Verknüpfungsschicht.

Domain Layer

KomponenteDateiBeschreibung
ChunkTaxonomyMapping src/Domain/Entity/ChunkTaxonomyMapping.php Entity für Chunk → Taxonomie-Term Zuordnung mit Confidence und Source
EntityTaxonomyMapping src/Domain/Entity/EntityTaxonomyMapping.php Entity für Entity → Taxonomie-Term Zuordnung mit Relevance und Validierungsstatus
Confidence src/Domain/ValueObject/Confidence.php Value Object für Konfidenzwerte (0.0-1.0) mit Hilfsmethoden
MappingSource src/Domain/ValueObject/MappingSource.php Enum für Mapping-Quelle: auto (Pipeline) oder manual (User)

Repository Interfaces

InterfaceDateiMethoden
ChunkTaxonomyRepositoryInterface src/Domain/Repository/ findByChunkId, findByTaxonomyTermId, save, delete, deleteByChunkId, getUnmappedChunks, exists, countByTaxonomyTerm
EntityTaxonomyRepositoryInterface src/Domain/Repository/ findByEntityId, findByTaxonomyTermId, save, delete, deleteByEntityId, getUnvalidatedMappings, markAsValidated, exists, getValidationStats

UseCases

UseCaseDateiMethoden
AssignChunkTaxonomyUseCase src/UseCases/Taxonomy/ execute(chunkId, termId, confidence, source), batchAssign()
AssignEntityTaxonomyUseCase src/UseCases/Taxonomy/ execute(entityId, termId, relevance), validateMapping(), batchAssign(), getValidationStats()
GetTaxonomyOverviewUseCase src/UseCases/Taxonomy/ execute(), getUnmappedChunks(), getUnvalidatedEntityMappings(), getTaxonomyTermUsage(), getTermsWithUsage()
EnhancedSearchUseCase src/UseCases/Search/ execute(query, taxonomyTermIds, includeChildTerms), searchInTaxonomy(), getSuggestionsForQuery()

Python Pipeline Integration

Die Pipeline erweitert die Analyse um automatische Taxonomie-Zuweisungen:

# db.py - Neue Funktionen
db.add_chunk_taxonomy(chunk_id, term_id, confidence, source)
db.get_chunk_taxonomies(chunk_id)
db.add_entity_taxonomy(entity_id, term_id, relevance, validated)
db.get_entity_taxonomies(entity_id)
db.get_taxonomy_terms()

# document_analyzer.py - Neue Funktionen
propagate_taxonomy_to_chunks(document_id, taxonomy)
assign_entity_taxonomy(document_id, entities, taxonomy)

Datenfluss

Dokument-Analyse
      │
      ▼
┌─────────────────────────────────────────┐
│ classify_taxonomy() → document_taxonomy │
└─────────────────────┬───────────────────┘
                      │
        ┌─────────────┴─────────────┐
        ▼                           ▼
┌───────────────────┐    ┌────────────────────┐
│ propagate_to_     │    │ assign_entity_     │
│ chunks()          │    │ taxonomy()         │
│ → chunk_taxonomy  │    │ → entity_taxonomy_ │
│                   │    │   mapping          │
└───────────────────┘    └────────────────────┘

Contract: taxonomy-mapping-contract

Qualitätsregeln für Taxonomie-Mappings (Contract ID: 12):


Beispiel-Taxonomie

Coaching-Konzept (Wurzel)
├── ist-ein → Methode
│   ├── ist-ein → Auftragsklärung
│   ├── ist-ein → Zielarbeit
│   └── ist-ein → Ressourcenaktivierung
├── ist-ein → Intervention
│   ├── ist-ein → Fragetechnik
│   │   ├── ist-ein → Skalenfrage
│   │   └── ist-ein → Wunderfrage
│   └── ist-ein → Reflexion
└── ist-ein → Haltung
    ├── ist-ein → Ressourcenorientierung
    └── ist-ein → Allparteilichkeit

Abgrenzung zur Ontologie

Abgrenzung zur Semantik

Versionierung

Persistenz

Ergebnisartefakte

Prüfbedingungen für Supervision

Provenienz und Nachvollziehbarkeit (Phase 10)

Ziel

Jede semantische Einheit ist vollständig rückverfolgbar. Provenienz stellt sicher, dass Wissen überprüfbar, korrigierbar und versionierbar bleibt. Ohne Provenienz gibt es keine belastbare semantische Infrastruktur.

Grundprinzip

Provenienz von Entitäten

Jede Entität referenziert mindestens eine Quelle:

ReferenzBeschreibung
Dokumenten-IDUrsprungsdokument
Abschnitts-IDStrukturelle Position
Chunk-IDTextuelle Fundstelle

Provenienz von Aussagen

Jede Aussage referenziert ihre Entstehungsbasis:

Aussagen ohne eindeutige Herkunft sind unzulässig.

Zeitliche Nachvollziehbarkeit

Für jede Entität und Aussage werden gespeichert:

ZeitinformationBeschreibung
ErfassungszeitWann wurde das Element erstellt?
Letzte ÄnderungWann wurde es zuletzt modifiziert?
GültigkeitszeitraumSofern relevant für den Inhalt

Zeitangaben sind maschinenlesbar und vergleichbar.

Pipeline-Referenz

Fehlerbehandlung und Korrektur

Abgrenzung zu Annotationen

Persistenz

Ergebnisartefakte

Prüfbedingungen für Supervision

Persistenz des Graphen (Phase 11)

Ziel

Der Graph wird als dauerhaftes, versioniertes Wissensmodell gespeichert. Er ist integraler Bestandteil der semantischen Wahrheit des Systems als Modell, wird aber aus der SQL-Quelle aufgebaut und als veröffentlichter Zustand persistiert.

Grundprinzip

Inhalt des Graphen

Der Graph enthält ausschließlich persistente, geprüfte Elemente:

ElementBeschreibung
EntitätenMit stabilen Entity-IDs als Knoten
RelationenTypisierte Kanten zwischen Entitäten
AussagenAls eigenständige Knoten oder Kantenobjekte
Ontologie-KlassenBegriffliches Weltmodell
TaxonomieHierarchische Ordnungsstruktur

Temporäre Rohdaten sind im Graphen nicht enthalten.

Graphstruktur

Konsistenz

Der Graph ist konsistent zu:

Inkonsistenzen sind technisch ausgeschlossen oder explizit markiert.

Versionierung

Persistenzstrategie

Die Speicherung gewährleistet:

Der Graph kann über mehrere physische Speicher verteilt sein, bleibt logisch konsistent.

Abgrenzung zur Vektordatenbank

GraphVektordatenbank
Semantisches WissensmodellÄhnlichkeitsindex
Entitäten, Aussagen, OntologieNur Embeddings + IDs
Enthält BedeutungEnthält keine Bedeutung
Keine VektorenKeine Semantik

Implementierungsoptionen

Ergebnisartefakte

Prüfbedingungen für Supervision

Stabiler Zielzustand (Phase 12)

Ziel

Das System befindet sich in einem konsistenten, überprüfbaren und langfristig tragfähigen Zustand. Alle Systemkomponenten haben klar abgegrenzte Rollen. Semantische Wahrheit, Ähnlichkeit und Struktur sind strikt voneinander getrennt.

Systemrollen im Zielzustand

SQL-Datenbank: Single Source of Truth

Die SQL-Datenbank ist die kanonische Quelle für:

Kein anderes System besitzt semantische Autorität.

Vektordatenbank: Reiner Ähnlichkeitsindex

Dient fürEnthält nicht
Suche nach inhaltlicher NäheEntitäten
Retrieval relevanter ChunksAussagen
Ontologieelemente
Provenienzinformationen

Graph: Strukturelles Wissensmodell

Der Graph repräsentiert:

Der Graph ist kein Nebenprodukt, sondern integraler Bestandteil der semantischen Infrastruktur. Er ist logisch konsistent mit der SQL-Datenbank.

Änderungsmanagement

Systemische Eigenschaften

Das System ist:

EigenschaftBedeutung
ReproduzierbarGleicher Input → gleiches Ergebnis
AuditierbarJede Änderung nachvollziehbar
KorrigierbarFehler können behoben werden
SupervisionstauglichExterne Prüfung möglich

Semantische Fehler können lokalisiert, erklärt und behoben werden.

Zusammenfassung für Supervision

  1. Ohne Graph existiert keine explizite Semantik
  2. Ohne explizite Semantik entsteht kein überprüfbares Wissen
  3. Vektoren liefern Nähe und Ähnlichkeit, nicht Bedeutung
  4. Ontologie definiert Klassen, ersetzt aber keine Aussagen
  5. Taxonomie ordnet Klassen, ersetzt aber keinen Kontext
  6. Wahrheit ist strukturiert, versioniert und nachvollziehbar gespeichert, nicht generiert

Ergebnis des Gesamtprozesses

Eine stabile semantische Infrastruktur:

Prüfbedingungen für Supervision