Vorschau-Umgebung - hier siehst du auch noch nicht freigegebenen Content.
8 min

Vektor-Datenbank

Wir haben Chunks und Embeddings - aber wo speichern wir Millionen von Vektoren so, dass sich Top-K-Suche in Millisekunden ausgeht? Vektor-Datenbanken kümmern sich darum.

Ein Embedding ist nur ein Array Fließkommazahlen. Tausend Embeddings sind eine kleine JSON-Datei. Eine Million Embeddings sind etwa 4 GB, und du willst trotzdem in Millisekunden den nächsten Nachbarn finden. Das ist die Domäne von Vektor-Datenbanken.

Was eine Vektor-DB können muss

  • Speichern von hochdimensionalen Vektoren in großer Stückzahl
  • Top-K-Nearest-Neighbor-Suche - gegeben ein Query-Vektor, finde die K ähnlichsten gespeicherten Vektoren, gemessen z. B. an Cosinus-Distanz
  • Filtern auf Metadaten - „nur Chunks mit locale='de'", „nur Chunks aus Dokumenten von 2025"
  • Indexierung, die das Ganze schnell macht - bei großem Korpus zwingend, sonst skaliert nichts

Die Optionen

Es gibt eigene Vektor-DBs (Qdrant, Weaviate, Pinecone, Milvus, Chroma) und Erweiterungen für vorhandene Datenbanken (pgvector für Postgres, Lucene-Plugins für Elasticsearch, Redis Vector). Beide Wege funktionieren.

Für dieses Projekt - und für viele kleinere Setups - ist pgvector die ehrlichste Wahl: Postgres steht ohnehin schon, das Schema-Management ist vertraut, und du kannst Embeddings in derselben Transaktion mit deinen Domain-Daten konsistent halten.

Bei zehntausend Chunks ist pgvector mit HNSW-Index spürbar schnell. Erst irgendwo bei vielen Millionen Vektoren oder bei sehr hoher Schreib-Last lohnt sich der Umstieg.

Was wir neben dem Vektor brauchen

Ein Chunk-Vektor allein ist nutzlos - nach der Suche willst du wissen:

  • Aus welchem Dokument kam der Chunk? (document_id, slug, title)
  • Aus welchem Abschnitt? Heading-Pfad, Seitenzahl, Position
  • Welche Locale? Zur Filterung deutscher vs. englischer Antworten
  • Welche Strategie? Damit man später Chunking-Strategien gegeneinander evaluieren kann

In unserem Schema sieht das so aus (vereinfacht):

rag_chunks       (id, document_id, chunk_index, strategy, content, metadata, content_tsv)
rag_embeddings   (id, chunk_id, model, vector_768, vector_1024, vector_384)
rag_documents    (id, slug, locale, title, doc_kind, source_path)

Drei Vektor-Spalten parallel - eine pro getestetem Modell, jeweils mit eigener Dimensionalität und eigenem HNSW-Index.

Frische und Updates

Wenn ein Dokument sich ändert, müssen seine Chunks und Embeddings ungültig werden. Praktisch heißt das: re-chunken, neu embedden, alte Zeilen löschen. Idempotente Seeder helfen - sie erkennen, was schon da ist, und ersetzen nur, was sich geändert hat. Genau das macht der rag-seeder Container in diesem Projekt.

Eine vollständige Update-Pipeline (Document-Hashing, Diffs, hot-reload) bleibt in v1 außen vor. Hier reicht: „Korpus committed → Seeder neu durchlaufen lassen".

Diskussion· noch keine Beiträge

Unser Kommentar-Agent liest jeden neuen Beitrag, bedankt sich oder empfiehlt passende Inhalte.

Sei die erste Stimme - was denkst du dazu?

Melde dich an, um mitzudiskutieren.

Anmelden