Architektur¶
KI-Umfrage ist als monolithische Python-Anwendung mit einer Web-Oberfläche konzipiert, die in einem einzelnen Container betrieben wird. Die innere Struktur folgt einer klaren Schichtentrennung zwischen Bedien-Oberfläche, Orchestrierung des Umfrage-Ablaufs, der LLM-Pipeline und einem darunterliegenden Konfigurations- und Persistenz-Layer. Aufrufe an das Sprachmodell sind asynchron implementiert, mit Timeouts und Wiederholungs-Logik abgesichert und durch deterministische Fallback-Pfade gegen Ausfälle abgesichert.
Auf einen Blick¶
- Schichtenarchitektur: UI-Schicht (Tab-basiert), Orchestrierungs-Schicht (Conversation Manager), Pipeline-Schicht (Survey Agent mit drei LLM-Stufen), Infrastruktur-Schicht (LLM-Client, Konfiguration, Persistenz).
- Asynchrone LLM-Aufrufe mit konfigurierbarem Timeout, Retry-Logik und JSON-Mode für strukturierte Antworten.
- Strukturierte Datentypen für alle Pipeline-Übergänge; Validierung der LLM-Ausgaben gegen erlaubte Wertebereiche.
- Konfiguration über YAML-Dateien mit zusätzlichen Überschreibungen via Umgebungsvariablen.
- Persistenz von Sessions, Konversationsverläufen und finalen Antworten als JSON; Logging in eigene Log-Datei.
- Containerisiert über Docker; einzelner Web-Port nach außen, Health-Check enthalten.
- Mehrstufige Fallback-Mechanismen auf Prompt-, Pipeline- und Verarbeitungsebene.
Architekturüberblick¶
Die Anwendung gliedert sich in vier Schichten:
Bedienoberfläche. Die Oberfläche wird mit Gradio aufgebaut und gliedert sich in sechs Tabs (Playground, Prompt-Engineering, Batch-Testing, Fragen-Editor, Session-Demo, Performance). Der UI-Code ist in einer zentralen GradioInterface-Klasse gebündelt; Handler-Funktionen vermitteln zwischen Bedien-Ereignissen und der Orchestrierungs-Schicht.
Orchestrierung. Der ConversationManager startet Sessions, hält den Zustand der aktuellen Frage und reicht Nutzer-Antworten an den Survey Agent weiter. Eine Session bündelt sämtliche Interaktionen einer Umfrage und ist die Basis für die spätere Persistenz.
Pipeline (Survey Agent). Der Agent kapselt drei voneinander unabhängige LLM-Stufen — Antwort-Bewertung, Nachfragen-Generierung und Antwort-Strukturierung. Jede Stufe ruft den LLM-Client mit einem eigenen Prompt-Template auf, parst das JSON-Ergebnis, validiert es und reicht ein typisiertes Ergebnis-Objekt weiter. Bei Fehlern oder Timeouts greift eine regelbasierte Ersatz-Logik.
Infrastruktur. Der LLMClient kapselt die OpenAI-kompatible HTTP-Kommunikation inklusive Timeouts, Retries und JSON-Parsing. Der ConfigLoader lädt YAML-Konfiguration und Umfragedefinition und bindet Umgebungsvariablen ein. Ergebnisse werden als JSON-Dateien abgelegt; Logs schreibt Loguru.
Workflow¶
flowchart TD
User[Nutzer]
UI[Gradio Tabs]
CM[Conversation Manager]
Agent[Survey Agent]
Eval[Stufe 1: Bewertung]
Follow[Stufe 2: Nachfrage]
Struct[Stufe 3: Strukturierung]
Prompts[Prompt Templates]
LLM[LLM Client]
Fallback[Regelbasierter Fallback]
LLMAPI[OpenAI-kompatible API]
Config[YAML Konfiguration]
Store[JSON Ergebnis-Ablage]
Log[Log Datei]
User --> UI
UI --> CM
CM --> Agent
Agent --> Eval
Eval -->|niedriger Klarheits-Score| Follow
Eval -->|ausreichend klar| Struct
Follow --> CM
CM -->|naechste Antwort| Agent
Agent --> Struct
Struct --> CM
CM --> Store
Eval -.-> Prompts
Follow -.-> Prompts
Struct -.-> Prompts
Prompts --> LLM
LLM --> LLMAPI
LLM -.->|Timeout / Fehler| Fallback
Fallback --> Agent
Config --> CM
Config --> Agent
Config --> LLM
Agent --> Log
LLM --> Log
Der Ablauf beginnt mit einer Frage, die der Conversation Manager an den Survey Agent übergibt. Stufe 1 (Bewertung) ruft den LLM-Client mit dem Bewertungs-Prompt auf und erhält einen Klarheits-Score samt Begründung und Problemtypen. Liegt der Score unterhalb der konfigurierten Schwelle und ist die maximale Nachfrage-Tiefe noch nicht erreicht, generiert Stufe 2 eine konkrete Nachfrage. Diese läuft als neue Antwort-Runde durch den Conversation Manager zurück in den Agenten. Sobald eine Antwort als ausreichend klar bewertet wird oder die Nachfrage-Tiefe erschöpft ist, fasst Stufe 3 die gesamte Konversation zu einer strukturierten Endantwort mit Hauptkategorie, spezifischen Begriffen und Konfidenzwert zusammen.
Rolle des LLM in der Pipeline¶
Das Sprachmodell wird in jeder Pipeline-Stufe für eine klar abgegrenzte Aufgabe genutzt: Bewertung, Generierung einer Nachfrage und Strukturierung. Alle Aufrufe verwenden eine niedrige Temperature für deterministische Ergebnisse und werden im JSON-Mode geführt, sodass die Ausgaben unmittelbar in typisierte Datenobjekte überführbar sind. Die Anwendung hält an einer strikten Trennung zwischen Modell-Antwort und Geschäftslogik fest: Werte werden gegen erlaubte Bereiche validiert (Klarheits-Score auf 0–1 begrenzt, Problemtypen gegen eine Whitelist abgeglichen), und ungültige oder fehlende Felder werden ersetzt, ohne die nachgelagerte Verarbeitung zu blockieren.
Nebenläufigkeit und Robustheit¶
Sämtliche LLM-Aufrufe laufen asynchron und sind durch einen pro Aufruf konfigurierbaren Timeout begrenzt. Eine Retry-Logik fängt vorübergehende Fehler des Endpoints ab. Schlägt eine Stufe endgültig fehl, übernehmen regelbasierte Fallbacks die Verarbeitung — etwa eine heuristische Klarheits-Bewertung anhand von Wortzahl und bekannten Indikator-Begriffen oder eine vorgefertigte Nachfrage. Dadurch bleibt der Ablauf für den Nutzer auch bei instabilen LLM-Verbindungen unterbrechungsfrei. Performance-Metriken werden pro Operation und Phase aufgezeichnet und in der Bedien-Oberfläche aggregiert dargestellt.
Konfiguration und Deployment¶
Die Konfiguration ist in zwei YAML-Dateien aufgeteilt: eine zentrale Datei für LLM-Verbindung, Bewertungs-Schwellen, Logging und Persistenz; eine zweite für die Definition der Umfrage selbst. Umgebungsvariablen mit dem Präfix SURVEY_ können einzelne Werte zur Laufzeit überschreiben. Die Anwendung wird als Docker-Container ausgeliefert, der einen einzelnen HTTP-Port (Gradio, 7860) freigibt und einen periodischen Health-Check auf den Wurzelpfad ausführt.
Technologie-Übersicht¶
- Sprache und Laufzeit: Python 3.11.
- Web-Oberfläche: Gradio (Tab-Layout, Chatbot-Komponente, Live-Updates).
- Datenmodelle und Validierung: Pydantic.
- LLM-Anbindung: OpenAI Python SDK gegen eine OpenAI-kompatible Chat-Completion-API; asynchrone Aufrufe über
asyncio. - Konfiguration: YAML (PyYAML),
python-dotenvfür Umgebungsvariablen. - Logging: Loguru, mit Rotation und Retention.
- Containerisierung: Docker; einzelner Container, Health-Check auf den Web-Port.
- Persistenz: JSON-Dateien für Sessions und finale Antworten, Log-Datei für Verlaufsinformationen.