Matryoshka embedding models (OpenAI's text-embedding-3, Nomic) are trained so the first dimensions carry the most information. You can truncate a 1536-dim vector to 256 dims, renormalise, and keep most of the retrieval quality at a sixth of the storage.
Implement:
truncate(E, d): keep the first d columns of each row and renormalise rows to unit lengthrecall_at_k(Q, D, relevant, k): relevant[i] is the index of query i's correct document. Return the fraction of queries whose correct document is among the top-k by dot product, with ties going to the lower index.storage_mb(n, d, bytes_per_value=4): the storage for n vectors of d values, in megabytes (10⁶ bytes)smallest_dim(Q, D, relevant, k, dims, min_ratio): the smallest d in dims whose recall@k is at least min_ratio times the full-dimension recall