Deutsches LLM Wiki – ein Obsidian-Plugin

Seit einiger Zeit sammle ich Wissen in Obsidian. Unterrichtsmaterialien, Ideen fĂŒr den Physikunterricht, Notizen zu Robotik-Projekten, Schul-IT, BĂŒchern, etc – alles brav verlinkt, aber irgendwie doch schwer durchsuchbar. Dann stieß ich auf LLM Wiki, ein Plugin, das Andrej Karpathys Idee von LLM Knowledge Bases umsetzt. Dabei geht es darum, mit einem LLM eine persönliche, durchsuchbare Wissensbasis aus den eigenen Notizen zu bauen. Dieses Plugin klang vielversprechend und entsprach dem, was ich gesucht habe – aber es gab einen Haken: die deutsche Sprache.

Was das Plugin macht

LLM Wiki liest den gesamten Vault, schickt jede Notiz an ein lokales Sprachmodell und extrahiert daraus strukturiertes Wissen: EntitĂ€ten (Personen, Tools, Projekte, BĂŒcher
), Konzepte und die Verbindungen zwischen ihnen. Alles landet in einer wiki/knowledge.json-Datei, und fĂŒr jede EntitĂ€t wird eine eigene Markdown-Seite generiert – kompatibel mit Obsidians Bases. Fragen stellt man dann in natĂŒrlicher Sprache, das Plugin sucht den passenden Kontext heraus und schickt ihn zusammen mit der Frage ans Modell.

|642x568)

Das Ganze lĂ€uft per Default vollstĂ€ndig lokal: Ollama mit bei mir gemma4:e4b-it-qat als Chat-Modell. Das im englischen PlugIn voreingestellte nomic-embed-text fĂŒr Embeddings habe ich fĂŒr die deutsche Version durch qllama/multilingual-e5-base ersetzt, da es bessere Ergebnisse lieferte.

Beide Modelle laufen auf meiner nicht unbedingt auf KI-Anwendung ausgelegten und nicht ganz neuen Hardware sehr flĂŒssig und ohne Probleme:

Gemma4 habe ich mittels Modelfile noch zusÀtzlich an den Einsatz in Obsidian angepasst. Der allgemeine Befehl dazu lautet ollama create choose-a-model-name -f <location of the file e.g. ./Modelfile> und das ist mein verwendetes Modelfile

Kein Cloud-Account, keine Daten, die das eigene GerĂ€t verlassen. So muss ich mir als Lehrer, der auch mit SchĂŒler- und Unterrichtsdaten arbeitet, keine Sorgen bei der Verwendung von KI machen.

Warum ein Fork fĂŒr Deutsch?

Das Original-Plugin ist ganz auf die Sprache Englisch ausgerichtet. Nicht nur die UI – der eigentliche Extraction-Prompt, der Herzschlag des Systems, fragte das Modell in englischen Instruktionen nach englischen Ausgaben. FĂŒr einen deutschsprachigen Vault bedeutet das: Das LLM extrahiert EntitĂ€ten und beschreibt Konzepte auf Englisch, obwohl die Quellen auf Deutsch sind. Suchen auf Deutsch finden dann nichts oder Falsches.

Noch schlimmer war aber, dass beim Aufbau der Wissensdatenbank deutsche Stoppwörter nicht ausgefiltert wurden und so alles zugemĂŒllt wurde. Das Ergebnis war kaum brauchbar.

Ich habe deshalb llm-wiki-german als Fork gestartet – als Proof of Concept dafĂŒr, dass LLM Knowledgebases auch auf Deutsch brauchbare Ergebnisse liefern, wenn auf die Besonderheiten der Sprache RĂŒcksicht genommen wird.

Gleichzeitig war es eine gute Gelegenheit, Vibe Coding mit der Gemini CLI auszuprobieren.

Die sprachlichen Herausforderungen

Der Extraction-Prompt auf Deutsch

Der erste und wichtigste Schritt war, den Extraction-Prompt komplett auf Deutsch umzuschreiben. Im Fork ist er jetzt vollstĂ€ndig auf Deutsch formuliert – von den Regeln fĂŒr das Modell bis zu den JSON-Beispielen. Der Prompt instruiert das Modell explizit, die Ausgabe in der konfigurierten {output_language} zu liefern, unabhĂ€ngig von der Sprache des Quelltexts. So kann man auch einen gemischten Vault (z. B. mit englischen Fachartikeln und deutschen Unterrichtsnotizen) konsistent auf Deutsch oder Englisch indexieren. Die Extraktionssprache ist inzwischen frei konfigurierbar: Deutsch, Englisch, Französisch, Spanisch, Italienisch, NiederlĂ€ndisch und Portugiesisch stehen zur Auswahl.

Stoppwörter und Tokenisierung

Die Keyword-Suche im Original war rein auf Englisch ausgelegt. FĂŒr den deutschen Vault musste ich die Stoppwortliste in terms.ts massiv erweitern: der, die, das, ein, eine, ist, sind, von, zu, und, oder, aber, wenn
 Ohne das wĂŒrden diese hĂ€ufigen Wörter das Ranking dominieren und irrelevante Treffer nach oben spĂŒlen.

Morphologie: Flexion, Umlaute und Komposita

Hier liegt die eigentliche KomplexitĂ€t. Das Deutsche flektiert Nomen in vier FĂ€llen, Adjektive in drei Genera, und Verben konjugieren vielfĂ€ltig. Ein einfacher Stemmer, der den Wortstamm zurĂŒckgeben soll, muss also Endungen wie -ern, -ers, -en, -er, -es, -em, -e und -n abschneiden. Dazu kommt die Umlaut-Normalisierung: Ă€ → a, ö → o, ĂŒ → u, ß → ss. Das erlaubt es, dass eine Suche nach „Buch" auch „BĂŒcher" findet, weil beide auf denselben Wortstamm (Stem) reduziert werden.

Noch kniffliger sind Komposita – das deutsche SpezialphĂ€nomen, beliebig lange Wörter zu bilden. „Wissensbasis", „Unterrichtsmaterial", „SchĂŒlerarbeitsblatt" sind fĂŒr einen naiven Tokenizer ein einziges langes Token, das semantisch gesehen aus mehreren Konzepten besteht. Im Fork gibt es dafĂŒr eine heuristische Compound-Splitting-Funktion: Wörter ab 8 Zeichen werden an typischen Fugenmorphemen (vor allem dem Fugen-s) aufgesplittet. So wird Wissensbasis in Wissen und Basis zerlegt, und beide Teile fließen separat ins Ranking ein.

Embeddings und semantische Suche

Der semantische Teil der Suche lĂ€uft ĂŒber qllama/multilingual-e5-base, mein Ersatz fĂŒr nomic-embed-text, das primĂ€r auf Englisch trainiert wurde. Das mehrsprachige Embedding-Modell multilingual-e5 liefert deutlich bessere Ergebnisse fĂŒr deutsche Texte.

ZusĂ€tzliche Features ĂŒber das Original hinaus

Im Laufe der Entwicklung ist das Plugin deutlich ĂŒber die reine Deutschsprachigkeit hinausgewachsen. Eine Auswahl der Features, die im Original nicht vorhanden sind:

Mehrere LLM-Anbieter. Neben Ollama unterstĂŒtzt das Plugin jetzt OpenAI, Anthropic, Google Gemini, Mistral, LlamaCpp als lokales Backend und einen generischen OpenAI-kompatiblen Endpunkt (z. B. fĂŒr LM Studio oder eigene vLLM-Server). Cloud-Anbieter sind opt-in und in den Einstellungen klar als solche gekennzeichnet – wer auf Datenschutz angewiesen ist (ich als Lehrer definitiv), bleibt einfach bei Ollama.

Multi-Folder-Index. Man kann festlegen, welche Vault-Ordner in die Wissensdatenbank einfließen. Das ist sinnvoll, wenn man z. B. nur Unterrichtsmaterialien indexieren möchte, aber nicht die privaten TagebucheintrĂ€ge.

IntegritĂ€tsprĂŒfung (Lint). Der Befehl „Wissensdatenbank aufrĂ€umen und prĂŒfen" analysiert die gesamte kb.json auf Probleme: verwaiste Verbindungen, fehlende Quellen, doppelte EintrĂ€ge, redundante Fakten. FĂŒr viele Probleme gibt es eine automatische Bereinigung – redundante Fakten werden sogar per LLM zusammengefĂŒhrt.

Protokollierung. Alle Extraktionen, Dateilöschungen und Abfragen landen in wiki/log.md. So lÀsst sich jederzeit nachvollziehen, was mit der Wissensdatenbank passiert ist.

Inhaltsverzeichnis. In der Datei wiki/index.md sind alle Begriffe das Wikis aufgelistet und verlinkt.

Mehrere GesprĂ€chsrunden. Chats werden gespeichert und sind fortsetzbar. Man kann ein GesprĂ€ch dort weitermachen, wo man aufgehört hat – hilfreich fĂŒr lĂ€ngere Recherchen.

Inhaltsbasierte Deduplizierung. Die Erkennung, ob eine Notiz seit der letzten Extraktion geĂ€ndert wurde, lĂ€uft jetzt ĂŒber SHA-256-Hashes statt ĂŒber Datei-Timestamps. Das verhindert unnötige Neu-Extraktionen, wenn z. B. iCloud oder OneDrive die Timestamps beim Sync anfasst.

Vibe Coding mit Gemini CLI / Antigravity / Cline

Ein persönlicher Bonus dieses Projekts war das Ausprobieren von Gemini CLI als Coding-Assistent. Die Kombination aus einem klar beschriebenen Problem (Deutsch-Support) und einem iterativ arbeitenden LLM-Assistenten hat gut funktioniert – besonders fĂŒr die Prompt-Übersetzung und das Ausarbeiten der Stemmer-Logik. Der Ansatz zeigt, wie man ein bestehendes Open-Source-Plugin relativ schnell fĂŒr die eigene Sprache adaptieren kann, ohne von Null anzufangen.

Nachdem Gemini CLI eingestellt und Antigravity im kostenfreien Betrieb nur mehr sehr eingeschrĂ€nkt nutzbar wurde, wechselte ich vermehrt auf Cline - AI Coding. Was mit der Open-Source Lösung Cline und seinen frei zur VerfĂŒgung stehenden Modellen möglich ist, ist beeindruckend und war fĂŒr dieses ĂŒberschaubare Projekt jedenfalls eine große Hilfe.

Aktueller Stand und Ausblick

Das Plugin ist lauffÀhig und in meinem Vault im Einsatz. Die aktuelle Version ist 1.0.6.

FĂŒr eine erste Indexierung von ~600 Notizen muss man Geduld mitbringen – die im englischen angegebenen Zeiten (ca. 4 Stunden) werden durch die komplexeren AblĂ€ufe im Deutschen etwas verlĂ€ngert. Im laufenden Betrieb werden nur geĂ€nderte Dateien neu extrahiert (erkannt via SHA-256-Hash), was in Sekunden erledigt ist. FĂŒr vollstĂ€ndige Aktualisierungen gibt es optional einen nĂ€chtlichen Planer.

Befehle

Befehl Funktion
Wissensdatenbank abfragen Öffnet das Chat-Modal
Extrahierung starten Indiziert den gesamten Vault neu
aktuelle Datei extrahieren Extrahiert nur die aktive Notiz neu
laufende Extrahierung abbrechen Bricht eine laufende Extraktion ab
Seiten aus Wissensdatenbank neu generieren Baut alle Wiki-Seiten neu auf
Wissensdatenbank von der Festplatte neu laden LĂ€dt die Wissensdatenbank ohne Neu-Extraktion
Wissensdatenbank aufrĂ€umen und prĂŒfen FĂŒhrt eine IntegritĂ€tsprĂŒfung und Reparatur durch

Der Quellcode liegt offen auf github.com/matheharry/llm-wiki-german. Wer ebenfalls einen deutschen Obsidian-Vault hat und LLM Wiki ausprobieren will, ist herzlich eingeladen, mitzumachen – Issues, PRs und Erfahrungsberichte sind willkommen.