/ Модель

Характеристики

Лицензия
Apache 2.0
Архитектура
resume-jd-scorer · dense
Базовая модель
gte-reranker-modernbert-base
Библиотека
pytorch
Опубликована
11 авг 2026

job-eval-modernbert

Классификация текстаТекст → label3 профессии

Дообученный cross-encoder на ModernBERT оценивает соответствие резюме вакансии по четырём аспектам и выделяет наиболее весомые абзацы.

222скачиваний за 30 дней1лайквеса обновлены12 авг 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

kasraahmadi/job-eval-modernbert — дообученная модель cross-encoder на базе ModernBERT для оценки соответствия резюме описанию вакансии. Она выдаёт четыре оценки от 1 до 5 по отдельным аспектам соответствия и для каждой подсвечивает абзац, который получил наибольший вес. Модель использует 156 млн параметров; при обучении настроены верхние два слоя трансформера, pooler и выходные головы, а основная часть энкодера заморожена.

Модель предназначена для локального предварительного ранжирования кандидатов по вакансии и объяснения результатов как вспомогательного инструмента для рекрутера. README указывает, что обучение велось на английских парах резюме и вакансий с оценками, созданными LLM-судьёй; максимальная длина при обучении — 1024 токена, базовый энкодер рассчитан на контекст до 8k. Подсветка показывает, какие фрагменты учитывает модель, но не является причинным объяснением.

Разработчик — Kasra Ahmadi; модель связана с сервисом job-eval.com и открытым CLI job-eval. Репозиторий содержит веса в формате safetensors, библиотека — PyTorch. Лицензия — Apache-2.0. Модель следует применять для сортировки и поддержки анализа человеком, а не для автоматического отказа кандидатам или принятия решений о найме.

Сценарии применения

  • оценка соответствия резюме требованиям вакансии
  • ранжирование резюме для выбранной вакансии
  • сравнение уровня опыта кандидата с уровнем должности
  • оценка совпадения отраслевого опыта с вакансией
  • выделение абзацев резюме, повлиявших на оценки

Ограничения

Модель обучена на английских резюме и вакансиях, поэтому другие языки находятся вне распределения обучения; оценка соответствия уровня seniority наименее надёжна. Возможны смещения из обучающих меток, а подсветка внимания не является причинным объяснением; модель не предназначена для автоматического отказа кандидатам или самостоятельных решений о найме.

Для каких профессий подходит3

Разделы каталога профессий, в задачах которых используется эта модель

Все профессии

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

job-eval — resume ↔ job-description fit scorer (ModernBERT)

A small, fast cross-encoder that reads a (resume, job description) pair and returns four interpretable scores from 1 to 5, plus the paragraph it weighted most for each score. It is the model behind job-eval.com and the open-source CLI at github.com/kasraahmadi/job-eval.

  • 156M parameters. Runs in a few seconds on a laptop CPU; instantly on a GPU.
  • No API, no frontier LLM. One forward pass, fully local, free.
  • Explainable. A trained per-aspect attention pooler highlights the exact paragraph that drove each score — not a post-hoc guess.

The four scores

AspectQuestion it answers
requirement_coverageHow well the resume covers the skills/responsibilities the job asks for
seniority_fitWhether the candidate's experience level matches the role's seniority
domain_alignmentHow closely the candidate's industry/problem domain matches the job
ats_keyword_overlapOverlap of concrete keywords an ATS screener would look for

Each is in [1, 5]; the product reports their average and a plain-language band (Strong match / Promising fit / Stretch fit / Low alignment).

How it was trained

  • Base encoder: Alibaba-NLP/gte-reranker-modernbert-base, a long-context (8k) ModernBERT cross-encoder. The top 2 transformer layers plus the poolers and heads are trained; the rest of the encoder is frozen (~16.5M trainable of 156M).
  • Labels: produced by an LLM judge over a large corpus of (resume, JD) pairs, each rated on the four aspects. seniority_fit labels are missing-not-at-random for ~34% of pairs (masked in the loss), which is why that head is the weakest.
  • Architecture: the encoder's token states feed a per-aspect attention pooler (LayerNorm + across-token centring + α-entmax(1.5)), which produces a sparse, readable attention map per aspect. Pooled resume and JD vectors are combined ([z_r, z_j, z_r−z_j, z_r·z_j] plus the reranker relevance logit) and read out by four small MLP heads.
  • Objective: masked MSE on the four scores + an entropy penalty on the attention so it stays peaked and legible instead of collapsing to uniform (mean-pooling). Trained at max_len=1024; the encoder handles longer contexts if you raise it.

Usage

The easiest path is the CLI — point it at your resume (PDF or text) and a list of jobs, and it writes a scored CSV plus a readable explanation file:

git clone https://github.com/kasraahmadi/job-eval
cd job-eval && pip install -r requirements.txt
python run.py --resume my_cv.pdf --jobs jobs.csv

Or load it directly in Python (needs model.py and segment.py from this repo):

import json, numpy as np, torch
from huggingface_hub import hf_hub_download
from safetensors.torch import load_model
from transformers import AutoTokenizer
from model import ResumeJDScorer  # model.py from this repo

repo = "kasraahmadi/job-eval-modernbert"
cfg = json.load(open(hf_hub_download(repo, "config.json")))
tok = AutoTokenizer.from_pretrained(cfg["encoder"])
model = ResumeJDScorer(
    cfg["encoder"], tok.cls_token_id, tok.sep_token_id, tok.pad_token_id,
    np.asarray(cfg["label_mean"], dtype=np.float32),
    n_aspects=len(cfg["aspects"]), a_dim=cfg["a_dim"], hidden=cfg["hidden"],
    dropout=cfg["dropout"], n_train_layers=cfg["n_train_layers"],
    use_rel_logit=cfg["use_rel_logit"], attn=cfg["attn"],
    center=cfg["center_pooler"], temperature=cfg["temperature"],
    score_init=cfg["score_init"],
).eval()
load_model(model, hf_hub_download(repo, "model.safetensors"))

enc = tok(resume_text, jd_text, truncation="longest_first",
          max_length=cfg["max_len"], return_tensors="pt")
with torch.no_grad():
    scores = model(enc["input_ids"], enc["attention_mask"])[0].clamp(1, 5)
print(dict(zip(cfg["aspects"], scores.tolist())))

Intended use & limitations

  • A triage aid, not a hiring decision. It ranks and explains fit; it does not and must not decide who to hire. Keep a human in the loop.
  • Trained on English resumes/JDs; other languages are out of distribution.
  • seniority_fit is the least reliable head (51.6% variance explained) because its labels are sparse.
  • The attention highlight shows where the pooler looked, which is a faithful view of the model's own weighting — but attention is not a causal attribution.
  • Like any resume model it can reflect biases in its training labels. Do not use it for automated rejection or any decision requiring demographic fairness guarantees.

License

Apache-2.0, matching the base encoder. Weights © Kasra Ahmadi.

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм · pytorch · text-classification

Нельзя запустить

Архитектура resume-jd-scorer неизвестна transformers в образе рантайма.

Ревизия весов
ce1644f

0 моделей