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

  1. Frontmatter → Metadaten (Titel, Service, Repo, URL)
  2. Split an Markdown-Überschriften #, ##, ###
  3. Unterteilung in Chunks à 1000 Zeichen mit 15 % Überlappung
  4. 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össen ram, disk, cpu, uptime
  • list_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.