45:57Chase AI
Log in to leave a comment
No posts yet
Beim Aufbau eines RAG-Systems in einer lokalen Umgebung ist die erste Hürde, auf die man stößt, die VRAM-Kapazität und hartnäckige Versionskonflikte zwischen Bibliotheken. Ein 8-Bit-quantisiertes Modell verbraucht etwa 1 GB VRAM pro 1 Milliarde Parameter. Berücksichtigt man die Auslastung durch Windows oder macOS selbst, sollte man mindestens 20 % Freiraum lassen. Ohne diesen Puffer sinkt die Token-Generierungsgeschwindigkeit auf ein erbärmliches Niveau von etwa 2 Token pro Sekunde. Insbesondere das lightrag-hku-Framework neigt zu Laufzeitfehlern, wenn es auf die neueste numpy 2.x-Version trifft.
Öffnen Sie zunächst das Terminal und fixieren Sie die Version mit pip install numpy==1.26.4 --force-reinstall. Installieren Sie danach nest_asyncio und fügen Sie nest_asyncio.apply() ganz oben in Ihrem Code ein. Ohne dies wird der asynchrone Loop in Jupyter Notebooks durcheinandergebracht, was den gesamten Prozess zum Stillstand bringt. Wenn Ihr GPU-Speicher 8 GB oder weniger beträgt, setzen Sie bei der Initialisierung von LightRAG embedding_batch_num auf maximal 10 und llm_model_max_async auf etwa 4. Allein durch diese Einstellungen können Sie OOM-Phänomene (Out Of Memory), bei denen das System ohne ersichtlichen Grund abstürzt, verhindern und sich gut zwei Stunden Fehlersuche ersparen.
Speichert man Text einfach nur in Blöcken, geht der Kontext zwischen den Informationen verloren. Wenn man jedoch die Wikilink-Struktur ([[link]]) von Obsidian korrekt parst, lässt sich ein beachtlicher Wissensgraph erstellen. Der Kernpunkt ist das Entfernen unnötiger Markdown-Symbole, bevor das LLM sie liest. Allein durch das Bereinigen dieser Zeichen lässt sich der Token-Verbrauch um fast 30 % senken.
Gewöhnen Sie sich an, Felder wie type oder domain im YAML-Bereich am Anfang Ihrer Notizen einzufügen. Dies beschleunigt die Suchfilterung erheblich. Verwenden Sie im Python-Modul re das Muster r"\[\[(.+?)\]\]", um die Verbindungen zwischen Dokumenten zu extrahieren, und konvertieren Sie diese dann in ein Beziehungs-Datenset im JSONL-Format. Auch der Dateiname ist wichtig. Anstelle eines Datums wie "2024-04-14" sollte das Kernthema des Wissens als Titel verwendet werden, damit die indexierten Knoten ihre Aufgabe erfüllen. So aufbereitete Daten ermöglichen über die einfache Suche hinaus ein Schlussfolgern über verschiedene Konzepte hinweg.
Das Verschwenderischste beim Betrieb eines lokalen LLM ist die Zeit, die für die erneute Berechnung bereits berechneter Embeddings aufgewendet wird. Der Standard-Cache von Python geht verloren, sobald das Programm beendet wird. Daher sollte man mit DiskCache auf SQLite-Basis einen physischen Speicher erstellen. Entwerfen Sie das System so, dass bei einer Kosinus-Ähnlichkeit zwischen Fragen von über 0,95 das LLM nicht aufgerufen, sondern direkt die gecashte Antwort zurückgegeben wird. Durch die Implementierung eines solchen semantischen Cachings lässt sich die Antwortzeit auf etwa 100 ms reduzieren.
Die Methode ist einfach: Installieren Sie die Bibliothek mit pip install diskcache und erstellen Sie eine Klasse, die Embedding-Texte und Vektor-Paare speichert. Es ist noch besser, dies mit einem Zeitgewichtungs-Algorithmus zu kombinieren.
Die Logik wird so aufgebaut, dass gerade bearbeitete Notizen oben in den Suchergebnissen erscheinen. Wenn man die TTL (Time To Live) für den Embedding-Cache auf 1 Stunde und für den Antwort-Cache auf 2 Stunden festlegt, erhält man ein System, das auf wiederholte Fragen sofort reagiert.
Architekturdiagramme oder Screenshots in Notizen enthalten oft viel mehr Informationen als reiner Text. Es wäre ein Verlust, diese bei der Suche außen vor zu lassen. Mit dem CLIP-Modell können Bilder und Texte im selben Vektorraum platziert werden, sodass man relevante Bilder findet, selbst wenn man nur nach "Datenflussdiagramm" sucht. Falls keine High-End-GPU vorhanden ist, kann das CLIP-ViT-B-32-Modell in das OpenVINO-Format konvertiert und über die CPU betrieben werden.
Wenn Sie einen Bildpfad in einer Markdown-Datei finden, gruppieren Sie diesen mit etwa 200 Zeichen Text davor und danach. Extrahieren Sie anschließend mit einem leichten lokalen VLM wie Phi-3.5-vision automatisch Bildbeschreibungen (Captions). Speichern Sie diesen Caption-Vektor und den Bild-Feature-Vektor zusammen in einer lokalen Vektor-Datenbank wie Qdrant. Durch diesen Prozess werden selbst komplexe Grafiken, die schwer in Text zu fassen sind, in die Suchergebnisse einbezogen.
Es ist ineffizient, das gesamte Archiv bei jeder Änderung an einer einzelnen Datei neu zu indexieren. Mit der Python-Bibliothek watchdog lässt sich der Moment des Speicherns erkennen, um nur die geänderten Teile zu aktualisieren. Da die CPU jedoch schreien würde, wenn die Indexierung während des Schreibens ständig läuft, ist ein Debouncing-Mechanismus unerlässlich.
Lassen Sie das Skript mit watchdog.observers den Ordner überwachen und bei einem Änderungsereignis etwa 5 Sekunden warten, bevor die Arbeit beginnt. Speichern Sie die SHA-256-Hashwerte jeder Datei separat und gleichen Sie ab, ob sich der Inhalt tatsächlich geändert hat. Wählen Sie nur die Dateien mit geänderten Hashes aus, löschen Sie die alten Knoten und fügen Sie die neuen Vektoren ein. So entsteht eine Echtzeit-Wissensdatenbank, die Änderungen sofort nach dem Speichern der Notiz im Suchsystem widerspiegelt – ganz ohne manuelles Klicken auf einen Update-Button.