Status: ✅ Production Ready (MVP)
Der KBA Drafter ist ein LLM-unterstütztes Tool zur automatischen Generierung von Knowledge Base Articles (KBAs) aus IT-Support-Tickets. Er analysiert Ticketdaten aus CSV-Exports und erstellt strukturierte, prüfbare KBA-Entwürfe in Deutsch.
Problem: IT-Support-Teams verbringen Stunden damit, manuelle KBA-Artikel aus gelösten Tickets zu erstellen.
Lösung: Der KBA Drafter automatisiert den ersten Entwurf:
- ⚡ Generiert KBA in ~2-5 Sekunden
- 📋 Strukturierte Ausgabe mit Symptomen, Ursache, Lösung
- ✏️ Editierbar und manuell prüfbar
- 📚 Nutzt Guidelines für konsistente Qualität
- 🔒 Veröffentlichung nur nach Review
┌─────────────┐
│ React UI │ KBADrafterPage.jsx
└──────┬──────┘
│ REST
▼
┌─────────────┐
│ Quart API │ /api/kba/drafts
└──────┬──────┘
│
▼
┌─────────────┐
│ KBAService │ Business Logic + Validation
└──┬────┬─────┘
│ │
│ └─────────────┐
│ ▼
│ ┌─────────────┐
│ │ Ollama │ LLM (llama3.2:1b)
│ │ Service │
│ └─────────────┘
│
├─────────────┐
│ ▼
│ ┌─────────────┐
│ │ Guidelines │ Markdown-Dateien
│ │ Loader │ (system/, categories/)
│ └─────────────┘
│
├─────────────┐
│ ▼
│ ┌─────────────┐
│ │ CSV Ticket │ data.csv Parser
│ │ Service │
│ └─────────────┘
│
└─────────────┐
▼
┌─────────────┐
│ KB Adapters │ FileSystem, SharePoint, etc.
└─────────────┘
| Komponente | Datei | Zweck |
|---|---|---|
| KBA Service | kba_service.py |
Hauptlogik für Draft-Generierung und Publishing |
| Ollama Service | ollama_service.py |
HTTP-Client für lokales LLM |
| Structured Output Parser | ollama_structured_output.py |
JSON-Parsing mit Retry und Repair |
| KB Adapters | kb_adapters.py |
Publishing zu verschiedenen KB-Systemen |
| Guidelines Loader | guidelines_loader.py |
Lädt Markdown-Guidelines mit Frontmatter |
| CSV Service | csv_data.py |
Parst Ticket-CSV (BMC Remedy Format) |
| Audit Service | kba_audit.py |
Logging aller KBA-Aktionen |
| API Endpoints | app.py |
REST API für Frontend |
| Komponente | Datei | Zweck |
|---|---|---|
| KBA Drafter Page | KBADrafterPage.jsx |
Haupt-UI-Komponente |
| API Service | api.js |
REST-Client-Funktionen |
| Modell | Zweck |
|---|---|
KBADraft |
Vollständiger KBA-Entwurf |
KBADraftCreate |
DTO für Erstellung |
KBADraftUpdate |
DTO für Updates (partial) |
KBAPublishRequest |
DTO für Publishing |
KBAPublishResult |
Response vom Publishing |
┌────────┐ ┌──────────┐ ┌───────────┐
│ DRAFT │─────>│ REVIEWED │─────>│ PUBLISHED │
└────────┘ └──────────┘ └───────────┘
│
└───────────────────────────────────>│
FAILED
Eingabe: Ticket-UUID aus CSV
Ausgabe: Strukturierter KBA-Entwurf
Generierte Felder:
title: SEO-optimierter Titelsymptoms: Liste von Symptomen/Fehlerncause: Root-Cause-Analyseresolution_steps: Schritt-für-Schritt-Lösungvalidation_checks: Verifikations-Schrittewarnings: Wichtige Hinweisetags: Suchbegriffeconfidence_notes: LLM-Unsicherheiten
Beispiel:
draft = await kba_service.generate_draft(
KBADraftCreate(
ticket_id="550e8400-e29b-41d4-a716-446655440000",
user_id="admin@example.com"
)
)
# draft.title = "VPN Connection Failed After Windows Update"
# draft.symptoms = ["Cannot connect to VPN", "Error: Connection timeout"]
# draft.llm_generation_time_ms = 2847Problem: LLMs geben manchmal ungültiges JSON zurück
Lösung: 4-stufiger Fallback-Parser + automatisches Retry
parser = StructuredOutputParser(schema=KBA_OUTPUT_SCHEMA)
# Versucht automatisch:
# 1. Tool-Call-Format
# 2. Markdown-Code-Block
# 3. JSON-Extraktion aus Text
# 4. Full-Response-Parse
# Bei Fehler: Retry mit Repair-Prompt
result = await parser.parse_with_retry(
ollama_response=response,
retry_fn=ollama_retry,
max_retries=1
)Struktur:
docs/kba_guidelines/
├── system/ # Immer geladen
│ ├── 00_system_role.md # LLM-Persona
│ ├── 10_kba_structure.md # Feldformat
│ ├── 20_writing_style.md # Sprache/Ton
│ ├── 30_quality_checks.md # Validierung
│ └── 40_publish_rules.md # Workflow
└── categories/ # Selektiv geladen
├── GENERAL.md
├── VPN.md
├── PASSWORD_RESET.md
└── NETWORK.md
YAML Frontmatter:
---
title: "KBA Structure Guide"
version: "1.0"
enabled: true
priority: 10
---Adapter-Pattern:
FileSystemKBAdapter: Markdown-Dateien (MVP) ✅SharePointKBAdapter: Microsoft SharePoint (Stub)ITSMKBAdapter: ServiceNow KB (Stub)ConfluenceKBAdapter: Atlassian Confluence (Stub)
Beispiel (FileSystem):
result = await kba_service.publish_draft(
draft_id=uuid,
publish_req=KBAPublishRequest(
target_system="file",
category="VPN",
visibility="internal",
user_id="admin@example.com"
)
)
# result.published_url = "file:///kb/published/VPN/KB-A1B2C3D4-vpn-connection.md"Alle Aktionen werden geloggt:
audit.log_event(
draft_id=draft_id,
event_type=KBAAuditEventType.DRAFT_GENERATED,
user_id="admin@example.com",
details={
"ticket_id": "...",
"generation_time_ms": 2847,
"guidelines_used": ["system", "VPN"]
}
)Retrievable via API:
GET /api/kba/drafts/{draft_id}/audit| Endpoint | Methode | Zweck |
|---|---|---|
/api/kba/health |
GET | Ollama-Status prüfen |
/api/kba/drafts |
POST | KBA generieren |
/api/kba/drafts |
GET | Drafts auflisten (mit Filtern) |
/api/kba/drafts/{id} |
GET | Draft abrufen |
/api/kba/drafts/{id} |
PATCH | Draft editieren |
/api/kba/drafts/{id}/publish |
POST | Draft veröffentlichen |
/api/kba/drafts/{id}/audit |
GET | Audit-Trail abrufen |
/api/kba/guidelines |
GET | Alle Guidelines auflisten |
/api/kba/guidelines/{category} |
GET | Guideline abrufen |
# .env
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3.2:1b
OLLAMA_TIMEOUT=60Supported Models:
llama3.2:1b- Schnell, 1GB RAM (~2s Generation)llama3.2:3b- Balanced, 3GB RAM (~5s)llama3.1:8b- Beste Qualität, 8GB RAM (~10s)
# .env
KB_FILE_BASE_PATH=./kb_published
KB_FILE_CREATE_CATEGORIES=true# .env
GUIDELINES_PATH=./docs/kba_guidelines# Alle KBA Tests
pytest backend/tests/test_kba_publishing.py -v
# Structured Output Parser Tests
pytest backend/tests/test_ollama_structured_output.py -v
# Combined
pytest backend/tests/test_kba*.py backend/tests/test_ollama*.py -vCoverage: 45/45 Tests ✅
# Playwright E2E
npm run test:e2e- ☑️ Nur FileSystem-Adapter produktiv (SharePoint/ITSM/Confluence sind Stubs)
- ☑️ Keine Rechteprüfung (TODO: Integration mit Auth-System)
- ☑️ Keine Versionierung von publizierten KBAs
- ☑️ Kein Un-publish (einmal publiziert = permanent)
- ☑️ Single-User (keine Concurrent-Editing-Locks)
- ☑️ Deutsch-only (Guidelines sind auf DE optimiert)
- LLM lokal: Ollama muss installiert und laufend sein
- CSV-Format: Erwartet BMC Remedy ITSM Export-Format
- UUID-Pflicht: Tickets müssen UUID als ID haben
- Synchrone Generation: UI blockiert während LLM-Generierung (~2-5s)
| Operation | Durchschnitt | P95 |
|---|---|---|
| Draft-Generierung | 2.8s | 5.2s |
| Draft-Speichern | 15ms | 35ms |
| Draft-Laden | 8ms | 20ms |
| Publishing (FileSystem) | 25ms | 60ms |
| Guidelines-Loading | 120ms | 200ms |
- SharePoint Adapter (Microsoft Graph API)
- ITSM/ServiceNow Adapter
- Rechtemanagement (kba.generate, kba.publish)
- Versionierung (KBA-History)
- Un-publish Funktion
- Mehrsprachigkeit (EN, FR)
- Bulk-Publishing
- Auto-Update bei Ticket-Änderungen
- Quality-Scoring (LLM-Confidence-Metriken)
- A/B-Testing verschiedener Prompts
- Confluence Adapter
- Realtime Collaborative Editing
- Approval Workflows
- Template System
- Analytics Dashboard
- Quick Start Guide - Schnellste Installation
- Technical Documentation - Vollständige Architektur
- Publishing Guide - Publishing-Details
- Implementation Notes - Entwickler-Notizen
- Main README - Repo-Overview
Q: Ollama startet nicht?
A: Prüfe ollama serve und Port 11434. Siehe Troubleshooting
Q: KBA-Qualität schlecht?
A: Guidelines anpassen in docs/kba_guidelines/. Test mit ollama run llama3.2:1b
Q: Wie füge ich einen neuen KB-Adapter hinzu?
A: Siehe KBA_PUBLISHING.md Sektion "Erweiterung: Neue Adapter"
Q: Kann ich GPT-4 statt Ollama verwenden?
A: Ja, erstelle OpenAIService analog zu OllamaService. API-Kompatibel.
# Backend Tests
pytest backend/tests/test_kba*.py -v
# Type Checking
mypy backend/kba_service.py
# Linting
ruff check backend/kba*.py
# Frontend Tests
cd frontend && npm testPart of the python-quart-vite-react teaching repository.
- LLM: Ollama (Meta's Llama 3.2)
- Backend: Quart, Pydantic, SQLModel
- Frontend: React, FluentUI v9
- Architecture: "Grokking Simplicity" + "A Philosophy of Software Design"