Zum Inhalt

Architektur

Style ist eine zustandsarme Webanwendung mit klar getrennten Schichten für Benutzeroberfläche, Profil- und Dokumentenverarbeitung sowie LLM-Anbindung. Die Anwendung wird als Container ausgeliefert und ist auf den Betrieb hinter einem Reverse-Proxy vorbereitet. Die Geschäftslogik verteilt sich auf vier Module, die je einen klar abgegrenzten Verantwortungsbereich kapseln.

Auf einen Blick

  • Webanwendung auf Basis von Gradio mit vier funktional getrennten Tabs.
  • Vier Kernmodule: LLM-Client, Dokumentverarbeitung, Profilverwaltung, Export.
  • LLM-Anbindung über OpenAI-kompatible REST-API.
  • Profile als JSON-Dateien im Dateisystem; Profilbibliothek wird beim Start eingelesen.
  • Im Wesentlichen zustandsfreie Arbeitsbereiche; nur die Feinabstimmung hält einen sitzungsbezogenen Zustand.
  • Containerisiert über Docker; konfigurierbar über Umgebungsvariablen, mit Reverse-Proxy-Unterstützung.

Architekturbeschreibung

Komponenten und Schichten

Die Anwendung gliedert sich in eine Präsentationsschicht (Gradio-UI mit den vier Tabs Transformieren, Stil analysieren, Feinabstimmung, Stilübersicht), eine Anwendungslogik (vier fachliche Module) und eine Integrationsschicht zur LLM-API. Profile, Texte und Prompts werden als Dateien auf dem Dateisystem gehalten.

flowchart TB
    User([Nutzer:in]) --> UI[Gradio-Oberfläche]

    UI --> T1[Transformieren]
    UI --> T2[Stil analysieren]
    UI --> T3[Feinabstimmung]
    UI --> T4[Stilübersicht]

    T1 --> DocProc
    T1 --> ProfMgr
    T1 --> LLM
    T1 --> Export

    T2 --> DocProc
    T2 --> ProfMgr
    T2 --> LLM
    T2 --> Export

    T3 --> ProfMgr
    T3 --> LLM
    T3 --> Export

    T4 --> ProfMgr

    subgraph Module
      DocProc[Document Processor]
      ProfMgr[Profile Manager]
      LLM[LLM Client]
      Export[Export Handler]
    end

    LLM <-->|OpenAI-kompatibel| LocalLLM[Lokales LLM]
    DocProc <--> Files[(Texte: TXT/MD/DOCX)]
    ProfMgr <--> Profiles[(Profilbibliothek)]
    LLM --> Prompts[(Prompt-Vorlagen)]
    Export --> Outputs[(Export-Dateien)]

Workflow

Ein typischer Ablauf folgt einem konsistenten Muster über alle vier Tabs hinweg. Eingaben (Profil und/oder Text) werden über die Gradio-Oberfläche entgegengenommen. Der Document Processor lädt Dateien — TXT direkt, Markdown direkt, DOCX über python-docx mit Erhalt von Überschriften, Listen und Tabellen — und überführt sie in eine einheitliche Markdown-Repräsentation. Der Profile Manager liest beim Start sämtliche JSON-Profile aus dem Verzeichnis profiles/ ein und stellt sie der UI als Auswahl bereit; hochgeladene Profile werden ad hoc geladen. Aus einem geladenen Profil wird entweder der hinterlegte Transformations-Prompt extrahiert oder — wenn dieser fehlt oder zu umfangreich ist — ein kompakter Prompt aus den strukturierten Profildaten erzeugt.

Die so vorbereiteten Eingaben werden durch den LLM Client zusammen mit einer der drei Prompt-Vorlagen (style_analysis.txt, style_transformation.txt, diff_analysis.txt) verbunden und über die OpenAI-kompatible Chat-Completions-Schnittstelle an das Modell übergeben. Vor jedem Aufruf prüft der Client den Token-Bedarf mit tiktoken (Encoding cl100k_base) gegen ein konfigurierbares Limit und bricht bei Überschreitung mit einer Meldung ab.

Im Bereich Feinabstimmung kommt zusätzlich ein sitzungsgebundener Zustand zum Einsatz: Ein optional geladenes Basisprofil und bis zu fünf nacheinander analysierte Vorher-Nachher-Paare werden in einem In-Memory-State gehalten und beim Export in ein verfeinertes Profil zusammengeführt.

Der Export Handler erzeugt schließlich die Ausgabedateien — Texte als TXT, Markdown oder DOCX, Profile als JSON, einzelnen Prompt als TXT oder als vollständiges ZIP-Paket (Profilparameter, Prompt, Beispielsätze).

LLM-Einsatz

Der LLM-Einsatz ist bewusst flach gehalten: pro Nutzeraktion ein einzelner Modellaufruf, ohne agentische Schleifen, ohne Retrieval, ohne Embedder oder Reranker. Die strukturelle Qualität entsteht stattdessen aus dem expliziten Profilschema und den drei festgelegten Prompt-Vorlagen. Die Mehrstufigkeit liegt im Workflow zwischen den Tabs (Analyse → Profil → Transformation → Feinabstimmung), nicht innerhalb eines einzelnen Aufrufs. Drei Aufgaben sind als getrennte Vorlagen modelliert:

  • style_analysis.txt — Extraktion der vier Dimensionen Linguistik, Lexik, Pragmatik, Struktur sowie repräsentativer Beispielsätze.
  • style_transformation.txt — Anwendung eines Stilprofils auf einen Text, inhaltlich substanzerhaltend, optional mit zusätzlichem Feedback.
  • diff_analysis.txt — Extraktion systematischer Änderungsmuster aus einem Vorher-Nachher-Paar, optional gegen ein vorhandenes Basisprofil.

Konfiguration und Deployment

Die Anwendung wird in einem Docker-Container ausgeliefert (Python 3.11-slim als Basis, Ausführung als Non-Root-Benutzer). Konfiguration erfolgt über Umgebungsvariablen — insbesondere OPENAI_BASE_URL, OPENAI_API_KEY und MODEL_NAME für die LLM-Anbindung sowie GRADIO_SERVER_NAME, GRADIO_SERVER_PORT und GRADIO_ROOT_PATH für den Webserver. GRADIO_ROOT_PATH erlaubt den Betrieb hinter einem Reverse-Proxy unter einem Unterpfad. Ein Healthcheck prüft die Erreichbarkeit der Gradio-Oberfläche.

Robustheit

  • Der Token-Bedarf wird vor jedem LLM-Aufruf berechnet und gegen ein konfigurierbares Limit geprüft.
  • Profile mit fehlendem oder überlangem Transformations-Prompt werden über eine Fallback-Generierung aus den strukturierten Daten kompensiert.
  • Nicht erkennbare oder nicht unterstützte Dateiformate werden vor der Verarbeitung mit einer klaren Fehlermeldung abgewiesen.

Technologie-Übersicht

  • Sprache und Laufzeit: Python 3.11.
  • Webframework: Gradio (≥ 5.47).
  • LLM-Anbindung: OpenAI Python SDK gegen OpenAI-kompatible Endpunkte (z.B. LM Studio, Ollama mit OpenAI-Adapter).
  • Tokenisierung: tiktoken (Encoding cl100k_base).
  • Dokumentverarbeitung: python-docx, markdown.
  • Konfiguration: python-dotenv, Umgebungsvariablen.
  • Deployment: Docker, Docker Compose; Healthcheck und Reverse-Proxy-Support über GRADIO_ROOT_PATH.