Homelab / AI
Wiki Chat
RAG über Wiki und Service-Handbücher — plus read-only Werkzeuge für RAM, CPU, Platte und Laufzeit, wenn die Werte nie im Wiki stehen.
Wiki Chat beantwortet Fragen zur Homelab-Dokumentation auf Deutsch — und trennt klar zwei Quellen. Handbuchfragen kommen aus dem indexierten Wiki und den Service-Handbüchern, mit nummerierten Quellen. Fragen nach dem aktuellen Maschinenstand (RAM, CPU, Platte, Laufzeit) gehen an read-only Werkzeuge, weil diese Werte nie in den Seiten stehen.
Abgrenzung: Open WebUI ist freier lokaler Chat. Die Ops AI Showcases sind die Multi-Pass-Pipeline für Patch-Notes und Alert-Analysen. Wiki Chat bleibt bei Handbuch-RAG plus gezielten Messwerten — kein Blind-Ops.
Zweck
Zwei Antworten, klar getrennt:
- Handbuch — Antwort nur aus den geladenen Markdown-Ausschnitten; Zitate als
[1],[2]. Steht die Antwort nicht im Kontext, heisst es genau «Das steht nicht im Wiki.» Folgefragen nutzen die letzten drei Austausche; die Frage wird zuerst zu einer eigenständigen Suchanfrage verdichtet. - Live-Stand — das Sprachmodell ruft Werkzeuge auf (
get_host_metrics,list_known_hosts). Zahlen kommen nur aus den Werkzeugen; die Fusszeile nennt Quelle und Uhrzeit.
Korpus
Der Index spiegelt denselben Inhalt wie das Wiki-Portal: Markdown aus dem Portal-Repo plus den Service-Handbüchern aus den Lab-Repos (Sparse-Checkout, Abgleich mit dem Sync-Katalog). Periodischer Abgleich und inkrementeller Neuindex: nur geänderte Abschnitte werden neu eingebettet. Verschobene Abschnitte behalten ihre Embeddings über stabile Content-Hash-IDs.
Aufbereitung
- Frontmatter → Metadaten (Titel, Service, Repo, URL)
- Split an Markdown-Überschriften
#,##,### - Unterteilung in Chunks à 1000 Zeichen mit 15 % Überlappung
- Breadcrumb (
Titel > h1 > h2 > h3) vor dem Chunk-Text für den Embedding-Kontext
Suche
Konfiguration qwen3-embedding-8b-instr-c1000-k8-hyb:
| Baustein | Wahl |
|---|---|
| Embedding | lokal Qwen3 Embedding 8B — Instruktionspräfix nur auf der Frage, Dokumente ohne |
| Store | Chroma (persistenter Index) |
| Lexikalisch | BM25 im Prozess |
| Fusion | Reciprocal Rank Fusion (k = 60) |
| Top-K | 8 Chunks |
Hybrid-Suche hebt Gold-MRR von 0.740 auf 0.808 (376 Fragen); bei Zahlenfragen 0.827 gegen 0.678. Ports, Unit-Namen und Versionsstrings treffen so besser als reine Vektorsuche.
Wiki-Antwort
Verdichtung der Folgefrage mit Qwen3.5 9B, dann Hybrid-Suche, dann Streaming mit Qwen3.6 27B (num_ctx 16384, Temperatur ~0.1). Optionales LLM-Reranking ist im Betrieb aus.
Gemessen auf 361 Wiki-Fragen: Genauigkeit etwa 4.47 / 5; alle 45 Negativfragen korrekt abgelehnt. Vorgaben («laut Wiki», «braucht», «empfohlen») bleiben auf dem Handbuch-Pfad — auch wenn RAM oder CPU im Satz vorkommen.
Werkzeuge für den Live-Stand
Gleichrangig zum RAG. Das Modell bekommt über LangChain bind_tools genau zwei Funktionen:
get_host_metrics(host, metric)— Messgrössenram,disk,cpu,uptimelist_known_hosts— bekannte Hostnamen aus der Service-Tabelle des Wikis
Höchstens drei Werkzeugrunden. Der Prompt verlangt: nur gelieferte Zahlen; sonst ehrlich sagen, dass kein Wert da ist. Liefert das Modell keinen Aufruf oder kann es keine Tools, folgt eine feste formatierte Antwort aus denselben Lesern — erfundene Zahlen gibt es in keinem der beiden Fälle.
Zugriff nur lesend: feste Prometheus-Instant-Queries, sonst die Proxmox-API. Kein SSH, kein freies PromQL aus der Frage. Hostnamen kommen aus dem Wiki-Inventar, nicht aus dem Modell. Die Fusszeile nennt die Quelle (Prometheus oder Proxmox-API) und die Uhrzeit.
Routing: eindeutiges «jetzt / frei / gerade» geht direkt an die Werkzeuge, ohne Wiki-Suche. Schwächere Live-Fragen erst, wenn der beste Vektor-Treffer unter der Schwelle liegt oder das Wiki «Das steht nicht im Wiki» sagt.
flowchart TD
frage[Frage] --> verdichtung[Verdichtung]
verdichtung --> route{Live-Stand?}
route -->|jetzt oder frei| tools[Werkzeuge]
route -->|Handbuch| suche[Hybrid Suche]
suche --> chroma[Chroma]
suche --> bm25[BM25]
chroma --> fusion[RRF]
bm25 --> fusion
fusion --> wiki[Qwen3 mit Wiki-Quellen]
wiki -->|steht nicht im Wiki| tools
tools --> metrics["get_host_metrics: RAM CPU Platte Laufzeit"]
metrics --> prom[Prometheus]
metrics --> pve[Proxmox-API]
prom --> liveAntwort[Antwort mit Quelle und Uhrzeit]
pve --> liveAntwort
Betrieb und Auswertung
Ein Container (Python 3.12, Gradio), ein Replica mit persistentem Index, Recreate wegen eines beschreibbaren Volumes. Image-Build bei Git-Tag in die private Registry, Ausrollen über GitOps. Die Modelle laufen auf einem eigenen Ollama-Rechner, nicht im Chat-Pod.
Die Streamlit-Auswertung und die 2D/3D-Chunk-Karte bleiben Labor auf der Workstation: 376 Fragen (davon 15 Live und 272 mit Gold-Seite). Live-Check prüft Host, Messgrösse, Zahl mit Einheit und genannte Quelle — im Lauf vom 26.10. 13 von 15.
Weiter im Kontext: Ops AI Showcases, Observability, Services.