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.

Model not loaded (34 MB, cached after first use)

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. 1

    Extract

    pdf.js reads the PDF's text layer in your browser. Nothing is sent to a server.

  2. 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. 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. 4

    Average

    Chunk embeddings are averaged and re-normalized, so every section of the resume counts equally.

  5. 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. 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.

05010000.250.50.751cosine similarity

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.

August baselineOctober r2 (this model)

Real resumes (held out)

24 archive resumes × 40 jobs · current rubric

0.80

Diverse fictional test

144 resumes, 24 majors

0.77

Hugging Face test

46 rankable resumes

0.63
0.40.60.81.0

Top of the list: NDCG@10

Whether the best-fitting jobs land in each resume's top 10. Higher is better.

August baselineOctober r2 (this model)

Real resumes (held out)

24 archive resumes × 40 jobs · current rubric

0.88

Diverse fictional test

144 resumes, 24 majors

0.94

Hugging Face test

46 rankable resumes

0.86
0.70.80.91.0

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 setBaseliner2Change
Real resumes, current rubric13.113.4▲ 0.3 worse
Real resumes, legacy rubric12.513.9▲ 1.4 worse
Diverse fictional test36.017.7▼ 18.3 better
Default 65/35 keyword blend15.414.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