Souveraene Unternehmens-KI
Kiara ist eine KI-Plattform, die Unternehmen in eine befragbare Entitaet verwandelt. Sie verbindet alle relevanten Datenquellen — ERP, Fileserver, DMS, Mail, Ticketsystem — mit KI-gestuetzter Fragenbeantwortung, wahlweise ueber einen lokalen LLM (Ollama) oder DSGVO-konform anonymisiert ueber Cloud-KI-Dienste (Anthropic Claude, OpenAI GPT).
Kiara positioniert sich nicht als generisches RAG-Framework, sondern als fertige Plattform mit integrierter Anonymisierung, Berechtigungssteuerung und Audit-Trail. Die Ingestion laeuft vollstaendig lokal, Cloud-Anfragen werden anonymisiert — volle Datensouveraenitaet ohne Vendor-Lock-in.
- 25+ Dateiformate: DOCX, PDF, XLSX, PPTX, ODT, Markdown, Python, PowerShell, JSON, XML, CSV und weitere
- Inkrementelle Indizierung: Nur geaenderte Dateien werden neu verarbeitet (MD5-Hash auf Pfad+Groesse+mtime)
- Multi-Embedding-Modelle: Pro Embedding-Modell eigene VectorDB-Collection, Modellauswahl bei Ingestion
- SSE-Streaming: Antworten werden Token fuer Token in Echtzeit gestreamt
- Quellenangaben: Jede Antwort verweist auf die genutzten Quelldokumente mit Relevanz-Score
- Aho-Corasick-Engine: Deterministische Erkennung aller ERP-Stammdaten und LDAP-Mitarbeiterdaten in einem Durchlauf (<1ms pro Chunk)
- Regex-Auffangnetz: IBAN, E-Mail-Adressen, Telefonnummern, Steuernummern, interne IP-Adressen
- Reversible Pseudonymisierung: Forward- und Reverse-Mapping ausschliesslich im RAM, nach Session-Ende unwiederbringlich verloren
- Content-Klassen: Pro Datenquelle konfigurierbare Risikoklasse (BLOCKED / HIGH / MEDIUM / LOW)
- Benutzerdefinierte Muster: Eigene Regex-Regeln und Stammdaten-Eintraege ueber die Admin-UI hinzufuegbar
- Hybrides Routing: Automatische oder manuelle Entscheidung lokal vs. Cloud pro Anfrage
- Keyword-basiertes Auto-Routing: Strategische Fragen (Analyse, Optimierung, Prognose) werden an leistungsfaehigere Cloud-Modelle delegiert
- Provider: Anthropic (Claude) und OpenAI (GPT) mit konfigurierbarem Modell, Temperatur und Token-Limit
- Automatischer Fallback: Bei Cloud-Fehler wird transparent auf den lokalen LLM zurueckgeschaltet
- Anonymisierungs-Pipeline: Query und Kontext werden vor dem Cloud-Request anonymisiert, die Antwort danach de-anonymisiert
- Audit-Log: Jeder Cloud-Request wird protokolliert (Zeitpunkt, Benutzer, Entitaetenzahl, Provider, Modell)
- Datenschutz: Originaltext der Frage wird nie im Audit-Log gespeichert (nur SHA256-Hash)
- Nachvollziehbarkeit: DSB kann im Admin-Dashboard einsehen, welche Anfragen die Cloud erreicht haben
- LDAP/Active Directory: Gruppensync, Login, automatischer Benutzerimport
- 3-Tabellen-Berechtigungsmodell: Benutzer -> Gruppen -> Datenquellen -> Chunks
- Chunk-Level-Filter: Bei RAG-Queries werden nur Chunks aus erlaubten Datenquellen zurueckgegeben
- Lokale Verzeichnisse, SMB-Shares, WebDAV (z.B. Nextcloud)
- Per-Datenquelle-Konfiguration: Chunk-Groesse, Dateitypen, Ausschlussmuster, Sync-Intervall
- Live-Fortschrittsanzeige: Dateien verarbeitet/gesamt + Durchsatz bei Ingestion
- Zwei getrennte Web-Portale: User-Chat (Port 8501) + Admin-Dashboard (Port 8502)
- KI-Backend-Konfiguration: Embedding- und LLM-Server getrennt konfigurierbar mit Verbindungstest
- E-Mail-Benachrichtigungen: Ollama-Ausfall, Datenquellen-Probleme, Indizierungsfehler
- OnlyOffice-Integration: Dokumentbearbeitung direkt im Browser
- Debian/Ubuntu-Server mit Python 3.12+
- Ollama-Server mit einem LLM (z.B.
qwen3:8b) und einem Embedding-Modell (z.B.nomic-embed-text) - Optional: LDAP/Active Directory fuer Benutzerverwaltung
- Optional: Anthropic- oder OpenAI-API-Key fuer Cloud-KI
# Paket bauen (auf dem Entwicklungsrechner)
make deb
# Paket installieren
sudo dpkg -i kiara_*.deb
# Fehlende Abhaengigkeiten nachinstallieren
sudo apt-get install -fDas postinst-Script erstellt automatisch:
- Systembenutzer
kiara - Python-venv in
/opt/kiara/venv/ - Alle Python-Dependencies
- systemd-Units (
kiara.service,kiara-admin.service)
Die Hauptkonfiguration liegt in /etc/kiara/kiara.yaml und bleibt bei Upgrades erhalten:
# Ollama-Backend
ollama:
url: "http://gpu-server.local:11434"
llm_model: "qwen3:8b"
embedding_model: "nomic-embed-text"
# Vektor-Datenbank
vectordb:
path: "/var/lib/kiara/chromadb"
collection: "knowledgebase"
# Ingestion
ingestion:
chunk_size: 1000
chunk_overlap: 200
batch_size: 100
# Web-Server
web:
host: "0.0.0.0"
port: 8501
admin_port: 8502
# Cloud-KI (optional)
cloud:
enabled: false
provider: "anthropic" # oder "openai"
api_key: ""
model: "claude-sonnet-4-6"
mode: "auto" # auto | local | cloud
max_tokens: 4096
temperature: 0.3
# Anonymisierung
anonymization:
enabled: true
word_boundaries: true
min_term_length: 3
max_content_class: 3 # 0=BLOCKED, 1=HIGH, 2=MEDIUM, 3=LOW
audit_log: true
erp_source:
enabled: false
type: "csv"
path: "/etc/kiara/stammdaten"
ldap_source:
enabled: true
# PostgreSQL-Datenbank
database:
host: "localhost"
port: 5432
name: "kiara"# Services starten
sudo systemctl start kiara kiara-admin
# Status pruefen
sudo systemctl status kiara kiara-admin
# Logs verfolgen
sudo journalctl -u kiara -fDanach ist das System erreichbar unter:
- User-Portal:
http://<server>:8501(Standard-Login:admin/admin) - Admin-Dashboard:
http://<server>:8502
- Passwort aendern: Sofort das Standard-Passwort des Admin-Benutzers aendern
- KI-Backend konfigurieren: Im KI-Tab die Ollama-URL und Modelle pruefen (Verbindungstest)
- Datenquelle anlegen: Im Datenquellen-Tab eine lokale oder SMB/WebDAV-Quelle hinzufuegen
- Indizierung starten: Datenquelle auswaehlen und "Indizieren" klicken
- Optional -- LDAP: Im LDAP-Tab die Verbindung konfigurieren und Gruppen importieren
- Optional -- Cloud-KI: Im KI-Tab Cloud-Provider aktivieren und API-Key hinterlegen
Kiara ist als geschichtete Plattform aufgebaut. Eine ausfuehrliche Architektur-Dokumentation mit Schichtendiagramm, Datenfluss, Modul-Uebersicht, API-Referenz und Sicherheitsmodell findet sich in:
+-----------------------------------------------------------+
| Praesentationsschicht (FastAPI + HTML/JS SPA) |
| User-Portal :8501 | Admin-Dashboard :8502 |
+-----------------------------------------------------------+
| Sicherheitsschicht (LDAP, Sessions, Berechtigungen) |
+-----------------------------------------------------------+
| Anonymisierungsschicht (Aho-Corasick + Regex) |
+-----------------------------------------------------------+
| Cloud-KI-Router (Lokal/Cloud, Anonymisierung) |
+-----------------------------------------------------------+
| RAG-Kern (Ingestion, Qdrant, Ollama-LLM) |
+-----------------------------------------------------------+
| Datenhaltung (Qdrant, PostgreSQL, YAML-Config) |
+-----------------------------------------------------------+
kiara/
|-- anonymization/ # Anonymisierungsmodul (Aho-Corasick, Regex, Audit)
|-- generation/ # RAG-Chain, LLM-Client (Ollama + Cloud)
|-- ingestion/ # Datei-Loader, Chunker, Pipeline
|-- retrieval/ # VectorStore-Factory, Retriever
`-- web/ # FastAPI-Apps, Auth, API-Router, Templates, Static
| Parameter | Standard | Beschreibung |
|---|---|---|
url |
http://gpu-server.local:11434 |
Ollama-Server-URL (Fallback fuer llm_url/embedding_url) |
llm_url |
(leer, nutzt url) |
Separate URL fuer LLM-Backend |
embedding_url |
(leer, nutzt url) |
Separate URL fuer Embedding-Backend |
llm_model |
qwen3:8b |
LLM-Modellname auf dem Ollama-Server |
embedding_model |
nomic-embed-text |
Embedding-Modellname auf dem Ollama-Server |
prompt_template |
(leer, nutzt Standard) | Benutzerdefiniertes Prompt-Template (muss {context} und {question} enthalten) |
| Parameter | Standard | Beschreibung |
|---|---|---|
path |
/var/lib/kiara/chromadb |
Speicherort der VectorDB-Daten |
collection |
knowledgebase |
Name der Standard-Collection |
| Parameter | Standard | Beschreibung |
|---|---|---|
chunk_size |
1000 | Maximale Zeichenzahl pro Chunk |
chunk_overlap |
200 | Ueberlappung zwischen Chunks in Zeichen |
batch_size |
100 | Anzahl Chunks pro VectorDB-Batch |
| Parameter | Standard | Beschreibung |
|---|---|---|
enabled |
false |
Cloud-KI aktivieren |
provider |
anthropic |
Cloud-Provider (anthropic oder openai) |
api_key |
(leer) | API-Schluessel fuer den Cloud-Provider |
model |
claude-sonnet-4-6 |
Cloud-Modellname |
base_url |
(leer) | Benutzerdefinierte Base-URL (z.B. fuer Azure OpenAI) |
mode |
auto |
Routing-Modus: auto, local oder cloud |
max_tokens |
4096 | Maximale Token-Anzahl fuer Cloud-Antworten |
temperature |
0.3 | Sampling-Temperatur fuer Cloud-Modell |
| Parameter | Standard | Beschreibung |
|---|---|---|
enabled |
true |
Anonymisierung aktivieren |
word_boundaries |
true |
Nur an Wortgrenzen matchen |
min_term_length |
3 | Minimale Laenge fuer Stammdaten-Treffer |
max_content_class |
3 | Maximale Content-Klasse fuer Cloud-Upload (0-3) |
audit_log |
true |
Audit-Logging fuer Cloud-Requests aktivieren |
erp_source.enabled |
false |
ERP-Stammdaten-Import aktivieren |
erp_source.type |
csv |
Importformat (csv) |
erp_source.path |
/etc/kiara/stammdaten |
Pfad zu CSV/JSON-Stammdaten |
ldap_source.enabled |
true |
LDAP-Mitarbeiterdaten fuer Anonymisierung nutzen |
excluded_terms |
[] |
Begriffe, die nicht anonymisiert werden sollen |
custom_patterns |
[] |
Benutzerdefinierte Regex-Muster |
custom_entries |
[] |
Benutzerdefinierte Stammdaten-Eintraege |
| Parameter | Standard | Beschreibung |
|---|---|---|
host |
0.0.0.0 |
Bind-Adresse des Web-Servers |
port |
8501 | Port fuer das User-Portal |
admin_port |
8502 | Port fuer das Admin-Dashboard |
| Parameter | Standard | Beschreibung |
|---|---|---|
host |
localhost |
PostgreSQL-Host |
port |
5432 |
PostgreSQL-Port |
name |
kiara |
PostgreSQL-Datenbankname |
kiara index # Wissensbasis indizieren
kiara query "Frage" # RAG-Query im Terminal
kiara status # System-Status anzeigen
kiara serve # Web-Server starten
kiara config # Konfiguration anzeigen/bearbeiten| Komponente | Technologie |
|---|---|
| Sprache | Python 3.12 |
| Web-Framework | FastAPI + Uvicorn |
| Vektor-DB | Qdrant (Docker, localhost:6333) |
| LLM (lokal) | Ollama (qwen3:8b) |
| LLM (Cloud) | Anthropic Claude, OpenAI GPT |
| Embeddings | Ollama (nomic-embed-text) |
| Anonymisierung | pyahocorasick (Aho-Corasick-Automat) |
| Authentifizierung | bcrypt + itsdangerous (signed cookies) |
| Datenbank | PostgreSQL (via psycopg2) |
| LDAP | python-ldap (Active Directory) |
| Deployment | Debian-Paket (.deb) + systemd |
| Text-Splitter | LangChain Text Splitters |
Dieses Projekt steht unter der GNU Affero General Public License v3.0 (AGPL-3.0-or-later).