Views
No views yet
gte-reranker-modernbert-base) over the joint (profile, job) pair with one relevance
head and three auxiliary heads (role_fit, skill_fit, level_fit). Trained on
Profile-Jobs-Ranked:
5.7M LLM-graded pairs over 245k synthetic US seeker profiles x 1.5M real postings,
with a relevance-only label (0.55role_fit + 0.45skill_fit, 0-100).| metric | model | retrieval order | random |
|---|---|---|---|
| NDCG@10 | 0.746 | 0.640 | 0.521 |
| NDCG@full | 0.794 | --- | --- |
| judge-label of #1 result | 55.7 | 46.3 | (oracle 65.8) |
[SEEKING]/[LEVEL]/[LOC]/[WANTS]/[COMP]/[SKILLS]/[EXP]... lines, job as
[TITLE]/[COMPANY]/[LOC]/[PAY]/[LEVEL]/[DESC] lines --- see the dataset card for the schema.1import torch, torch.nn as nn
2from transformers import AutoModel, AutoTokenizer
3from huggingface_hub import hf_hub_download
4
5REPO = "akzaidan/People2JobRanker"
6tok = AutoTokenizer.from_pretrained(REPO)
7
8class Ranker(nn.Module):
9 def __init__(self):
10 super().__init__()
11 self.encoder = AutoModel.from_pretrained("Alibaba-NLP/gte-reranker-modernbert-base")
12 h = self.encoder.config.hidden_size
13 self.dropout = nn.Dropout(0.1)
14 self.main_head, self.aux_head = nn.Linear(h, 1), nn.Linear(h, 3)
15 def forward(self, **enc):
16 cls = self.encoder(**enc).last_hidden_state[:, 0].float()
17 cls = self.dropout(cls)
18 return self.main_head(cls).squeeze(-1), self.aux_head(cls)
19
20model = Ranker()
21model.load_state_dict(torch.load(hf_hub_download(REPO, "pytorch_model.bin"),
22 map_location="cpu"))
23model.eval()
24
25enc = tok([profile_text], [job_text], truncation="longest_first",
26 max_length=2048, return_tensors="pt")
27score, aux = model(**enc) # rank by `score` (higher = better fit)


sigmoid(score)*100 is inflated (disqualified
pairs average ~62%); fit a monotone recalibration before displaying a "% match".