SkillScout Large is a dense bi-encoder for retrieving relevant skills from a job title.
Given a job title (e.g., "Data Scientist"), it produces a 1024-dimensional embedding and
retrieves the most semantically relevant skills from the ESCO
skill gazetteer (9,052 skills) via cosine similarity.
This is Stage 1 of the TalentGuide two-stage job-skill matching pipeline, trained for
TalentCLEF 2026 Task B.
Best pipeline result (TalentCLEF 2026 validation set):
nDCG@10 graded = 0.6896 | nDCG@10 binary = 0.7330
when combined with a fine-tuned cross-encoder at blend alpha=0.7.
Bi-encoder alone: nDCG@10 graded = 0.3621 | MAP = 0.4545
1from sentence_transformers import SentenceTransformer
2import faiss, numpy as np
34model = SentenceTransformer("talentguide/skillscout-large")56# Build index once over your skill corpus7skill_texts =[...]# list of skill names89embs = model.encode(skill_texts, batch_size=128,10 normalize_embeddings=True,11 show_progress_bar=True).astype(np.float32)1213index = faiss.IndexFlatIP(embs.shape[1])# inner product on L2-normed = cosine14index.add(embs)1516job_title ="Software Engineer"17q = model.encode([job_title], normalize_embeddings=True).astype(np.float32)18scores, idxs = index.search(q, k=50)1920for rank,(idx, score)inenumerate(zip(idxs[0], scores[0]),1):21print(f"{rank:3d}. [{score:.4f}] {skill_texts[idx]}")
Demo Output
Software Engineer
1. [0.942] define software architecture
2. [0.938] software frameworks
3. [0.935] create software design
Data Scientist
1. [0.951] data science
2. [0.921] establish data processes
3. [0.919] create data models
Electrician
1. [0.944] install electric switches
2. [0.938] install electricity sockets
3. [0.930] use electrical wire tools
Two-Stage Pipeline Integration
Job title
|
v
[SkillScout Large] <- this model
| top-200 candidates via FAISS ANN
v
[Cross-encoder re-ranker]
| fine-grained re-scoring
v
Final ranked list (graded: core > contextual > irrelevant)
Blend formula (alpha=0.7 gives best validation results):
Each ESCO job has 5-15 title aliases; skills have multiple phrasings.
Optional pairs are downsampled to 50% of essential count to maintain class balance.
Hyperparameters
Loss : MultipleNegativesRankingLoss (scale=20, cos_sim)
Batch size : 64 (63 in-batch negatives per anchor)
Epochs : 3
Warmup : 10% of steps (~440 steps)
Optimizer : AdamW fused
Learning rate : 5e-5, linear decay
Precision : fp16 AMP
Max seq len : 64 tokens
Best model : saved by cosine-nDCG@10 on validation
Training Curve
Epoch
Step
Train Loss
nDCG@10 val
MAP@100 val
0.34
500
2.9232
0.3430
-
0.68
1000
2.1179
0.3424
-
1.00
1465
-
0.3676
0.1758
1.37
2000
1.7070
0.3692
-
1.71
2500
1.6366
0.3744
-
2.00
2930
-
0.3717
0.1780
2.39
3500
1.4540
0.3769
0.1808
Validation Metrics (best checkpoint, step 3500)
Metric
Value
nDCG@10
0.4830
nDCG@50
0.4240
nDCG@100
0.3769
MAP@100
0.1825
MRR@10
0.6657
Accuracy@1
0.5099
Accuracy@3
0.7993
Accuracy@5
0.8914
Accuracy@10
0.9474
Evaluated with InformationRetrievalEvaluator (binary: any qrel > 0 = relevant).
Pipeline Results (graded relevance, full 9052-skill ranking)
Run
nDCG@10 graded
nDCG@10 binary
MAP
Zero-shot jjzha/esco-xlm-roberta-large
0.2039
0.2853
0.2663
SkillScout Large (bi-encoder only)
0.3621
0.4830
0.4545
SkillScout Large + cross-encoder (alpha=0.7)
0.6896
0.7330
0.2481
Competitive Context (TalentCLEF 2025 Task B)
Team
MAP (test)
Approach
pjmathematician (winner 2025)
0.36
GTE 7B + contrastive + LLM-augmented data
NLPnorth (3rd of 14, 2025)
0.29
3-class discriminative classification
SkillScout Large (2026 val, Stage 1 only)
0.4545
MNR fine-tuned bi-encoder
Limitations
English only - trained on ESCO EN labels.
ESCO-domain optimised - transfer to O*NET or custom taxonomies may require fine-tuning.
Max 64 tokens - reduce long descriptions to a concise job title.
Graded distinction - the bi-encoder alone does not reliably separate core vs contextual skills; a cross-encoder re-ranker is recommended for graded nDCG.
Citation
bibtex
1@misc{talentguide-skillscout-2026,
2 title = {SkillScout Large: Dense Job-to-Skill Retrieval for TalentCLEF 2026},
3 author = {TalentGuide},
4 year = {2026},
5 url = {https://huggingface.co/talentguide/skillscout-large}
6}
78@misc{talentclef2026taskb,
9 title = {TalentCLEF 2026 Task B: Job-Skill Matching},
10 author = {TalentCLEF Organizers},
11 year = {2026},
12 url = {https://talentclef.github.io/}
13}