← Homelab

Von der Ingestion zur ersten befüllten Datenbank

Mit dem Embedding-Modell steht die Übersetzung von Text in Zahlenreihen. Jetzt braucht es zwei Dinge: einen Ort, an dem diese Zahlenreihen leben, und ein Skript, das sie für den gesamten Notizbestand erzeugt und dorthin schreibt.

4 Min. Lesezeit
Von der Ingestion zur ersten befüllten Datenbank - Vector Search
Inhalt · 7 Abschnitte
  1. Was in die Datenbank kommt
  2. Das Schema: eine Tabelle, ein Index
  3. Der Einleser mit Gedächtnis
  4. Der Stolperstein: eine Netzwerkfreigabe
  5. Der erste volle Lauf
  6. Fazit
  7. Ausblick

Mit dem Embedding-Modell steht die Übersetzung von Text in Zahlenreihen. Jetzt braucht es zwei Dinge: einen Ort, an dem diese Zahlenreihen leben, und ein Skript, das sie für den gesamten Notizbestand erzeugt und dorthin schreibt. Dieser Teil beschreibt das Schema der Datenbank, den sogenannten Ingestion-Service, den ersten vollen Lauf über 1.740 Notizen und einen Kompromiss, den eine unscheinbare Netzwerkfreigabe erzwang.

Was in die Datenbank kommt

Die Suche soll drei Arten von Notizen abdecken: die rohen Eingangsnotizen aus den Erfassungswegen, bereits verarbeitete Notizen und die Zusammenfassungen der Themencluster aus den Übergabe-Artefakten. Sie unterscheiden sich in ihren Metadaten: Tags und Themenbereich heißen je nach Quelle anders und stehen an anderer Stelle. Das Skript muss sie deshalb erst vereinheitlichen, bevor alle in dieselbe Tabelle passen.

Das Schema: eine Tabelle, ein Index

Pro Notiz gibt es genau eine Zeile in einer Tabelle. Sie enthält den Pfad der Notiz als eindeutige Kennung, den Quelltyp, Tags und Themenbereich, eine Prüfsumme des Inhalts, die 768 Zahlen des Embeddings und einen Zeitstempel. Dazu kommt ein spezieller Index vom Typ HNSW. Ohne ihn müsste die Datenbank bei jeder Suche die Anfrage mit jeder einzelnen Zahlenreihe vergleichen. Der Index legt stattdessen eine Art Navigationskarte an und findet den nächsten Nachbarn unter Tausenden Einträgen in Millisekunden. Man kann ihn sich wie ein Inhaltsverzeichnis vorstellen, das man nicht Seite für Seite durchblättern muss. Als Ähnlichkeitsmaß nutzt er dieselbe Cosine-Similarity wie der Modelltest.

Der Einleser mit Gedächtnis

Der Ingestion-Service liest alle Notizen, schickt jede an Ollama zum Embedding und schreibt das Ergebnis in die Datenbank. Damit nicht bei jedem Lauf alles neu berechnet werden muss, speichert er zu jeder Notiz eine Prüfsumme über ihren Inhalt (SHA-256). Beim nächsten Lauf wird nur neu berechnet, was sich tatsächlich geändert hat. Das ist wichtig, weil jede Berechnung Zeit kostet und der Bestand weiter wächst. Ein Test bestätigte es: Ein zweiter Lauf über dieselben 20 Notizen ergab null neue, null aktualisierte und 20 unveränderte Einträge.

Der Stolperstein: eine Netzwerkfreigabe

Eigentlich sollte auch der Ingestion-Service als Container laufen, als vierter Dienst im Stack. Der Vault liegt aber auf einer Netzwerkfreigabe des NAS, die unter Windows als Laufwerk eingebunden ist. Docker Desktop kann solche an die Windows-Sitzung gebundenen Freigaben nicht in einen Container durchreichen: Der Ordner im Container blieb leer, obwohl alles richtig konfiguriert schien. Ich habe mich für einen Kompromiss statt einer Verzögerung entschieden. Der Ingestion-Service läuft in der Entwicklungsphase direkt auf dem Windows-Rechner und spricht die containerisierten Dienste über localhost an. Auf einem Linux-Host lässt sich die Freigabe dagegen wie in der Claude-Remote-LXC auf dem Host einbinden und per Bind-Mount durchreichen. Dort wird die Containerisierung wie geplant nachgeholt.

Der erste volle Lauf

Der Lauf über den gesamten Bestand umfasste 1.740 Notizen: 1.665 Eingangsnotizen, 40 verarbeitete Notizen und 35 Cluster-Zusammenfassungen. Er dauerte knapp drei Minuten. Das ist deutlich schneller als der Modelltest erwarten ließ (0,92 Sekunden pro Notiz, hier rund 0,10). Im Test fiel das Laden des Modells bei jeder kleinen Stichprobe stärker ins Gewicht, im Dauerlauf entfällt dieser Aufwand. Danach habe ich die Zählung nach Quelltyp mit den Dateien im Vault abgeglichen: Es fehlte nichts. Eine Sicherung der Datenbank ist als Dump angelegt, und ein erster Stichproben-Check ergab thematisch plausible Nachbarschaften über alle drei Quelltypen hinweg.

Fazit

Zum Modell aus dem letzten Teil gehört jetzt der Ort, an dem seine Ergebnisse liegen: eine Tabelle mit Index, ein Skript mit Gedächtnis und eine gefüllte Datenbank. Befüllt heißt aber noch nicht nutzbar. Bisher kann niemand eine Frage stellen.

Ausblick

Der nächste Teil macht die Datenbank abfragbar und stellt sie dem Redakteur als Werkzeug zur Verfügung, samt einer Überraschung bei der Software-Version. Zwei Fragen bleiben bewusst offen: Jede Notiz hat bisher genau eine Zahlenreihe, ob das auch bei sehr langen Texten reicht, zeigt ein späterer Teil. Und wie viel echter Inhalt tatsächlich hinter den Notizen steckt, ist eine eigene Geschichte.

Porträt Moritz Conjé

Geschrieben von

Moritz Conjé

Senior Projektmanager & Konzepter für Verwaltungsdigitalisierung

Projektmanager bei Dataport AöR, zertifiziert nach PRINCE2 Agile und IPMA Level D. Ich führe Teams zwischen Fachbereich, Management und IT und ordne Technik für Entscheidungen ein.

Meine Rolle in dieser Serie: Konzeption, Planung, Steuerung und Abnahme – die technische Umsetzung erfolgt KI-gestützt.

Beitrag teilen
LinkedIn Xing

Weiterlesen

Mehr aus der Serie KI-Diskurs

Alle 21 Teile

Remote Claude nutzt LiteLLM

Remote Claude nutzt LiteLLM

Im Beitrag über das Gateway habe ich einen zentralen Zugang gebaut, über den KI-Werkzeuge die Suche und das Regelwerk meines Second Brains erreichen. Zwei Wochen später fiel mir auf, dass ihn noch niemand benutzte. Den Anstoß gab etwas ganz anderes: ...
Eine eigene Statuszeile fürs Terminal: mehr Überblick bei der Arbeit mit Claude Code

Eine eigene Statuszeile fürs Terminal: mehr Überblick bei der Arbeit mit Claude Code

Wer täglich mit einer KI im Terminal arbeitet, kennt das Problem: Wie ausgelastet die laufende Sitzung gerade ist, wie nah man an ein Nutzungslimit kommt oder was sie bereits gekostet hat, bleibt normalerweise unsichtbar. Man merkt es meist erst, wen ...
Fähigkeiten ergänzen: passende Skills für die Rollen und Aufgaben finden

Fähigkeiten ergänzen: passende Skills für die Rollen und Aufgaben finden

Ein KI-Assistent kann schon ohne Erweiterungen erstaunlich viel. Für ein konkretes Projekt reicht „erstaunlich viel" aber selten als Arbeitsweise. Beim Aufbau des Second Brain kamen zuletzt drei sehr unterschiedliche, eigenständige Projekte zusammen: ...