Retrieval evaluation rests on a test collection with three parts: the document collection, a suite of information needs expressed as queries, and relevance judgments for each query-document pair, usually binary relevant or nonrelevant (Evaluation in information retrieval). Without all three you are guessing.
The first decision is where queries come from. There are three practical sources, and they trade fidelity against cost (Qdrant: Measuring Retrieval Relevance):
- Human annotation. Domain experts judge which documents are relevant for a curated list of queries. This produces the highest-fidelity signal, but expert time is the bottleneck, so it usually stays small and high value.
- Real user queries from logs. Sample query-document pairs from production, using clicks or explicit feedback such as thumbs up and thumbs down as the relevance signal. This captures the vocabulary users actually type, which synthetic queries rarely match.
- LLM-based synthetic generation. An LLM writes plausible queries for sampled documents. This scales cheaply to thousands of pairs, but synthetic queries are typically easier to retrieve than real ones, which inflates offline scores.
For most teams the practical recipe is to start with logs, because production queries contain the misspellings, abbreviations and vague phrasing that break naive retrievers. If you have no traffic yet, use synthetic generation for volume and hand-label a subset for ground truth.
How many queries are enough
The classic guidance is that 50 information needs is a sufficient minimum, because results are highly variable across queries and you need to average over a reasonably large set (Evaluation in information retrieval). Modern retrieval teams often go higher: a few hundred labeled pairs to detect large metric differences, with substantially more for per-slice analysis or small ranking deltas (Qdrant: Measuring Retrieval Relevance). A workable default is 100 to 200 queries for a first benchmark and more when you plan to ship marginal changes.
Balance the sample so frequent queries do not crowd out rare ones. Group by intent class (navigational, informational, troubleshooting, transactional) and take a proportional or stratified slice from each. A benchmark that is 80 percent "reset my password" will tell you nothing about the long tail that actually generates support tickets.
Judging relevance and handling multi-document answers
Label relevance against the information need, not the literal words in the query. A document is relevant if it addresses the stated need, not because it happens to contain all the query terms (Evaluation in information retrieval). This distinction matters most for vector search, where the whole point is finding documents that use different words to say the same thing (Weaviate: Vector Search Explained).
Define the unit of judgment explicitly. Is a "document" a whole page, a section, or a chunk of roughly 300 tokens? If chunking produces the retrieval unit, your labels must be assigned to chunk IDs, not page IDs, or your metrics will drift every time you re-chunk. Keep a stable doc_id in the payload of every point for exactly this reason (Qdrant: Measuring Retrieval Relevance).
Multi-document answers are where most naive labeling breaks. If the question is "what are the refund windows for each plan," four different pages may each hold one plan. Label all four as relevant. If you label only one, recall is capped at 0.25 by construction and every subsequent improvement looks like noise.
A short labeling rubric removes most ambiguity:
| Rule | Good practice | Why it matters |
|---|---|---|
| Relevance unit | Judge at the retrieval unit (chunk), not the page | Prevents metric drift when you re-chunk |
| Multi-document needs | Label every chunk that carries a required fact | Otherwise recall is artificially capped |
| Partial matches | Label binary relevant/not relevant, optionally add a graded score | Binary is simplest to compute and defend |
| Judged pool | Pool top results from every system you compare | New systems find new relevant chunks you must label |
| Ambiguous cases | Record the disagreement and a tiebreak rule | Auditable, reproducible labels |
The pooling point is subtle but essential. If you only label the documents your current system returns, a new retriever will surface relevant documents you never judged, and those will count as misses. Pool the top k results from every configuration you intend to compare before you finalize labels.



