turtlecap/mdbr-leaf-mt-resume-grader
A 33M-parameter resume–job matcher that runs in your browser
A fine-tune of BAAI/bge-small-en-v1.5 trained to place resumes near the jobs they fit. It powers the semantic score in the NUWorks Co-op Grader extension. Here it ranks a resume against real LinkedIn postings from every field.
- Parameters
- 33.36M
- Embedding size
- 384-dim
- Context window
- 256 tokens
- Download (int8 ONNX)
- 34 MB
- Hugging Face downloads
- 132
- Last updated
- Oct 15, 2026
Release major-agnostic-bge-2026-10-15-r2 · revision d67ad62d · live from the Hugging Face Hub
Try it
Grade your resume against 700 real job postings
Your resume is parsed and embedded on this device. Only the model weights and the public job set are downloaded.
Drop your resume here
PDF or .txt · never uploaded
Upload a resume and press Grade my resume.
The first run downloads the 34 MB model; later runs take about a second.
How it works
From PDF to ranked matches, all in the browser
Grade a resume above to fill in live values for each step.
- 1
Extract
pdf.js reads the PDF's text layer in your browser. Nothing is sent to a server.
- 2
Chunk
The model sees 256 tokens at a time, so the resume is split into ~1,100-character chunks on paragraph and sentence boundaries instead of being truncated.
- 3
Encode
Each chunk runs through the fine-tuned BGE-small encoder (int8 ONNX, WebAssembly) in a Web Worker. Token vectors are mean-pooled and L2-normalized into one 384-dimensional embedding.
- 4
Average
Chunk embeddings are averaged and re-normalized, so every section of the resume counts equally.
- 5
Compare
Every job posting (title plus its first 1,200 characters) was embedded ahead of time with the same model revision. Matching is one dot product per job.
- 6
Calibrate & blend
A monotonic curve from calibration.json turns cosine into a 0–100 grade, scaled so the curve's ceiling reads 100. That grade is blended with a keyword skill-overlap score (65/35 by default).
Calibration curve
Cosine below ~0.24 maps to 0; the top knot (~0.80) maps to 100.
Evaluation
Better at ranking jobs for a resume; grades about the same
Held-out tests from the model's published evaluation.json, comparing the current release against the August model it was trained from. Scores are averaged per resume, so each resume counts equally.
Spearman, real resumes
0.798
▲ +0.117 vs baseline
Pairwise accuracy, real resumes
88.2%
▲ +7.0 pts
NDCG@10, real resumes
0.884
▲ +0.047
Held-out test set
960 pairs
24 resumes · 24 occupations
Ranking quality: per-resume Spearman
How well each resume's job ordering matches the labels. Higher is better.
Real resumes (held out)
24 archive resumes × 40 jobs · current rubric
Diverse fictional test
144 resumes, 24 majors
Hugging Face test
46 rankable resumes
Top of the list: NDCG@10
Whether the best-fitting jobs land in each resume's top 10. Higher is better.
Real resumes (held out)
24 archive resumes × 40 jobs · current rubric
Diverse fictional test
144 resumes, 24 majors
Hugging Face test
46 rankable resumes
Absolute grades: mean absolute error, 0–100 points
How far the calibrated grade is from the label. Lower is better. Ranking improved more than grading did.
| Test set | Baseline | r2 | Change |
|---|---|---|---|
| Real resumes, current rubric | 13.1 | 13.4 | ▲ 0.3 worse |
| Real resumes, legacy rubric | 12.5 | 13.9 | ▲ 1.4 worse |
| Diverse fictional test | 36.0 | 17.7 | ▼ 18.3 better |
| Default 65/35 keyword blend | 15.4 | 14.0 | ▼ 1.4 better |
Labels are LLM teacher judgments, not hiring outcomes. The real-resume test's 40 jobs also appear in older training data. Top-1 hit rate on real resumes moved 33% → 25%, with a confidence interval that includes zero. Full report
Training
Built to be major-agnostic
The r2 release extends coverage across 24 academic majors and 6 career stages. Major and year are only sampling metadata; demonstrated skills and the job's explicit requirements decide the fit.
- Base model
- BAAI/bge-small-en-v1.5, a BERT encoder (12 layers, 384 hidden)
- Objective
- CoSENT loss on teacher-labeled resume/job pairs: it teaches the ordering of cosine similarities to agree with the ordering of match scores
- Schedule
- 2 epochs, batch size 64, batches grouped so each one compares jobs for the same resume
- New data in r2
- 4,608 labeled pairs from 864 fictional resumes (24 majors × 6 career stages) and 144 job scenarios
- Replayed data
- Earlier Hugging Face, OpenAI-labeled, and NeuralFrame resume/job pairs, to keep earlier gains
- Selection
- Checkpoint b_epoch2, chosen on validation only; test sets opened once
- Calibration
- Validation-only piecewise-linear map, 50/50 across synthetic and legacy sources
- Inference
- No query prompt, mean pooling, L2 normalization, 256-token window, int8 ONNX for the browser