The one curve every index is described by
Recall is measured against what a brute-force scan would have returned, so it needs a ground truth computed exactly, once, on a sample of queries.
Report queries per second at recall 0.9, 0.95 and 0.99.
Every approximate index has a dial, and turning it trades one for the other. The only honest way to compare two indexes is at equal recall.
A benchmark reporting queries per second without a recall number is reporting nothing, since any index can be made arbitrarily fast by returning worse answers.
The shape of the curve
Going from 0.80 to 0.90 is cheap. From 0.95 to 0.99 often costs three or four times the work, because the last few results are the boundary cases the structure was designed to skip.
Those are the dials, one per family, and they are query-time parameters rather than build-time ones, so the trade can be set per request.
A search that allows a longer tail for some queries and not others is therefore possible, and it is how a system serves an interactive path and a batch path from one index.
What recall is actually worth
A document missed by the index cannot be recovered by anything downstream, so retrieval recall is a ceiling on the whole pipeline.
Reranking fixes order, not absence.
That is why the usual configuration retrieves many candidates at moderate recall and spends the saved time on reranking, rather than retrieving few candidates at very high recall.
Ninety of the true top hundred is a better input to a reranker than ten near-perfect ones, for the same latency budget.
One measurement, in order
- Sample a few thousand real queries, not synthetic ones.
- Compute the exact top for each by brute force, once, and store it.
- Sweep the index parameter across its range.
- Record recall and the latency percentiles at each setting.
- Choose the setting from the curve and the latency budget, not from a default.
Report percentiles rather than an average. Approximate search has a long tail, since some queries land in dense regions and visit far more nodes than the median.
What moves the whole curve
Better recall at the same latency is not won by tuning. It comes from a better index structure, a better embedding, or fewer vectors to search.
Metadata filtering is the largest available win when it applies, because searching a tenth of the corpus moves the curve rather than sliding along it.
Quantisation moves it too, in a way that looks wrong at first: the vectors are less accurate, more of them fit in cache, and the net effect at fixed latency is usually higher recall.