Zum Inhalt springen
Kurzer Hinweis: flozi00 TechHub ist ein Solo-Nebenprojekt neben einem Vollzeitjob — persönliche Lernnotizen, keine offiziellen Aussagen. Kritische Schritte selbst prüfen.

RAG-Retrieval-Mathematik: Embedding-Speicher, Vektorindex-Größe und das Latenzbudget, das niemand rechnet

Die Arithmetik selbst gehosteten RAG: Embedding-Gewichte, Vektorspeicher, Flat- und HNSW-Suche, Reranker-Rechenaufwand und ein bedingtes Kostenbeispiel für API gegen GPU.

10 Min. Lesezeitflozi00
aimachine-learninggpuragretrievalvector-searchgpu-memory
Direkt zum Fachartikel
Sehen · ausprobieren · verstehen

Jede Stufe zwischen Dokument und Antwort budgetieren

Embedding-Gewichte, Vektornutzdaten, Indexverknüpfungen und Reranking-Berechnung sind getrennte Kosten einer Suchpipeline.

KI-gestützte Lernvisualisierung · schematische Erklärung zum Artikel

Schritt 1 / 4Modellspeicher von Vektorspeicher trennen

Die Embedder-Gewichte werden einmal gespeichert; jeder Textabschnitt ergänzt einen Vektor. Breitere Vektoren vervielfachen Korpusnutzdaten; HNSW-Verknüpfungen, Metadaten und Originalvektoren für erneute Bewertung ergänzen eigene Bytes.

AblaufAktueller SchrittBaustein anklicken, um ihn zu erklären
Quelldokumente und Textabschnitte
Die Aufteilung bestimmt die Zahl gespeicherter und gesuchter Einträge.
Jeden Textabschnitt einbetten
Ein Vorwärtsdurchlauf erzeugt einen Vektor fester Breite für den Index.
Vektoren + Suchindex-Aufwand
Nutzdaten sind Eintragszahl × Dimensionen × Bytes je Komponente.
  1. Quelldokumente und Textabschnitte Jeden Textabschnitt einbetten
    Indexaufbau
  2. Jeden Textabschnitt einbetten Vektoren + Suchindex-Aufwand
    Vektoren speichern
Das solltest du mitnehmen

Das kleinste Embedding-Modell ist nicht automatisch die günstigste Gesamtpipeline; Vektorbreite und Kandidatenzahl kosten nachgelagert weiter.

Nutzdatengleichungen und Rechenuntergrenzen schließen Index- und reale Scheduling-Kosten aus. Näherung, Quantisierung und Korpusänderungen brauchen gemessenen Recall und Latenz.

Begriffe und vollständiger Ablauf
Embedding
Ein Zahlenvektor zum Vergleich einer Anfrage oder eines Dokuments mit anderen.
HNSW
Ein graphbasierter Index zur näherungsweisen Nachbarsuche mit zusätzlichen Verknüpfungen und Suchparametern.
Cross-Encoder
Ein Modell, das Anfrage und Kandidatentext gemeinsam bewertet statt zwei gespeicherte Vektoren zu vergleichen.
  1. Modellspeicher von Vektorspeicher trennen

    Die Embedder-Gewichte werden einmal gespeichert; jeder Textabschnitt ergänzt einen Vektor. Breitere Vektoren vervielfachen Korpusnutzdaten; HNSW-Verknüpfungen, Metadaten und Originalvektoren für erneute Bewertung ergänzen eigene Bytes.

  2. Suche zusammen mit Recall messen

    Ein exakter Scan vergleicht die Anfrage mit jedem Vektor und muss diese Daten lesen. Näherungsweise Graphsuche kann weniger Kandidaten prüfen; ihre Arbeit hängt aber von Korpus, Filtern und Sucheinstellungen ab. Eine feste logarithmische Latenzformel ersetzt keine Messung.

  3. Einen Reranker-Durchlauf je Paar zählen

    Ein Cross-Encoder verarbeitet die Anfrage zusammen mit jedem Kandidatentext. Mehr Kandidaten vergrößern diese Arbeit; Reranking kann daher das Suchbudget dominieren, auch wenn die erste Vektorsuche schnell ist.

  4. Generierung ergänzen und die gesamte Kette prüfen

    Gewählte Abschnitte werden Kontext für den Generator mit eigenen Prefill- und Decode-Kosten. Prüfe Aufteilung, Such-Recall, Reranking und belegte Antworten gemeinsam; geringe Vektorsuchlatenz repariert keine fehlenden Belege.

Alle Verbindungen

  • Quelldokumente und Textabschnitte → Jeden Textabschnitt einbetten: Indexaufbau
  • Jeden Textabschnitt einbetten → Vektoren + Suchindex-Aufwand: Vektoren speichern
  • Vektoren + Suchindex-Aufwand → Kandidatendokumente suchen: Korpus durchsuchen
  • Anfragetext und kompatibler Vektor → Kandidatendokumente suchen: Anfragevektor
  • Kandidatendokumente suchen → Anfrage-Dokument-Paare neu ordnen: Kandidatenmenge
  • Quelldokumente und Textabschnitte → Anfrage-Dokument-Paare neu ordnen: Kandidatentext laden
  • Anfragetext und kompatibler Vektor → Anfrage-Dokument-Paare neu ordnen: Anfragetext
  • Anfrage-Dokument-Paare neu ordnen → Aus gewählten Belegen generieren: gewählte Abschnitte
Du bestimmst das Tempo. Pausiere jederzeit oder wähle einen Schritt aus.

Jede Entscheidung „wir bauen einfach RAG dazu" ist eine Reihe von Rechenaufgaben im Trenchcoat: wie viel VRAM das Embedding-Modell braucht, wie viele Bytes der Vektorindex frisst, wie viele Distanzberechnungen eine Query kostet und ob die ganze Pipeline in Ihr Latenzbudget passt. Dieser Guide rechnet das mit Zahlen aus Primärquellen durch — Hugging-Face-Model-Karten, NVIDIA-Datenblätter, Qdrants offizielle Dokumentation und aktuelle API-Preise — damit Sie die Infrastruktur dimensionieren, bevor Sie der Demo glauben.

Das Embedding-Modell ist der günstige Teil — bis es das nicht ist

Drei offene Embedding-Modelle über klein, mittel und groß verteilt; die Parameterzahlen direkt aus den Hugging-Face-Repositories gelesen (fp16 = 2 Bytes pro Parameter, dieselbe Konvention wie in unserem Quantisierungs-Guide):

ModellParameter (HF)fp16-GewichteEmbedding-DimOutput-Tokens?
BAAI/bge-base-en-v1.5109.482.75210,22 GB768—
BAAI/bge-m3567.755.77721,14 GB1024 (+ sparse)—
intfloat/e5-mistral-7b-instruct7.110.660.096314,22 GB4096—

Die Modelldatei von bge-m3 ist 2.271.145.830 Bytes groß4. Durch vier geteilt ergibt das ungefähr 567,8 Mio. fp32-Werte; die serialisierte Dateigröße enthält aber Metadaten und ist keine exakte Parameterzahl. Das e5-mistral-Checkpoint liefert fp16-Safetensors mit insgesamt etwa 14,2 GB3.

Die GPU-Klassen-Folgen bei fp16:

  • bge-base (0,22 GB) läuft überall — Laptop-GPU, CPU, Jetson. Speicher ist nicht die Grenze; Durchsatz ist es.
  • bge-m3 (1,14 GB) passt auf jede Datacenter-GPU mit reichlich Reserve; selbst 8-GB-Karten tragen das Modell plus große Batches.
  • e5-mistral-7b (14,22 GB) benötigt zusätzlich zu Gewichten Speicher für Aktivierungen und Batches. Eine RTX 4090 oder A30 mit 24 GB, eine L40S mit 48 GB oder eine A100 mit 40/80 GB bietet mehr Spielraum als eine 16-GB-Karte; prüfen Sie Sequenzlänge und Batch.

Die teure Klasse entscheidet nicht über Qualität pro Euro im Betrieb — sondern über die Vektorbreite, die sie erzeugt. Ein 4096-Dim-Modell vervierfacht jede nachgelagerte Speicherrechnung gegenüber 1024-Dim-bge-m3, bei Benchmark-Scores, die sich um einstellige Punkte verbessern5.

Bytes pro Vektor: wo die echte Speicherrechnung lebt

Modellspezifischen Kontext zu Pooling und Vektordimensionen bietet der Architekturleitfaden zu EmbeddingGemma 2. Nemotron 3.5 Embed zeigt, wie ein eingefrorener Text-Tower einen bestehenden Textindex bewahren kann, während ein trainierter visueller Pfad in denselben Raum gelangt; beide Single-Vector-Designs lassen sich mit dem pplx-embed-v2-Leitfaden zu asymmetrischem Retrieval und MaxSim vergleichen. Der OlmoEarth-v1.3-Guide zeigt einen anderen Produktionsfall: ein trainiertes 128-/64-dimensionales Präfix, dessen Zarr-Chunk-Geometrie entscheidet, ob Kürzung auch Netzwerk-I/O spart.

Rohe Embedding-Speicherung ist peinlich simple Arithmetik: Bytes pro Vektor = Dimensionalität × Bytes pro Komponente. Stand 2026 speichert Qdrant Vektoren intern standardmäßig als 32-Bit-Floats6.

Dim (Modellklasse)fp32 (4 B)fp16 (2 B)int8 (1 B)
768 (bge-base, MiniLM-Klasse)3,0 KiB1,5 KiB0,75 KiB
1024 (bge-m3, e5-large-Klasse)4,0 KiB2,0 KiB1,0 KiB
1536 (OpenAI text-embedding-3-small)6,0 KiB3,0 KiB1,5 KiB
3072 (text-embedding-3-large)12,0 KiB6,0 KiB3,0 KiB
3584 (gte-Qwen2-7B)14,0 KiB7,0 KiB3,5 KiB
4096 (e5-mistral-7b)16,0 KiB8,0 KiB4,0 KiB

Korpus-Dimensionierung — angenommen 512-Token-Chunks, also entsprechen 500 Mio. Tokens Quelltext ≈ 1 Mio. Chunks, 50 Mrd. Tokens ≈ 98 Mio. Chunks. Die Indexspeicher-Tabelle für bge-Klasse, 1024-Dim:

Chunksfp32 rohint8 (4×)PQ, 0,5 B/Komp. (8×)
1 Mio.4,10 GB1,02 GB0,51 GB
10 Mio.40,96 GB10,24 GB5,12 GB
100 Mio.409,60 GB102,40 GB51,20 GB

Bei 4096 Dimensionen erreicht dieselbe Tabelle 1,64 TB rohe Vektordaten für 100 Mio. Chunks, also das Vierfache. Dazu kommt der HNSW-Graph: Bei 4-Byte-Nachbar-IDs und bis zu 2 × m Links auf Ebene 0 ergeben sich für M=16 grob 128 B pro Vektor allein für diese Links, also 12,8 GB bei 100 Mio. Vektoren. Weitere Ebenen, Allocator-Overhead und Payload benötigen zusätzlichen Speicher; das ist ein Größenbeispiel, kein exakter Qdrant-Footprint7.

Für reine Vektordaten komprimiert Skalarquantisierung von float32 auf uint8 um 4×. Binärkodierung kann 32× erreichen; Produktquantisierung hängt von ihrer Konfiguration ab6. Die Faktoren enthalten weder Index-Overhead noch originale Vektoren, die für Rescoring behalten werden. Weaviate dokumentiert PQ zur Speicherreduktion8, und Milvus bietet mehrere quantisierte Indextypen9. Effekte auf Recall und Latenz hängen von Datensatz, Queries, Sucheinstellungen und Rescoring ab; messen Sie mit Ihrem Korpus.

Latenz-Zerlegung: Flat Brute Force vs. HNSW

Bei einer Flat-Suche wird der Query-Vektor mit jedem Vektor verglichen: Die Zahl der Vergleiche ist N. HNSW durchsucht approximativ nur einen Teil des Graphen. ef × log₂(N) ist aber keine belastbare Formel für Distanzberechnungen oder Latenz. Aufwand und Recall hängen von Graph, Dimensionen, Suchparametern und Daten ab; konstruierte Fälle benötigen sogar linearen Aufwand10.

Bei 1 Mio. Vektoren mit 1024 float32-Dimensionen braucht eine exakte Suche grob 1 Mio. × 2 × 1024 ≈ 2 GFLOP und liest etwa 4,1 GB Vektordaten. Selbst bei angenommenen 100 GB/s dauerhaft erreichter Speicherbandbreite dauert allein das Lesen mindestens ~41 ms; CPU-SIMD beseitigt den Speichertransport nicht. Qdrants full_scan_threshold_kb wählt Brute Force für kleine Kandidatenmengen7. Ob exakte Suche bei 1 oder 10 Mio. Vektoren sinnvoll ist, hängt von Hardware, Filtern, Parallelisierung, QPS und Latenzzielen ab.

Absolute QPS-Zahlen zitieren wir nur herstellerseitig und als solche gekennzeichnet: Qdrant veröffentlicht ein eigenes HNSW-Benchmark-Repository genau für diesen Zweck11, und ihr Large-Scale-Tutorial — 400 Mio. CLIP-Vektoren, Binärquantisierung, M=6 — liefert eine konkrete, reproduzierbare Ressourcenaufstellung (23,8 GB quantisierte Vektoren + 17,9 GB HNSW-Graph im RAM für alle 400 Mio.)12. Jede „einstellige Millisekunden pro Query"-Zahl aus einem ungebremsten Benchmark verdient Skepsis, solange Hardware, ef und Recall nicht mit angegeben sind.

Embedding ist Prefill, nicht Decode — und das ändert die Rechnung

Die KV-Cache-Intuition aus unserem KV-Cache-Guide führt hier in die Irre, also präzise formuliert: Ein Embedding-Forward-Pass über einen 512-Token-Chunk ist reiner Prefill. Ein Durchgang, alle Positionen gleichzeitig, keine Decode-Schritte, kein gespeicherter KV-Cache, keine speicherbandbreiten-gebundene Token-für-Token-Schleife. Embedding-Durchsatz ist in einer Weise compute-gebunden, wie es Generierung nie ist.

Die FLOPs pro Chunk folgen der Standard-Forward-Pass-Schätzung 2 × Parameter × Tokens:

  • bge-m3 (568 Mio. Parameter), 512-Token-Chunk: 2 × 567.755.777 × 512 ≈ 581 GFLOP
  • e5-mistral-7b (7,11 Mrd. Parameter), 512-Token-Chunk: 2 × 7.110.660.096 × 512 ≈ 7.281 GFLOP

Obergrenzen bei Spezifikations-TFLOPS aus NVIDIA-Datenblättern — dichtes fp16, mit ehrlich angenommenen 50 % der Spitzenleistung (Model-Kernel-MFU auf gut gebatchten Encoder-Inputs):

GPUfp16 dense (Datenblatt)bge-m3 Tok/se5-mistral-7b Tok/s
L40S362 TFLOPS13~159.400~12.700
A100 80 GB312 TFLOPS14~137.400~11.000

Die L40S-Zahl verdient Skepsis: 362 TFLOPS ist der dense-fp16-Wert; 1.466 TFLOPS bezieht sich auf Sparse-FP813. Bei angenommener 50-%-Auslastung und der Näherung für lineare Schichten ergibt sich für einen Korpus mit 1 Mio. Chunks (500 Mio. Tokens) eine Rechenuntergrenze von ~52 Minuten (500 × 10⁶ / 159.400 ≈ 52 Minuten). Attention, Tokenisierung, I/O und ineffizientes Batching verlängern die reale Laufzeit.

Reranker: die zweite Stufe, die still Ihr Budget besitzt

Hybrides Sparse-plus-Dense-Retrieval ist 2026 der Standard, weil es funktioniert — dense Vektoren verpassen exakte Keywords, BM25-artiges Sparse verpassen Paraphrasen, bge-m3 liefert beides aus einem Forward-Pass2. Aber der Qualitätshebel, den Leute tatsächlich spüren, ist der Cross-Encoder-Reranker — und er ist die am schlechtesten budgetierte Komponente in RAG.

Ein Cross-Encoder bewertet jedes Paar einzeln: voller Forward-Pass über konkatenierte Query plus Kandidat. Pro Kandidatenpaar mit einem Reranker der 280-Mio.-Klasse (bge-reranker-base, 278.044.931 Parameter15) über 32 Query-Tokens + 512 Dokument-Tokens:

2 × 278 Mio. × 544 ≈ 302 GFLOP pro Paar

Die Top-100-Kandidaten zu bewerten kostet unter dieser Näherung für lineare Schichten 100 × 302 GFLOP ≈ 30,3 TFLOP. Auf einer L40S bei angenommenen 50 % von 362 TFLOPS ist das eine untere Rechengrenze von ~167 ms, vor Overhead und Attention. Tatsächliche GPU- und CPU-Zeiten müssen gemessen werden; wählen Sie die Kandidatenzahl nach den gemessenen Latenz- und Qualitätszielen.

Das zweistufige Latenzbudget pro Query bei realistischer Skalierung:

  • Query-Embedding: Batching, Tokenizer- und Modelllatenz messen
  • Vektorsuche: Index, Filterselektivität, Suchbreite und Recall zusammen messen
  • Reranking von 100 Kandidaten @ 278 Mio. Parameter: ~167 ms Rechenuntergrenze unter der genannten L40S-Auslastungsannahme
  • Generierung: Prefill und Decode bei der geplanten Kontextlänge getrennt messen

In diesem Rechenbeispiel kann Reranking die Retrieval-Latenz dominieren. Ein anderer Index, eine andere Kandidatenzahl oder ein anderes Modell können die Reihenfolge verändern. Messen Sie jede Stufe der realen Pipeline.

API vs. Self-Hosting: Der Break-even liegt nicht, wo Sie denken

Aktuelle Preise pro 1 Mio. Input-Tokens: OpenAI text-embedding-3-small bei 0,02 USD, text-embedding-3-large bei 0,13 USD16. Die Batch API halbiert beide16. Embeddings berechnen nur Input — keine Output-Tokens, weil es keine gibt.

Für eine beispielhaft gemietete L40S zu angenommenen 1,20 USD/Stunde entspricht die zuvor idealisiert berechnete bge-m3-Rate von ~159.400 Tok/s (50 % der genannten Rechenleistung) 574 Mio. Tokens pro Stunde, noch vor Tokenisierung, I/O, Padding und Attention-Overhead. Daraus ergäben sich reine Rechenkosten pro 1 Mio. Tokens von:

1,20 USD / 574 ≈ 0,0021 USD

Dieser hypothetische Rechenpreis liegt unter beiden API-Preisen, ist aber weder ein Angebot noch ein gemessener Preis. Stundentakt, Startzeiten, CPU-/Host-Kosten, Auslastung und Modellqualität können das Ergebnis umkehren.

Die Tabelle verwendet diese Annahmen mit anteiliger Stundenabrechnung. Bei einer Mindeststunde wären die GPU-Kosten für 10 Mio. Tokens dagegen 1,20 USD:

Embedding-VolumenGPU-Stunden/Monat (bge-m3)GPU-Kosten @1,20 USD/hAPI 3-smallAPI 3-large
10 Mio. Tok/Monat0,02 h0,02 USD0,20 USD1,30 USD
1.000 Mio. Tok/Monat1,74 h2,09 USD20,00 USD130,00 USD
10.000 Mio. Tok/Monat17,4 h20,91 USD200,00 USD1.300,00 USD

Die Tabelle ohne Wunschdenken gelesen:

  • Eine gemietete GPU kann günstiger sein, wenn Arbeit auf bezahlte GPU-Zeit gebündelt werden kann, der gemessene Modelldurchsatz die angenommene Rate annähert und zusätzliche Hostingkosten gering sind. Anforderungen an die Datengrenze können die Wahl unabhängig vom Preis bestimmen.
  • Die API kann bei gelegentlicher Arbeit einfacher und günstiger sein. Bei den derzeit gelisteten Preisen kosten 500 Mio. Tokens mit text-embedding-3-small regulär 10 USD oder über Batch 5 USD. Vergleichen Sie das mit einem echten GPU-Angebot und dessen Mindestabrechnung.
  • Bei 10 Mio. Tokens/Monat beträgt die idealisierte Rechenzeit in der Tabelle etwa eine Minute; eine dauerhaft gemietete GPU wird hingegen für den ganzen Monat berechnet. Der Abrechnungstakt ist entscheidend.

Und der Qualitätsvorbehalt: Qualitätsparität ist modellabhängig. Wer bge-base self-hostet, weil es gratis ist, und als Baseline 3-large vergleicht, frisst jeden Infra-Sparkauf durch die Retrieval-Qualitätseinbuße. Erst Modelle angleichen, dann Preise vergleichen.

Fazit, mit ausbuchstabierten Fallstricken

Es gibt keine allgemeingültige Token-Schwelle. Die Tabelle selbst ergibt bei kurzen GPU-Mieten hypothetisch schon bei 10 Mio. Tokens geringere GPU-Kosten als API-Kosten; eine dauerhaft gemietete GPU kann hingegen deutlich teurer sein. Vergleichen Sie tatsächliche Preise, Abrechnungstakt, gemessenen Durchsatz und Retrieval-Qualität für denselben Datensatz. Anforderungen an die Datengrenze können eine API unabhängig vom Preis ausschließen.

Die ehrlichen Fallstricken:

  • „RAG behebt Halluzinationen" ist ein Kategorienfehler. Retrieval erdet die Generierung in dem, was indexiert ist; wird der korrekte Chunk nicht gefunden, halluziniert das Modell trotzdem — nur selbstbewusster. RAG verschiebt das Fehlerbild von „das Modell weiß es nicht" zu „das Retrieval hat es verpasst" — gebunden durch Recall auf Ihrem Korpus, nicht durch MTEB-Benchmark-Scores.
  • Recall-Verlust wird doppelt bezahlt: Approximatives HNSW (ef zu niedrig) senkt Recall, Quantisierung senkt ihn weiter, und jeder Verlust summiert sich lautlos, weil die Fehleroberfläche exakt so aussieht wie „das Modell hat es erfunden".
  • Chunking und Modellwahl wirken zusammen. Testen Sie Chunk-Größe, Überlappung sowie lexikalisches und dichtes Retrieval mit einem beschrifteten Query-Satz.
  • Die 4096-Dim-Vektoren des 7B-Embedders kosten für immer 4× Speicher und 4× Flat-Suchzeit. Qualität wird gemietet; die Vektorbreite wird gekauft.

Die Mathematik hier ist der einfache Teil. Jede Zahl oben ist ein Boden, keine Prognose — echte Pipelines verlieren an Netzwerk-Hops, Serialisierung und Leerlauf. Rechnen Sie die Böden zuerst, und messen Sie dann die Realität gegen sie.

Fußnoten

Footnotes

  1. BAAI/bge-base-en-v1.5 — Hugging-Face-Modellrepository, Safetensors gesamt 109.482.752 Parameter (fp32-Checkpoint, 437.955.512 Bytes): https://huggingface.co/BAAI/bge-base-en-v1.5 ↩

  2. BAAI/bge-m3 — Hugging-Face-Model-Karte: 1024 Dim, 8192-Token-Kontext, Dense- + Sparse- + Multi-Vector-Ausgaben aus einem Forward-Pass: https://huggingface.co/BAAI/bge-m3 ↩ ↩2

  3. intfloat/e5-mistral-7b-instruct — Hugging-Face-Modellrepository, fp16-Safetensors gesamt 7.110.660.096 Parameter auf zwei Shards: https://huggingface.co/intfloat/e5-mistral-7b-instruct ↩ ↩2

  4. bge-m3-Dateiliste; die serialisierte Dateigröße ist nur ein Näherungswert für die Zahl der fp32-Werte: https://huggingface.co/BAAI/bge-m3/tree/main ↩

  5. Alibaba-NLP/gte-Qwen2-7B-instruct — Hugging-Face-Model-Karte: 3584 Dim, 32k Max-Input, fp32-Gewichte 26,45 GB gelistet, MTEB(56) 70,24 vs. bge-base-en-1.5 64,23: https://huggingface.co/Alibaba-NLP/gte-Qwen2-7B-instruct ↩

  6. Qdrant-Dokumentation, „Quantization" — Speicherformate, Rescoring und datensatzabhängige Genauigkeit: https://qdrant.tech/documentation/manage-data/quantization/ ↩ ↩2

  7. Qdrant-Dokumentation, „Indexing" — HNSW-Verbindungsformel (m Kanten auf oberen Ebenen, 2×m auf Ebene 0, 4-Byte-Links), full_scan_threshold_kb sowie Defaults m=16, ef_construct=100: https://qdrant.tech/documentation/concepts/indexing/ ↩ ↩2

  8. Weaviate-Dokumentation, Produktquantisierung zur Reduktion des Speicherbedarfs für Vektoren: https://weaviate.io/developers/weaviate/concepts/vector-quantization ↩

  9. Milvus-Dokumentation, Indextypen inkl. Skalar- (IVF_SQ8), Produkt- (IVF_PQ) und Binär-/RaBitQ-Quantisierung (IVF_RABITQ): https://milvus.io/docs/index.md ↩

  10. Indyk und Xu, „Worst-case Performance of Popular Approximate Nearest Neighbor Search Implementations" (2023), mit HNSW-Gegenbeispielen: https://arxiv.org/abs/2310.19126 ↩

  11. Qdrants offizielles HNSW-Benchmark-Repository (search_benchmark, memory_benchmark, filter_speed_benchmark): https://github.com/qdrant/benchmark ↩

  12. Qdrant-Tutorial, „Large-Scale Search" — 400 Mio. 512-Dim-Vektoren: 23,84 GB quantisierte Vektoren + ~17,9 GB HNSW-Graph (M=6) im RAM, mit vollständiger Speicheraufstellung: https://qdrant.tech/documentation/tutorials-operations/large-scale-search ↩

  13. NVIDIA-L40S-Produktseite und Datenblatt — FP16 Tensor Core 362,05 TFLOPS dense (direkt gelistet), 733 TFLOPS mit 2:4-Sparsity; FP8 733 dense | 1.466 sparse; 91,6 TFLOPS FP32: https://www.nvidia.com/en-us/data-center/l40s/ ↩ ↩2

  14. NVIDIA A100 Datenblatt — 312 TFLOPS fp16 dense Tensor Core, 80 GB HBM2e bei >2 TB/s: https://www.nvidia.com/en-us/data-center/a100/ ↩

  15. BAAI/bge-reranker-base — Hugging-Face-Modellrepository, 278.044.931 Parameter: https://huggingface.co/BAAI/bge-reranker-base ↩

  16. OpenAI-Plattformpreise — text-embedding-3-small 0,02 USD/1 Mio. Input-Tokens, text-embedding-3-large 0,13 USD/1 Mio., Batch API 50 % (live abgerufen September 2026): https://platform.openai.com/docs/pricing ↩ ↩2