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.