Semantische Suche unvollständig: Vektorindex (ChromaDB) nur zu ~14 % / ~58 % gefüllt — mtime-Skip verhindert Nachholung #119

Closed
opened 2026-10-27 11:48:20 +00:00 by alf · 1 comment
Owner

Problem

Die semantische Suche (RAG) im Vault und in der Chat-Historie liefert nur einen Bruchteil der möglichen Treffer, weil der Vektorindex (ChromaDB) deutlich kleiner ist als der Volltextindex (SQLite/FTS5). Gemessen am 2026-10-27 auf dem Produktivsystem:

Index SQLite (Volltext) ChromaDB (Vektoren) Abdeckung
Vault (RAG) 7.022 Notizen 1.001 Notizen / 3.136 Chunks ~14 %
Chats + Workspaces (Memory) 31.493 Einträge 18.192 Chunks ~58 %

Auswirkungen im Live-Test

  • Vault: semantische Suche nach «flash-attn CUDA-Mismatch Dockerfile Build Abbruch» liefert thematisch falsche Treffer (Wing-Commander-III-Anleitungen, Patreon-Mails) mit für semantische Treffer untypisch hohen Abständen (0.14–0.17) — die tatsächlich passende Notiz (CLAUDE.md im Vault-Root) ist in SQLite indiziert, aber nicht im Vektorindex.
  • Chat: funktioniert subjektiv, aber ~42 % der Einträge sind für die semantische Suche unsichtbar.
  • Embedding-Modell ist korrekt konfiguriert und aktiv (mlx-community/multilingual-e5-large, lokal, MLX).

Wahrscheinliche Ursache

Der inkrementelle Index-Lauf ueberschreibt die SQLite-Zeile neu, ueberspringt das Embedding aber, wenn sich die Datei seit dem letzten Lauf nicht geaendert hat (mtime-Vergleich). Damit war der Vektorindex einmal weg (geloescht bzw. ein --full-Lauf abgebrochen), bauen sich die Vektoren fuer alle unveraenderten Notizen nie wieder auf.

Bestaetigt im Test: index --area "00 Kontext" meldet indexed: 1, unchanged: 9 — die Vektorabdeckung in dem Ordner bleibt danach bei 2 von 12 Notizen.

Der GUI-Button «Neu aufbauen» (Einstellungen -> Vault Wartung -> RAG-Index / Memory-Index) ruft korrekt index --full auf — er ist als Workaround geeignet, aber nicht die Wurzelbehebung.

Erwartetes Verhalten

Ein inkrementeller Index-Lauf erkennt, wenn zu einer als indiziert gefuehrten Datei kein Vektor im ChromaDB-Store existiert, und holt das Embedding nach — unabhaengig vom mtime-Status. Der Index heilt sich also selbst, statt dauerhaft unvollstaendig zu bleiben.

Reproduction

  1. ChromaDB-Store loeschen (oder die Situation eines abgebrochenen --full-Laufs nachstellen).
  2. Inkrementellen Index-Lauf ausloesen (Vault-Wartung oder index ohne --full).
  3. Chunk-Zahl im Vektorstore mit der Notiz-/Eintragszahl in SQLite vergleichen — sie bleibt weit darunter.

Vorschlag

  • Beim inkrementellen Laufen die vorhandenen Vektor-IDs gegen die SQLite-Eintraege pruefen und fehlende Embeddings nachziehen (Selbstheilung).
  • Optional: In den Stats (Einstellungen -> Vault Wartung) Abdeckung als Verhaeltnis anzeigen (Vektor-Chunks vs. erwartete Chunks), damit eine solche Drift sofort sichtbar ist — eine Notiz erzeugt mehrere Chunks, die Chunk-Zahl muss also ueber der Notiz-Zahl liegen.
## Problem Die semantische Suche (RAG) im Vault und in der Chat-Historie liefert nur einen Bruchteil der möglichen Treffer, weil der Vektorindex (ChromaDB) deutlich kleiner ist als der Volltextindex (SQLite/FTS5). Gemessen am 2026-10-27 auf dem Produktivsystem: | Index | SQLite (Volltext) | ChromaDB (Vektoren) | Abdeckung | |---|---|---|---| | Vault (RAG) | 7.022 Notizen | 1.001 Notizen / 3.136 Chunks | ~14 % | | Chats + Workspaces (Memory) | 31.493 Einträge | 18.192 Chunks | ~58 % | ## Auswirkungen im Live-Test - Vault: semantische Suche nach «flash-attn CUDA-Mismatch Dockerfile Build Abbruch» liefert thematisch falsche Treffer (Wing-Commander-III-Anleitungen, Patreon-Mails) mit für semantische Treffer untypisch hohen Abständen (0.14–0.17) — die tatsächlich passende Notiz (CLAUDE.md im Vault-Root) ist in SQLite indiziert, aber nicht im Vektorindex. - Chat: funktioniert subjektiv, aber ~42 % der Einträge sind für die semantische Suche unsichtbar. - Embedding-Modell ist korrekt konfiguriert und aktiv (mlx-community/multilingual-e5-large, lokal, MLX). ## Wahrscheinliche Ursache Der inkrementelle Index-Lauf ueberschreibt die SQLite-Zeile neu, ueberspringt das Embedding aber, wenn sich die Datei seit dem letzten Lauf nicht geaendert hat (mtime-Vergleich). Damit war der Vektorindex einmal weg (geloescht bzw. ein --full-Lauf abgebrochen), bauen sich die Vektoren fuer alle unveraenderten Notizen nie wieder auf. Bestaetigt im Test: index --area "00 Kontext" meldet indexed: 1, unchanged: 9 — die Vektorabdeckung in dem Ordner bleibt danach bei 2 von 12 Notizen. Der GUI-Button «Neu aufbauen» (Einstellungen -> Vault Wartung -> RAG-Index / Memory-Index) ruft korrekt index --full auf — er ist als Workaround geeignet, aber nicht die Wurzelbehebung. ## Erwartetes Verhalten Ein inkrementeller Index-Lauf erkennt, wenn zu einer als indiziert gefuehrten Datei kein Vektor im ChromaDB-Store existiert, und holt das Embedding nach — unabhaengig vom mtime-Status. Der Index heilt sich also selbst, statt dauerhaft unvollstaendig zu bleiben. ## Reproduction 1. ChromaDB-Store loeschen (oder die Situation eines abgebrochenen --full-Laufs nachstellen). 2. Inkrementellen Index-Lauf ausloesen (Vault-Wartung oder index ohne --full). 3. Chunk-Zahl im Vektorstore mit der Notiz-/Eintragszahl in SQLite vergleichen — sie bleibt weit darunter. ## Vorschlag - Beim inkrementellen Laufen die vorhandenen Vektor-IDs gegen die SQLite-Eintraege pruefen und fehlende Embeddings nachziehen (Selbstheilung). - Optional: In den Stats (Einstellungen -> Vault Wartung) Abdeckung als Verhaeltnis anzeigen (Vektor-Chunks vs. erwartete Chunks), damit eine solche Drift sofort sichtbar ist — eine Notiz erzeugt mehrere Chunks, die Chunk-Zahl muss also ueber der Notiz-Zahl liegen.
alf closed this issue 2026-10-27 12:35:22 +00:00
Author
Owner

Falsches Repo — wurde nach iris/Iris verschoben: iris/Iris#196 (Label bug übernommen). Hier geschlossen.

Falsches Repo — wurde nach iris/Iris verschoben: https://forgejo.lewerken.duckdns.org/iris/Iris/issues/196 (Label bug übernommen). Hier geschlossen.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
alf/2ndbrain#119
No description provided.