Zum Inhalt

Architektur

Die Anwendung ist als containerisierte Webanwendung mit klarer Schichtentrennung aufgebaut. Die Bedienoberfläche, die Orchestrierung der Verarbeitungsschritte, die Dokument- und LLM-Anbindung sowie die Export-Komponenten sind in eigenständigen Modulen organisiert. Der gesamte Bearbeitungsstand einer Sitzung wird im Arbeitsspeicher gehalten; eine persistente Datenhaltung ist nicht vorgesehen.

Auf einen Blick

  • Containerisierter Betrieb auf Basis eines Python-Slim-Image, mit den notwendigen Systembibliotheken für die Dokumentverarbeitung
  • Webbasierte Bedienoberfläche, die im Browser läuft und keinen Client-Installationsschritt benötigt
  • Schichtentrennung in Oberfläche, Orchestrierung (Agenten und State), Kernfunktionen (Dokument, LLM, State) und Export
  • Zwei-Agenten-Pipeline mit getrennten System-Prompts für Dialog und Artefakt-Verarbeitung
  • LLM-Anbindung über eine OpenAI-kompatible Schnittstelle, mit Wiederholungslogik und exponentiellem Backoff
  • Sitzungsbasierter, zustandsbehafteter Speicher ohne Festplattenpersistenz
  • Konfiguration über Umgebungsvariablen, einschließlich API-Endpunkt, Modellname und Grenzwerten

Architekturbeschreibung

Die Anwendung gliedert sich in vier logische Schichten. Die Oberflächenschicht stellt den Upload von Dokumenten, das Chat-Fenster, die Anzeige der aktuellen Foliengliederung sowie die Export- und Undo-Schaltflächen bereit. Die Orchestrierungsschicht umfasst die beiden Agenten (Chat-Agent und Artefakt-Agent) und die zentrale State-Verwaltung. Die Kernschicht kapselt die wiederverwendbaren Bausteine: das Einlesen und Tokenisieren von Dokumenten, den LLM-Client mit Wiederholungslogik und das State-Objekt mit Versionshistorie. Die Export-Schicht überführt die interne Markdown-Repräsentation in PowerPoint- und Word-Dateien.

flowchart TB
    User[Nutzer]

    subgraph UI[Oberflächenschicht]
        Upload[Upload-Bereich]
        Chat[Chat-Fenster]
        ArtView[Artefakt-Anzeige]
        Export[Export-Schaltflächen]
    end

    subgraph Orch[Orchestrierungsschicht]
        State[State-Verwaltung<br/>Dokumente, Chat, Artefakt, Historie]
        ChatAgent[Chat-Agent]
        ArtAgent[Artefakt-Agent<br/>Zwei-Phasen-Logik]
    end

    subgraph Core[Kernschicht]
        DocProc[Dokument-Parser<br/>+ Token-Zähler]
        LLMClient[LLM-Client<br/>Retry/Backoff]
    end

    subgraph Exp[Export-Schicht]
        MDExp[Markdown-Export]
        PPTXExp[PowerPoint-Export]
        DOCXExp[Word-Export]
    end

    LLM[(LLM-API<br/>OpenAI-kompatibel)]

    User --> Upload
    User --> Chat
    User --> Export

    Upload --> DocProc
    DocProc --> State
    Chat --> ChatAgent
    ChatAgent --> State
    ChatAgent --> LLMClient
    State --> ArtAgent
    ArtAgent --> LLMClient
    ArtAgent --> State
    State --> ArtView
    LLMClient --> LLM

    State --> MDExp
    State --> PPTXExp
    State --> DOCXExp
    MDExp --> User
    PPTXExp --> User
    DOCXExp --> User

Oberflächenschicht

Die Bedienoberfläche ist als webbasierte Single-Page-Anwendung umgesetzt. Sie enthält drei Hauptbereiche: einen Upload-Bereich mit Token-Anzeige, das Chat-Fenster und eine Anzeige der aktuellen Foliengliederung mit Export-, Undo- und Status-Anzeigen. Die Komponenten sind über Ereignisse mit der State-Verwaltung verbunden; nach jedem Ereignis (Upload, Chat-Eingabe, Undo, Export) wird die Anzeige neu gerendert.

Orchestrierungsschicht

Den Kern der Verarbeitung bilden zwei Agenten und eine State-Verwaltung. Der Chat-Agent ist für die Nutzerinteraktion zuständig: Er nimmt freie Texteingaben entgegen, extrahiert daraus regelbasiert Angaben zu Vortragsdauer, Zielgruppe, Schwerpunkten und Zielsprache, ergänzt diese um den aktuellen Folienkontext und ruft das LLM mit einem dialogorientierten System-Prompt auf. Der Artefakt-Agent wird nach jedem Dialog-Turn sowie beim erstmaligen Upload ausgeführt. Er arbeitet in zwei Phasen: Die erste Phase erzeugt oder aktualisiert die Markdown-Gliederung aus den Dokumenten und der Nutzeranweisung; die zweite Phase passt die Folienzahl an die Zielgröße an und löst bei Sprachwechsel eine Übersetzung aus. Der Agent erwartet vom LLM eine strukturierte JSON-Antwort, parst diese und entfernt anschließend die internen Quellreferenzen aus dem für die Anzeige bestimmten Artefakt.

Die State-Verwaltung hält den vollständigen Sitzungszustand: hochgeladene Dokumente mit Tokenzahl, den Chat-Verlauf, das aktuelle Artefakt, die Versionshistorie der letzten fünf Artefakt-Stände sowie offene Klärungsfragen. Sie bietet Methoden zum Hinzufügen von Dokumenten und Nachrichten, zum Aktualisieren des Artefakts mit Diff-Beschreibung sowie zum Rückgängigmachen der letzten Änderung. Der State wird zwischen den Aufrufen der Oberfläche serialisiert und deserialisiert weitergereicht.

Kernschicht

Die Kernschicht kapselt die wiederverwendbaren Bausteine. Der Dokument-Parser validiert hochgeladene Dateien gegen das konfigurierte Größenlimit und die Liste unterstützter Formate, liest sie über eine generische Partitionierungsbibliothek ein und überführt das Ergebnis in eine vereinheitlichte Markdown-Darstellung. Anschließend wird die Tokenanzahl mit einem BPE-basierten Tokenizer ermittelt; dieser wird auch zur Summenbildung über Dokumente, Chat-Verlauf und Artefakt verwendet. Der LLM-Client kapselt die Aufrufe an die OpenAI-kompatible Schnittstelle, unterscheidet zwischen freiem Textaufruf und JSON-Aufruf und ist mit einer Wiederholungslogik mit exponentiellem Backoff versehen. Bei JSON-Aufrufen extrahiert der Client das JSON aus eingebetteten Code-Blöcken und parst es robust.

Export-Schicht

Die Export-Schicht setzt die Markdown-Darstellung in die Zielformate um. Ein gemeinsamer Markdown-Folien-Parser erkennt Folien an Überschriften erster Ebene, sammelt die zugehörigen Stichpunkte (einschließlich untergeordneter Ebenen) und Sprechernotizen und stellt sie als strukturierte Folienobjekte bereit. Ein Text-Formatierer interpretiert dabei Markdown-Auszeichnungen für fett, kursiv und Inline-Code. Die formatspezifischen Exporter erzeugen daraus PowerPoint-Dateien mit getrennten Folien und Notizfeldern beziehungsweise Word-Dokumente mit Folien-Abschnitten und Trennlinien.

Rolle der KI-Komponenten

Das LLM kommt an genau zwei Stellen zum Einsatz: im Chat-Agenten zur Erzeugung von Antworten an die nutzende Person und im Artefakt-Agenten zur Erzeugung beziehungsweise Aktualisierung der Foliengliederung. Beide Agenten nutzen denselben LLM-Client, aber unterschiedliche System-Prompts und Aufrufmodi (Freitext im Chat-Agenten, JSON-Antwort im Artefakt-Agenten). Die agentische Steuerung — Phasen, Klärungsfragen, Längen-Anpassung, Übersetzungs-Trigger — erfolgt im Anwendungs-Code und nicht durch das LLM selbst. Embedder und Reranker werden nicht eingesetzt; die Priorisierung von Dokumentabschnitten erfolgt regelbasiert anhand von Position, Überschriftsebene, Länge und Schlüsselbegriffen.

Nebenläufigkeit, Robustheit und Konfiguration

Die Anwendung verarbeitet Anfragen sequentiell innerhalb einer Sitzung. Robustheit gegenüber vorübergehenden LLM-Fehlern wird durch die Retry-Logik im LLM-Client hergestellt; die Anzahl der Versuche und die Wartezeiten sind konfigurierbar. Bei dauerhaftem Fehlschlag bleibt der vorherige Artefaktstand erhalten und der Fehler wird im Status angezeigt. Beim Upload werden Dateigröße und Format geprüft; bei Überschreitung des Token-Budgets wird der Upload abgelehnt. Die Konfiguration erfolgt vollständig über Umgebungsvariablen (LLM-Endpunkt, Modellname, API-Schlüssel, Grenzwerte, Server-Port und Pfad).

Technologie-Übersicht

  • Sprache und Laufzeit: Python 3.13
  • Bedienoberfläche: Gradio
  • LLM-Anbindung: OpenAI-Python-Client gegen eine OpenAI-kompatible Schnittstelle (lokaler Betrieb möglich)
  • Tokenisierung: tiktoken
  • Wiederholungslogik: tenacity
  • Dokument-Parsing: unstructured
  • Export PowerPoint: python-pptx
  • Export Word: python-docx
  • Markdown-Verarbeitung: markdown-it-py
  • Bildverarbeitung (für Dokumentparser): Pillow
  • Containerisierung: Docker, Basis-Image Python-Slim, mit Systempaketen für Dokument- und Bildverarbeitung sowie Texterkennung
  • Konfiguration: Umgebungsvariablen via dotenv