Build your own semantic search
Is it correct? (recall@k vs exact NN)·10 min

Implement recall@k

0 / 1
# grade this stage (from your course directory)
npx theinference test --stage recall-at-k --watch

Compute recall for one query, then you'll average it over the whole query set in the next step.

What to build

Your task

Implement recallAtK

Implement recallAtK(retrieved, relevant, k) in src/metrics.ts: retrieved is your ranked number[], relevant is the set of true-relevant indices (number[]); return |first-k-of-retrieved ∩ relevant| / |relevant|.

src/metrics.ts
export function recallAtK(retrieved: number[], relevant: number[], k: number): number {
  // fraction of `relevant` present in retrieved.slice(0, k)
  // (a Set of relevant + a loop over the top-k is plenty)
}
How it's graded

adapter — allclose vs reference on a hand-built (retrieved, relevant) case, atol=1e-6.

Denominator is |relevant|, not k

recall@k divides by the number of relevant docs, not by k. If a query has only 1 relevant doc, recall@10 is either 0 or 1 — never 0.1. Guard |relevant| === 0 (return 0) so you never divide by zero.