RAG and vector searchLoading progress…

Records and identity

Design a retrieval record and explain filtering, indexing, partitioning, updates and consistency.

Records and identity

A vector database stores more than numbers. Each record should carry a stable identifier (document and chunk), the identity of the embedding model that produced the vector, the text or a pointer to it, and useful metadata for filtering. A vector with no traceable source cannot be audited, updated or deleted reliably.

chunk number3
record { id: "handbook#3" model: "embed-v1" dim: 384 vector: [0.12, −0.03, …] (384 floats = 1,536 bytes) text: "…the passage…" metadata: { lang: "en", updated: "2025-01-10" } } this vector can be traced to its passage, updated or deleted by id

12,500 documents with 8 chunks each are 100,000 records. At 384 float32 dimensions the vectors alone are 153,600,000 bytes. Record the embedding-model identity so you know which vectors can be compared.

Toggle the source id and metadata and see what the record can and cannot do.

Predict first. What links a retrieved vector back to a passage?

Chapter context

A vector index solves similarity lookup; a retrieval application also needs durable records, metadata, permissions and updates. Database behavior determines which vectors are eligible and which version of a document an answer uses.

Chapter reference: math, worked example & code

This section belongs to the whole chapter, so it is the same on every lesson in it and may cover a different lesson's topic. The code for the experiment you just ran is inside the experiment itself.

Math and notation

Raw vector storage is M=NdbM=Ndb for N vectors of dimension d and b bytes per coordinate. If a postfilter independently accepts fraction f of an initial k candidates, the expected survivor count is kf; this is an expectation, not a guarantee.

Worked example

Ten million vectors of dimension 768 in float32 require 10,000,000×768×4=30,720,000,000 bytes, or 30.72 decimal GB, before IDs, text, indexes and replicas. If a postfilter accepts 20% of ten candidates under a simplifying independence assumption, the expected survivor count is only two.

Reference code

The following example uses the Python standard library and does not call a remote service.

from math import isclose
bytes_used=10_000_000*768*4
assert bytes_used == 30_720_000_000
assert isclose(bytes_used/1_000_000_000,30.72)
assert 10*.2 == 2

Python examples are provided for study and local execution; this page does not execute Python.

Common mistakes

Filter selectivity and ANN candidate recall interact. Replication adds storage. Matching vector dimension does not establish matching embedding space.