Every later number depends on this artifact, so treat it as versioned code, not a spreadsheet someone edits. The goal is a file where each row contains a question, the IDs of the passages a correct answer must be able to cite, and a short reference answer you trust.
Where the questions come from matters more than how many you write. Pull them from real traffic: support tickets, search logs, the questions sales engineers answer by email. Synthetic question generation from your own corpus is a legitimate bootstrap, and Microsoft's walkthrough of building a golden dataset describes generating silver data and then curating it into gold, with a human correcting both the questions and the supporting references (the path to a golden dataset). The curation step is not optional. Synthetic questions tend to mirror the phrasing of the chunk they were generated from, which makes retrieval look better than it is.
Size: 50 is the floor for a useful signal, 200 is comfortable. With 100 questions, one question flipping is one percentage point. With 50, it is two points, so a small regression can hide inside noise. Stratify deliberately: roughly half should be simple fact lookups, a quarter multi-hop questions that need two passages, and a quarter hard or ambiguous phrasing.
Passage IDs must be stable. If you re-chunk the corpus, IDs change and the golden set breaks. Pin IDs to a content hash or to a stable document ID plus a chunk ordinal, and record the chunker configuration alongside the set. Chunking decisions change what a passage even is, and how you split documents determines whether retrieval can find a concept at all: chunks that are too large average several ideas into a noisy embedding, and chunks that are too small lose the context that made them meaningful (Weaviate on chunking strategies). Pinecone makes the same point about embedding context windows and the lost-in-the-middle effect when oversized chunks are passed downstream (Pinecone's chunking guide).
A row looks like this:
{
"id": "q_0042",
"question": "Which plan covers on-call escalation for a 40-seat team?",
"required_passages": ["doc_881#c3"],
"supporting_passages": ["doc_902#c1"],
"reference_answer": "The Business plan covers it; the Team plan requires an add-on.",
"stratum": "multi_hop",
"notes": "Multi-hop: plan table plus escalation policy page."
}
Mark required_passages as the passages without which the answer cannot be correct, and supporting_passages as helpful but not mandatory. This distinction is what makes recall@k meaningful. Recall against a vague "relevant documents" list will always look poor and will never tell you whether a change helped.



