← All projects
2026

Candidate Ranker

Python · Polars · Qwen3-4B · Parquet

Ranking 100k candidates on a laptop CPU in under five minutes.

100k candidates<5 min on CPU≤16 GB, no network

The constraint: one job description, 100,000 candidates, reproducible on CPU in under five minutes with 16 GB and no network. The design splits work by what each stage is allowed to cost.

Stage one runs offline on GPU with no time limit — normalization, deterministic features, integrity signals, and small-language-model judgments (Qwen3-4B answering 30 booleans) only for candidates above a tuned ceiling — all frozen to a flat Parquet file. Stage two is a lazy Parquet scan where the JD policy compiles to vectorized Polars expressions: one pass to score, sort, and tie-break, with grounded reasoning for the top N.

The key invariant: no candidate is ever removed. Gates, honeypots, and penalties drive a score toward zero, but the row survives — every ranking decision stays auditable.

Key decisions

  • Declarative JD policy compiled to vectorized Polars expressions
  • SLM judgments (30 booleans) gated behind a tuned score ceiling
  • No-removal invariant — penalties zero the score, never delete the row
  • Single-pass score / sort / tie-break within a 5-minute CPU budget