Table of Contents
Lokaler AI-Stack - Teil 1: Basis-Einrichtung (LM Studio + Open WebUI + ComfyUI)
Ziel: Die drei Kernkomponenten auf dem Nobara-System installieren und verbinden. Alles laeuft lokal, ohne Cloud-Zugang.
Komponenten und ihre Rollen:
| Komponente | Rolle | Port | Ausfuehrungsort | ||||
| LM Studio | laedt und serviert das LLM, stellt die lms-Kommandozeile zur Verfuegung | 1234 | AppImage auf dem Host | ||||
| Open WebUI | Chat-Oberflaeche, Benutzerkonten, Wissensdatenbank (RAG) | 3000 | Podman-Container | ||||
| ComfyUI | Bildgenerierung mit Z-Image | 8188 | Python-Virtualenv auf dem Host | ||||
| Qwen3 27B (GGUF) | die LLM-Modelldatei, ca. 16 GB | - | gespeichert in ~/.lmstudio |
Wichtiges Prinzip: LM Studio und das Modell laufen auf dem Host. Open WebUI spricht nur ueber das Netzwerk (Port 1234) mit LM Studio. Das bedeutet: Beim Aktualisieren oder Ersetzen des LM-Studio-AppImages bricht die WebUI-Verbindung nicht ab - relevant sind nur die Modelldateien in ~/.lmstudio, und die sind kein Teil des AppImages.
1. Voraussetzungen
| Voraussetzung | Details | Pruef-Befehl | |||
| GPU | NVIDIA-Grafikkarte mit 16 bis 19 GB VRAM (fuer Qwen3 27B erforderlich) | nvidia-smi | |||
| NVIDIA-Treiber | aktueller, funktionierender Treiber | nvidia-smi zeigt Karte, Treiber und CUDA-Version | |||
| RAM | 32 GB empfehlenswert, 16 GB Minimum | free -h | |||
| Festplattenspeicher | ca. 25 GB frei fuer Modell, Container und Dokumente | df -h /home | |||
| Podman | installiert, wird fuer Open WebUI verwendet | podman –version | |||
| Benutzerkonto | rootai, Home-Verzeichnis /home/rootai | whoami | |||
| Ports | 1234, 3000 und 8188 muessen frei sein | sudo lsof -i :1234 -i :3000 -i :8188 |
Falls nvidia-smi nicht gefunden wird, muss zuerst der Grafikkarten-Treiber installiert werden.
2. LM Studio installieren (AppImage)
Warum AppImage: Es ist eine einzige, in sich geschlossene Datei. Ein spaeteres Update bedeutet nur, die Datei zu ersetzen - Modelle, Einstellungen und Skripte sind nicht darin enthalten.
Schritt 2.1 - Herunterladen:
Das aktuellste LM-Studio-AppImage herunterladen und in /home/rootai/Downloads ablegen.
Schritt 2.2 - Ausfuehrbar machen:
chmod +x /home/rootai/Downloads/lm-studio-*.AppImage
Schritt 2.3 - Starten (FUSE-Workaround fuer Nobara/Fedora):
Fedora-basierte Systeme aktivieren FUSE fuer normale Benutzer nicht standardmaessig. Daher kann das AppImage mit einem FUSE- oder Mount-Fehler scheitern. Falls das passiert:
cd /home/rootai/Downloads ./lm-studio-*.AppImage --appimage-extract ./lm-studio-*/AppRun
Dies entpackt das AppImage in einen Ordner und startet es ueber AppRun. Das Verhalten ist exakt wie beim normalen AppImage.
Schritt 2.4 - Modell laden:
In LM Studio, Bereich “Modelle”: nach Qwen3 27B suchen und die GGUF-Variante (ca. 16 GB) herunterladen. Die Modelle werden in ~/.lmstudio abgelegt - dieses Verzeichnis ueberlebt jedes AppImage-Update.
Schritt 2.5 - lms global verlinken:
LM Studio stellt das lms-Kommando bereit (wird vom Skript start-ai.sh genutzt). Ein stabiler Symlink verhindert, dass Skripte vom exakten AppImage-Dateinamen abhaengen:
sudo ln -sf /home/rootai/Downloads/lm-studio-*.AppImage /usr/local/bin/lms
Hinweis: Nach einem LM-Studio-Update (neue Versionsnummer im Dateinamen) diesen Symlink neu erstellen, sonst funktioniert lms nicht mehr. Das ist der einzige Teil des Stacks, der nach einem Update angepasst werden muss.
Schritt 2.6 - Pruefen:
lms ls
Erwartet: Der Befehl laeuft und listet das Modell.
3. LM-Studio-Server starten und API testen
Schritt 3.1 - Server starten:
In LM Studio, Bereich “Developer”: Port 1234 setzen und “Start Server” klicken. (Das lms-Kommando laedt unten das Modell und startet den Server automatisch.)
Schritt 3.2 - Modell laden:
lms load qwen/qwen3.8-27b
Warten, bis der Ladevorgang abgeschlossen ist (ca. 16 GB in den VRAM, dauert wenige Sekunden).
Schritt 3.3 - OpenAI-kompatible API testen:
curl -s http://127.0.0.1:1234/v1/models
Erwartet: JSON-Ausgabe, die qwen3.8-27b enthaelt. Wenn das funktioniert, ist die LLM-Seite fertig.
4. Open WebUI (Podman-Container)
Schritt 4.1 - Image ziehen:
podman pull ghcr.io/open-webui/open-webui
Schritt 4.2 - Container anlegen und starten:
podman run -d --name open-webui -p 3000:8080 -v open-webui-data:/app/backend/data --restart unless-stopped ghcr.io/open-webui/open-webui
Erklaerung der Parameter:
* –name open-webui: fester Name, wird von start-ai.sh verwendet (podman restart open-webui) * -p 3000:8080: Host-Port 3000 wird auf Container-Port 8080 gemappt * -v open-webui-data:/app/backend/data: alle Einstellungen, Benutzer und die Wissensdatenbank liegen in diesem Volume und ueberleben Container-Updates * –restart unless-stopped: automatischer Neustart nach einem Reboot
Schritt 4.3 - Pruefen, ob er laeuft:
podman ps | grep open-webui curl -sI http://127.0.0.1:3000 | head -1
Erwartet: eine HTTP-Zeile mit 200 oder 302.
Schritt 4.4 - Im Browser einrichten:
http://<server-ip>:3000 oeffnen und als Admin anmelden, dann:
1. Einstellungen, Verbindungen: OpenAI-API hinzufuegen
- Basis-URL: http://host.docker.internal:1234/v1
- API-Schluessel: ein beliebiger, nicht leerer Wert (LM Studio ignoriert ihn)
- Test: qwen3.8-27b muss in der Modellliste erscheinen
- Warum host.docker.internal: Im Inneren des Containers zeigt localhost auf den Container selbst, nicht auf den Host
2. Einstellungen, Modelle: nomic-embed-text-v1.5 als Embedding-Modell setzen (Voraussetzung fuer RAG, Details in Teil 2)
Hinweis: Das Kunden-Benutzerkonto (artz) und die Modell-Einstellungen werden in Teil 2 eingerichtet.
5. ComfyUI (Z-Image)
Schritt 5.1 - Im Hintergrund starten mit Logfile:
nohup ~/comfyui-env/bin/python ~/comfyui/main.py --listen --port 8188 >> ~/comfyui.log 2>&1 &
Schritt 5.2 - Pruefen:
curl -s http://127.0.0.1:8188/system_stats
Erwartet: JSON mit System-Statistiken. Bei Problemen:
tail -f ~/comfyui.log
Schritt 5.3 - In Open WebUI verbinden:
Einstellungen, Verbindungen: ComfyUI hinzufuegen.
* URL: http://host.docker.internal:8188 (gleicher Grund wie oben - Open WebUI laeuft im Container) * Modell: Z-Image
6. Autostart nach dem Neustart
Datei: /home/rootai/start-ai.sh (das vorhandene Skript, unveraendert)
#!/bin/bash # warten, bis Systemdienste und der LM-Studio-Server hochgefahren sind sleep 15
# das Qwen-Modell in LM Studio laden (startet auch den Server) lms load qwen/qwen3.8-27b
# dem Modell ein paar Sekunden zur voelllaendigen Initialisierung geben sleep 10
# Open WebUI neu starten, damit es sich wieder mit der LM-Studio-API verbindet podman restart open-webui
Ausfuehrbar machen:
chmod +x /home/rootai/start-ai.sh
Die Reihenfolge ist wichtig: zuerst LM Studio, dann das Modell, dann Open WebUI.
Nach einem LM-Studio-Update: Nur Schritt 2.5 (lms-Symlink neu erstellen) ist noetig. Das Skript, der Container und die WebUI-Konfiguration bleiben unberuehrt.
7. Funktionstest
Alle drei Pruefungen ausfuehren:
# 1. LM-Studio-API curl -s http://127.0.0.1:1234/v1/models
# 2. Open WebUI erreichbar curl -sI http://127.0.0.1:3000 | head -1
# 3. ComfyUI erreichbar curl -s http://127.0.0.1:8188/system_stats | head -c 100
Danach im Browser:
1. http://<server-ip>:3000 oeffnen und anmelden (als Admin) 2. Ein Chat mit qwen3.8-27b starten und eine einfache Frage stellen, ohne Wissensdatenbank 3. Erwartet: eine normale Antwort ohne Quellenangaben (Quellenangaben kommen mit RAG, siehe Teil 2)
8. Fehlerbehebung
| Symptom | Wahrscheinliche Ursache | Loesung | |||
| AppImage startet nicht | FUSE fuer den Benutzer nicht aktiviert (Fedora-Standard) | –appimage-extract und AppRun verwenden (Schritt 2.3) | |||
| lms: command not found | Symlink zeigt auf einen alten AppImage-Namen | Schritt 2.5 mit dem neuen Pfad wiederholen | |||
| WebUI findet das Modell nicht | falsche Basis-URL aus dem Container heraus | http://host.docker.internal:1234/v1 verwenden, nicht localhost | |||
| podman restart schlaegt fehl | falscher Container-Name | echten Namen mit podman ps -a pruefen | |||
| Port bereits belegt | ein alter Prozess haelt den Port | sudo lsof -i :1234 (ebenso fuer 3000 und 8188), den Prozess beenden | |||
| Erste Antwort nach dem Neustart langsam | Modell wird noch geladen | auf den voelllaendigen Ladevorgang warten, Statusanzeige in LM Studio beobachten |
Lokaler AI-Stack - Teil 2: RAG-Wissensdatenbank (Zahnarztabrechnung)
Ziel: Die fuenf Abrechnungsdokumente in die Wissensdatenbank “Zahnarztabrechnung” laden, das Modell “Zahn-Abrechnungs-Assistent” einrichten und pruefen, dass die Antworten aus den Dokumenten stammen und mit korrekten Quellenangaben versehen sind.
Voraussetzung: Teil 1 ist abgeschlossen - LM Studio serviert qwen3.8-27b auf Port 1234 und Open WebUI ist auf Port 3000 erreichbar.
1. Embedding-Modell setzen (muss zuerst geschehen)
RAG arbeitet in zwei Schritten:
1. Der Dokumenttext wird in Abschnitte (Chunks) zerlegt und von einem Embedding-Modell in Vektoren umgewandelt. 2. Zur Chatzeit wird die Frage auf dieselbe Weise in einen Vektor umgewandelt. Die aehnlichsten Abschnitte werden abgerufen und als Quellenangabe angezeigt.
Ohne Embedding-Modell kann Schritt 1 nicht stattfinden und die Wissensdatenbank bleibt leer.
1. Open WebUI, Einstellungen, Modelle 2. Als Embedding-Modell: nomic-embed-text-v1.5 setzen (eingebaut - kein Ollama und kein zusaetzliches LM-Studio-Modell noetig) 3. Pruefen: In der Modellliste wird das Embedding-Modell als aktiv angezeigt
Ausweichloesung: Falls die deutsche Abrufqualitaet mangelhaft ist: bge-m3 ueber Ollama installieren und das Embedding-Modell darauf umstellen.
2. PDFs vorbereiten
| Nr. | Dokument | Quelle | Hinweis | ||||
| 1 | SGB V (Volltext) | gesetze-im-internet.de | 577 Seiten, enthaelt fremde Bereiche (Apotheke, Krankenhaus) - siehe Schritt 2.1 | ||||
| 2 | KZBV FZ-Kompendium 2025 | KZBV | gesetzliche Festzuschuesse | ||||
| 3 | GOÄ / GOZ | pkv.de | private Gebuehrenordnungen | ||||
| 4 | BEL-Preisliste 2025 | kvzbw.de | Abrechnungspositionen fuer Zahntechnikerlabore | ||||
| 5 | BEB-Preisliste 2024 | itzgmbh.de | eingescannt (bildbasiert) - OCR erforderlich, siehe Schritt 3 |
Vorkontrolle fuer jedes PDF (ca. 30 Sekunden):
1. Im Browser oder PDF-Betrachter oeffnen 2. Text markieren und kopieren 3. Wird Text kopiert: in Ordnung 4. Zeigt die Seite nur ein Bild: OCR-Problem (betrifft die BEB-Datei)
Schritt 2.1 - SGB V kuezen (optional, empfohlen):
Das komplette SGB V umfasst 577 Seiten und zieht Inhalte aus dem Apotheken- und Krankenhausbereich mit hinein, die bei zahnmedizinischen Fragen als Quellenangabe auftauchen koennen. Falls solches Rauschen in den Quellen sichtbar wird:
1. Das Dokument aus der Wissensdatenbank entfernen 2. Eine gekuerzte Version hochladen, die nur Teil 3, Paragraphen 55 bis 66 (die zahnmedizinisch relevanten Kapitel) enthaelt 3. Auf den Abschluss der Verarbeitung warten
3. OCR fuer die BEB-Datei einschalten
Symptom ohne OCR: Die BEB-Zitate fehlen oder sind unsinnig, waehrend alle anderen Dokumente funktionieren. Ursache: Die BEB-Seiten sind gescannte Bilder, die Textextraktion liefert nichts.
Loesung:
1. Open WebUI, Admin, Einstellungen, Dokumente 2. Option “PDF Extract Images (OCR)” aktivieren 3. Den alten BEB-Eintrag in der Wissensdatenbank loeschen (wichtig - sonst bleibt der leere, veraltete Index erhalten) 4. Das BEB-PDF erneut hochladen 5. Auf den Status “verarbeitet” warten
OCR dauert deutlich laenger als die normale Textextraktion - bei groesseren PDFs einige Minuten. Das ist normal.
4. Benutzerkonto fuer den Kunden anlegen
1. Open WebUI, Einstellungen, Benutzer 2. Neuen Benutzer anlegen 3. Benutzername: artz 4. Passwort: gemeinsam mit dem Kunden festlegen und sicher uebergeben 5. Rolle: Benutzer (keine Admin-Rechte)
Der Benutzer artz erhaelt im Schritt 5 die Leseberechtigung fuer die Wissensdatenbank.
5. Wissensdatenbank erstellen
1. Open WebUI, Wissensdatenbanken, neue Wissensdatenbank anlegen 2. Name: Zahnarztabrechnung 3. Dokumente hinzufuegen: alle fuenf PDFs hochladen (BEB nach Schritt 3) 4. Warten, bis jedes Dokument den Status “verarbeitet” hat und keine Fehler angezeigt werden 5. Berechtigungen: Benutzer artz, Zugriff Lesen
Schnelltest (vor dem Modell):
1. Neue Chat-Sitzung, Wissensdatenbank Zahnarztabrechnung anhaengen 2. Frage: Welcher gesetzliche Festzuschuss gilt fuer eine Krone? 3. Erwartet: Antwort mit sichtbaren Quellenangaben aus dem FZ-Kompendium 2025
6. Modell Zahn-Abrechnungs-Assistent erstellen
Anlegen:
1. Open WebUI, Einstellungen, Modelle, neu anlegen 2. Name: Zahn-Abrechnungs-Assistent 3. Basismodell: qwen3.8-27b (aus LM Studio) 4. Wissensdatenbank Zahnarztabrechnung anhaengen
Systemprompt (Deutsch, direkter Stil):
Du bist ein Experte fuer die deutsche Zahnarzt- und Zahntechnikerabrechnung (GOÄ/GOZ, KZBV FZ-Kompendium, BEL und BEB, SGB V).
Antworte direkt auf Basis der bereitgestellten Dokumente. Nenne immer: - die konkrete Positionsnummer - den Preis - die Edition der Preisliste (z. B. BEB 2024, BEL 2025) - das Quelldokument
Stelle keine Rueckfragen. Wenn Informationen fehlen, sage das klar, statt zu raten. Diese Abfragen erteilen keine Rechtsberatung.
Zusaetzliche Einstellungen:
1. Das eingebaute Ask-User-Tool deaktivieren (Einstellungen, Tools). Sonst stellt das Modell Rueckfragen (z. B. “Welche Zahnnummer?”), statt direkt aus den Dokumenten zu antworten. 2. In der Chat-Oberflaeche als Antwortmodell auswaehlen
7. Gesamtfunktionstest
1. Browser: http://<server-ip>:3000, als artz anmelden 2. Modell Zahn-Abrechnungs-Assistent auswaehlen 3. Die folgenden Fragen nacheinander stellen:
| Testfrage | Erwartete Antwortbestandteile | ||
| Welche GOZ-Position gilt fuer eine Kompositfuellung an einem Schneidezahn? | GOZ 2010, Preis, Quelle | ||
| Was kostet eine Vollkeramikkrone nach BEB? | BEB-Positionsnummer, Preis, Edition 2024 | ||
| Wie hoch ist der gesetzliche Festzuschuss fuer einen Inlay? | FZ-Kompendium 2025, Betrag, Quelle | ||
| Welche BEL-Position deckt eine Teilprothese ab? | BEL-Position, Preis, Edition 2025 |
Checkliste fuer jede Antwort:
* Quellenangabe sichtbar (Dokumentenname und Abschnitt) * Konkrete Positionsnummer und Preis * Edition genannt (BEB 2024 / BEL 2025 / FZ 2025) * Bei fehlenden Informationen: klare Aussage statt erfundener Antwort
8. Fehlerbehebung
| Symptom | Ursache | Loesung | |||
| Antwort ohne Quellen, Inhalt wirkt erfunden | RAG ist nicht an das Modell angehaengt | Wissensdatenbank am Modell und an der Chat-Sitzung anhaengen | |||
| BEB liefert keine sinnvollen Zitate | PDF ist bildbasiert, keine Textschicht | OCR einschalten (Schritt 3), Dokument loeschen und neu hochladen | |||
| SGB V-Zitate zeigen Apotheken- oder Krankenhausinhalt | 577-Seiten-Volltext ist zu breit | auf Paragraphen 55 bis 66 kuezen (Schritt 2.1), Dokument ersetzen, neu indexieren | |||
| Modell stellt Rueckfragen statt zu antworten | eingebautes Ask-User-Tool ist aktiv | im Schritt 6, Punkt 1 deaktivieren | |||
| artz sieht die Wissensdatenbank nicht | Berechtigung fehlt | Wissensdatenbank auswaehlen, Lesezugriff fuer artz setzen | |||
| Erste Antwort bei groesseren Dokumenten langsam | Indexierung und Vektorisierung laufen noch | auf Status “verarbeitet” warten, dann erneut fragen | |||
| Nach neuem Indexieren erscheinen alte Zitate | veralteter Indexeintrag | Dokument komplett aus der Wissensdatenbank entfernen, dann neu hochladen |
