W01 / Case study
Fewer LLM calls, better matches
Rebuilding a candidate-to-vacancy matching engine against a measured baseline, with a human approving every match.
- Client
- An AI recruiting platform (EU), under NDA
- Role
- Lead engineer of the matching engine, from the first version
- Period
- 2025 — now
- Stack
- Python
- Node.js
- Next.js
- PostgreSQL
- LLMs
- fewer top matches later rejected by recruiters
- ~3×
- lower LLM cost per matching run
- ~25%
- of the LLM calls the old engine made
- < ½
01 / Context
Context
When a candidate signs up, an LLM turns their application into a structured profile. The engine then ranks open vacancies for that candidate and explains each match, and recruiters approve or reject the suggestions in an internal dashboard. I built the first version of the engine and still lead it, and I am the top contributor to the core API and the approval dashboard behind it.
02 / Problem
Problem
Version one scored every candidate vacancy with its own LLM call. It worked, but recruiters rejected most of the top suggestions, and one LLM call per vacancy made every run slow and expensive.
03 / Architecture
Architecture
- Candidate profile — LLM, structured output
- Eligible vacancies — filters + geo
- Cheap LLM pre-filter
- Reranker — + LLM evaluators
- Business rules
- Human approval — dashboard
Cheap steps narrow the pool before the expensive ones run, and a person approves every match.
04 / Key decisions
Key decisions
05 / Hard problems
Hard problems
Answers landing on the wrong vacancy
Batching made the model attribute some answers to the wrong vacancy. Making it echo what it was scoring and repairing partial batches made that rare.
Misses that weren't
Many of the matches the engine seemed to miss were recruiters deliberately matching to closed vacancies. Those vacancies are now part of the pool.
Rules that fought each other
Several ranking rules interacted badly at the cut-offs, until each became an explicit, tested rule.
06 / How it was built
How it was built
Every change started as a written spec and was measured against a fixed benchmark with a holdout set before it shipped. Role-split AI agents (architect, executor, reviewer) did much of the implementation inside those guardrails.