turtlecap's picture
Broaden semantic score calibration
a77f5eb verified
|
Raw
History Blame Contribute Delete
3.34 kB
---
base_model: BAAI/bge-small-en-v1.5
library_name: sentence-transformers
pipeline_tag: sentence-similarity
language:
- en
tags:
- sentence-transformers
- sentence-similarity
- feature-extraction
- resume-matching
- job-matching
- onnx
---
# mdbr-leaf-mt-resume-grader
A compact BGE-small embedding model fine-tuned to rank job descriptions for a
resume. It powers the opt-in, on-device Semantic AI feature in the NUWorks
Co-op Grader Chrome extension.
This is the expanded-label release from 2026-08-27. It replaces the previous
OpenAI-label candidate after training on a larger NUWorks label set and passing
a fresh unseen-resume bias check.
## Evaluation
All numbers below use production-parity mean-vector resume scoring and the
quantized `onnx/model_quantized.onnx` artifact.
| Held-out dataset | Pairs | Spearman | NDCG@10 | Top-1 |
|---|---:|---:|---:|---:|
| Expanded NUWorks test (2 unseen resumes) | 1,944 | 0.8285 | 0.8444 | 0.0% |
| Fresh bias check (24 unseen resumes) | 960 | 0.7684 | 0.8683 | 37.5% |
| Hugging Face external test | 820 | 0.6682 | 0.8627 | 73.9% |
NeuralFrame external-test Spearman is 0.6120. On the fresh bias check, this
model beat the previous candidate on all 24 individual resumes; median
per-resume Spearman was 0.7956 and 23/24 resumes scored at least 0.50.
The two-resume NUWorks Top-1 result is too coarsely sampled to be useful; rank
correlation and NDCG are the meaningful metrics for that split.
The fresh bias-check resumes were never used for training or model selection.
After the locked ranking evaluation, their labels were used to fit the
display-only monotonic mapping in `calibration.json`; it does not change raw
cosine ranking. The jobs came from the existing NUWorks pool, so this result
tests resume generalization rather than a fully new job-description
distribution.
## Training
Training used two stages:
1. Three CoSENT epochs on 6,804 `gpt-5.6-terra`/`gpt-5.6-luna`-labeled NUWorks
resume-job pairs, with checkpoint selection on two resume-disjoint
validation groups.
2. One replay epoch on the original external datasets to limit catastrophic
forgetting: 6,349 Hugging Face rows weighted 3:1 over 7,630 NeuralFrame
rows, producing a 26,677-example replay schedule.
No resume crosses the NUWorks train, validation, or test boundaries. The model
uses 384-dimensional normalized embeddings, cosine similarity, and a 256-token
window.
## Files
- `model.safetensors`: Sentence Transformers / PyTorch weights
- `onnx/model.onnx`: FP32 ONNX export
- `onnx/model_quantized.onnx`: int8 deployment model used by the extension
- `onnx/model_quint8_avx2.onnx`: uint8 AVX2-compatible alternative
- `calibration.json`: revision-pinned cosine-to-display-score mapping
The browser deployment is approximately 34 MB for the quantized model. Resume
and job text are processed locally by the extension and are not sent to this
repository.
## Usage
```python
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("turtlecap/mdbr-leaf-mt-resume-grader")
embeddings = model.encode(
["resume text", "job description"],
normalize_embeddings=True,
)
score = float(embeddings[0] @ embeddings[1])
```
For extension parity, long resumes should be chunked before embedding and the
normalized chunk embeddings averaged and normalized again.