All checks were successful
release-tag / release-image (push) Successful in 2m30s
43 lines
2.2 KiB
Markdown
43 lines
2.2 KiB
Markdown
# Graph Store: modernc.org/sqlite
|
|
|
|
## Ziel
|
|
|
|
`graph-state.json` wurde vollständig durch SQLite ersetzt. Die Umstellung optimiert drei Engpässe großer Knowledge-Graphs:
|
|
|
|
1. Embeddings werden nicht mehr als lange JSON-Dezimalzahlen gespeichert.
|
|
2. Ein Flush serialisiert nicht mehr den vollständigen Graphen.
|
|
3. Eine unveränderte KB-Synchronisation erzeugt keine erneuten Graphwrites.
|
|
|
|
## Implementierung
|
|
|
|
- Treiber: `modernc.org/sqlite v1.37.1`
|
|
- API: Go `database/sql`
|
|
- CGO: nicht erforderlich
|
|
- Datenbank: `BRAIN_DATA_DIR/graph.db`
|
|
- Vektoren: binäre `float32`-BLOBs
|
|
- Modellschutz: gespeicherter Name und Ollama-Digest; bei Änderung automatische Vector-Invalidierung
|
|
- Journal: WAL
|
|
- Flush: inkrementelle Upserts/Deletes innerhalb einer Transaktion
|
|
- Export: `VACUUM INTO` über `GET /api/state/export`
|
|
|
|
`modernc.org/libc` ist passend zur verwendeten SQLite-Version auf `v1.65.7` festgesetzt.
|
|
|
|
## Verhalten bei identischer KB-Basis
|
|
|
|
Ein leistungsfähiges System kann den Graphen inklusive Embeddings und Beziehungen aufbauen. Der exportierte `graph.db` lässt sich anschließend auf ein schwächeres System kopieren. Wichtig sind stabile Dokument-IDs und dasselbe Embedding-Modell.
|
|
|
|
Nach dem Import führt das Zielsystem weiterhin einen Quellenabgleich durch:
|
|
|
|
- unverändert: Node, Edge und Vector bleiben bestehen;
|
|
- Metadatenänderung ohne Textänderung: nur die Node-Zeile wird aktualisiert;
|
|
- Titel, Summary, Kategorien oder Keywords geändert: der alte Vector wird gelöscht und selektiv neu erzeugt;
|
|
- Quelle entfernt: zugehörige Nodes, Vektoren und verwaiste Edges werden gelöscht.
|
|
|
|
## Keine Legacy-Migration
|
|
|
|
Die aktuelle Umgebung ist Staging. Deshalb gibt es absichtlich keinen Importpfad aus `graph-state.json`. Eine alte JSON-Datei wird im Status nur als `legacy_json_present` gemeldet und ansonsten ignoriert.
|
|
|
|
## Speicherarme Startkonfiguration
|
|
|
|
SQLite wird mit einem kleinen Page-Cache von ungefähr 8 MiB, deaktiviertem mmap und dateibasiertem temporärem Speicher geöffnet. Der vollständige Graph und die Embeddings liegen bereits im Go-Arbeitsspeicher; ein zusätzlicher großer SQLite-Cache würde den Speicherbedarf nur verdoppeln. Vor dem Öffnen prüft der Dienst außerdem, ob `BRAIN_DATA_DIR` tatsächlich beschreibbar ist.
|