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"