Seit dem Ingestion-Service bekommt jede Notiz genau eine Zahlenreihe, egal wie lang sie ist. Bei kurzen Notizen ist das unproblematisch. Bei einem ganzen Buch nicht. Beim Blick auf eine Grafik mit gängigen Verfahren zum Aufteilen langer Texte fiel auf, dass das System bisher ohne solches Chunking auskommt. Dieser Teil misst, wie groß der Verlust tatsächlich war, beschreibt die Lösung und einen Ortswechsel, den man aus früheren Teilen kennt.
Was Chunking ist und warum es nötig wird
Ein Embedding-Modell hat ein begrenztes Aufnahmefenster: Es kann nur eine bestimmte Textmenge auf einmal verarbeiten. Was darüber hinausgeht, wird abgeschnitten oder gar nicht erst gelesen. Und selbst bei einem Text, der noch passt, gilt: Eine einzige Zahlenreihe für ein ganzes Buch beschreibt bestenfalls das Gesamtthema, nicht die einzelne Stelle, nach der jemand später sucht. Chunking bedeutet deshalb, einen langen Text in überschaubare Abschnitte, die Chunks, zu zerlegen und jeden für sich in eine Zahlenreihe zu übersetzen. Man kann es mit einem Buch vergleichen, das nicht als ein einziger Zettel im Karteikasten steckt, sondern mit einer Karte pro Kapitel.
Der Verlust in Zahlen
Für Notizen zu Büchern gab es schon bei der Integration eine harte Grenze: Nach 4.000 Zeichen war Schluss, der Rest floss nicht ein. Wie viel damit verloren geht, hatte damals niemand geprüft. Die Nachmessung ergab: 37 von 80 Buchnotizen, also 46 Prozent, überschritten die Grenze, teils massiv. Am Extremfall, einer Notiz mit fast 1,9 Millionen Zeichen, zeigte sich das Problem am deutlichsten. Der Schnitt bei Zeichen 4.000 lag noch im Vorwort. Das erste Kapitel beginnt erst bei Zeichen 544.476, die markierten Kindle-Highlights sogar erst bei Zeichen 1.644.904. Praktisch nichts von dem, was in diesem Buch wichtig war, steckte im Embedding.
Die Lösung: an der Struktur trennen
Die Notizen haben bereits eine Struktur, nämlich Überschriften. Das Chunking nutzt sie: Zuerst wird an vorhandenen Überschriften getrennt. Ist ein Abschnitt danach immer noch zu lang, greift ein zweites Verfahren, das den Text in Stücke von höchstens 4.000 Zeichen zerlegt, mit einer kleinen Überlappung, damit an den Schnittstellen nichts verloren geht. Jeder Chunk trägt außerdem den Titel der Notiz als Kontext, damit er auch für sich allein verständlich bleibt. Bewusst verzichtet habe ich auf Verfahren, die die Trennstellen erst per Modell suchen lassen. Sie würden pro Abschnitt zusätzliche Berechnungen kosten, obwohl die Struktur schon vorhanden ist.
Das hat zwei Folgen. Die Datenbank speichert nun eine Zeile pro Chunk statt pro Notiz. Und die Suche holt zuerst mehr Kandidaten und fasst sie danach pro Notiz auf den besten Treffer zusammen. So sieht der Redakteur weiterhin eine Zeile pro Notiz und nicht zehn Abschnitte desselben Buchs.
Die zweite Überraschung: der Ortswechsel
Der erste Testlauf auf der produktiven Maschine zeigte rund vier Sekunden pro Chunk, deutlich mehr als erwartet. Bei rund 15.800 erwarteten Chunks wären das zweistellige Stunden gewesen. Ich habe den Re-Ingest deshalb wieder auf dem Gaming-PC gefahren, ganz ohne Grafikkarte. Schon im Modellvergleich hatte sich diese Variante für das gewählte Modell als die schnellere erwiesen. Auf dem Gaming-PC dauerte ein Chunk nur rund 0,41 Sekunden, etwa zehnmal weniger. Der volle Lauf war in 1 Stunde und 40 Minuten fertig, das Ergebnis kam als Datenbank-Dump zurück auf die produktive Maschine. Der portable Stack macht auch hier den Unterschied: Der Gaming-PC bleibt kein Teil des Systems, springt aber bei großen Nachläufen ein.
Das Ergebnis
Aus 1.854 Notizen wurden 15.812 Chunks, davon allein 6.330 aus den 80 Buchnotizen. Die Suchqualität blieb stabil: Die bekannte Kontrollanfrage lieferte weiter denselben Spitzenreiter, mit 0,848 statt zuvor 0,849. Es ging also nicht um bessere Treffer, sondern um Vollständigkeit. Der Auslöser-Fall ist behoben: Die Notiz mit fast 1,9 Millionen Zeichen liegt jetzt als 694 Chunks vor. Eine gezielte Frage zu einem Konzept aus Kapitel 11 findet den passenden Abschnitt, während dieser Inhalt vorher hinter der Grenze komplett unsichtbar war.
Fazit
Ein Embedding pro Notiz funktioniert, solange Notizen kurz sind. Bei langen Texten wird aus einer Vereinfachung ein stiller Datenverlust, den erst die Nachmessung sichtbar machte. Genau das war die offene Frage aus dem Konzept: ob jede Notiz als Ganzes oder in Abschnitten gespeichert wird. Die Antwort lautet: in Abschnitten.
Ausblick
Der Stack zieht im nächsten Teil ein zweites Mal um, diesmal auf eigene, dafür angeschaffte Hardware. Danach geht es darum, den Zugang zum Werkzeug abzusichern, damit nicht jeder Schlüssel alles darf.