Sentence Similarity
sentence-transformers
ONNX
Safetensors
English
bert
feature-extraction
resume-matching
job-matching
text-embeddings-inference
Instructions to use turtlecap/mdbr-leaf-mt-resume-grader with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- sentence-transformers
How to use turtlecap/mdbr-leaf-mt-resume-grader with sentence-transformers:
from sentence_transformers import SentenceTransformer model = SentenceTransformer("turtlecap/mdbr-leaf-mt-resume-grader") sentences = [ "That is a happy person", "That is a happy dog", "That is a very happy person", "Today is a sunny day" ] embeddings = model.encode(sentences) similarities = model.similarity(embeddings, embeddings) print(similarities.shape) # [4, 4] - Notebooks
- Google Colab
- Kaggle
| 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. | |