Downloads · 30 days
10
6% of all-time downloads
hicham-taoufik/SKILL-Bridge
SKILL-Bridge is a text generation model from hicham-taoufik. Use it when you need the model to write or continue text. It is set up for transformers. The card lists the license as apache-2.0.
SKILL-Bridge is a domain-specialised language model that maps unstructured labour-market queries — job titles, hiring profiles, degree tracks, and academic modules — into validated JSON profiles annotated with ESCO v1…
Downloads · 30 days
10
6% of all-time downloads
All-time downloads
155
Public
Parameters
4.2B
8.4 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors8.4 GB · 100%
From the Hugging Face model README
SKILL-Bridge is a domain-specialised language model that maps unstructured labour-market queries — job titles, hiring profiles, degree tracks, and academic modules — into validated JSON profiles annotated with ESCO v1.2.1 human-readable skill labels.
The model is designed for deterministic downstream integration: workflow engines (n8n), RAG platforms (AnythingLLM), and labour-market analytics pipelines that require machine-parseable skill inventories without ESCO URIs, UUIDs, or free-form reasoning traces.
Repository: hicham-taoufik/SKILL-Bridge
Architecture: Full merged weights — QLoRA adapter fused into Qwen/Qwen3.5-4B. No PEFT required at inference.
Automated skill profiling from natural language remains challenging when outputs must conform to a rigid schema, span multiple languages, and reference a controlled vocabulary (ESCO) without leaking identifiers. General-purpose instruction models frequently emit markdown wrappers, chain-of-thought prose, or malformed JSON — particularly on long French degree descriptions and Arabic job postings.
SKILL-Bridge addresses this through supervised fine-tuning on 10,132 curated ChatML examples covering English, French, and Arabic inputs across four task types. Built on the instruction-aligned Qwen3.5-4B backbone with QLoRA (rank 64) and assistant-only loss on schema-constrained JSON, the model achieves 89.1% JSON validity on a 55-prompt held-out benchmark spanning occupations, job titles, degrees, and modules — enabling reliable structured skill extraction for production pipelines.
| Property | Value |
|---|---|
| Model type | Causal language model (decoder-only) |
| Base model | Qwen/Qwen3.5-4B |
| Fine-tuning | QLoRA SFT (4-bit NF4, rank 64, α=128) |
| Parameters | ~4B (full merged weights, bf16) |
| Context length | 6,144 tokens (training); recommend ≤2,048 generation |
| Languages | English, French, Arabic (+ mixed) |
| Skill ontology | ESCO v1.2.1 labels (text only — no URIs) |
| Output format | Single JSON object per request |
Given a user query describing a labour-market entity, the model produces a structured skill profile:
$$\text{query} \rightarrow {\texttt{resolved_title}, \texttt{essential_skills}, \texttt{optional_skills}, \ldots}$$
Input types (input_type):
| Value | Description |
|---|---|
target_occupation | Career aspiration or target role |
job_title | Active recruitment / hiring profile |
degree | Academic degree track or programme |
module | Individual course or curriculum module |
Languages (language): en, fr, ar, or mixed.
| Split | Examples |
|---|---|
| Train | 8,117 |
| Validation | 1,025 |
| Test | 990 |
| Total | 10,132 |
Language distribution (train): EN 2,435 · FR 2,476 · AR 2,417
Input-type distribution (train): job_title 2,941 · target_occupation 2,554 · degree 1,112 · module 721
Each example is a ChatML conversation:
input_type, language, text)The dataset includes ~534 negative examples (needs_review: true) and 1,000 intentionally messy free-text rows to improve robustness on real-world inputs.
| Hyperparameter | Value |
|---|---|
| Method | QLoRA supervised fine-tuning |
| LoRA rank / α | 64 / 128 |
| Target modules | All linear projections |
| Quantization | 4-bit NF4, double quant, bf16 compute |
| Epochs | 2 |
| Sequence length | 6,144 |
| Learning rate | 1×10⁻⁴ (cosine decay) |
| Batch size | Effective 4 (gradient accumulation) |
| Optimizer | AdamW (8-bit) |
| Loss masking | Assistant tokens only |
| Thinking mode | Disabled (enable_thinking=False) |
Training run:
The LoRA adapter was merged into base weights with PeftModel.merge_and_unload() to produce this standalone checkpoint (~7.9 GB, 2 safetensor shards).
Benchmark: 55 diverse prompts (EN/FR/AR × occupation / job / degree / module), evaluated with temperature 0, JSON-prefix continuation, and schema validation.
| Model | Base | Valid JSON | Rate |
|---|---|---|---|
| SKILL-Bridge | Qwen3.5-4B | 49 / 55 | 89.1% |
SKILL-Bridge produces parseable, schema-conformant JSON across multilingual labour-market queries while maintaining ESCO label fidelity. Residual failure modes include occasional truncation on very long degree descriptions and rare category-field formatting edge cases.
Median inference latency (local, single GPU): 10–14 s per request for degree/job prompts at 896–1152 max new tokens.
{
"language": "fr",
"input_type": "job_title",
"resolved_title": "chef de projet informatique",
"essential_skills": ["..."],
"optional_skills": ["..."],
"skill_categories": {
"digital": ["..."],
"transversal": ["..."],
"green": ["..."]
},
"related_occupations": ["..."],
"metrics": {
"essential_count": 24,
"optional_count": 18
},
"needs_review": false
}
Constraints enforced at training time:
conceptUri, esco_id, or HTTP linksimport torch
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL = "hicham-taoufik/SKILL-Bridge"
tokenizer = AutoTokenizer.from_pretrained(MODEL, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL,
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True,
)
model.eval()
user_content = """input_type: job_title
language: fr
text: Nous recrutons un chef de projet informatique. Listez les compétences essentielles et optionnelles."""
messages = [
{
"role": "system",
"content": (
"You are an ESCO v1.2.1 labor-market skill advisor. "
"Given a job title, hiring profile, degree track, or academic module, "
"return required skills as human-readable labels only. "
"Never output URIs, UUIDs, esco_id, conceptUri, or http links. "
"Output one valid JSON object only — no markdown, no thinking, no commentary."
),
},
{"role": "user", "content": user_content},
{"role": "assistant", "content": '{"language":"fr","input_type":"job_title"'},
]
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=False,
continue_final_message=True,
chat_template_kwargs={"enable_thinking": False},
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.inference_mode():
output_ids = model.generate(
**inputs,
max_new_tokens=1536,
do_sample=False,
temperature=0.0,
repetition_penalty=1.12,
)
response = tokenizer.decode(
output_ids[0, inputs["input_ids"].shape[1]:],
skip_special_tokens=True,
)
print(response)
Deploy with any OpenAI-compatible server (vLLM, llama.cpp, custom FastAPI). Recommended generation settings:
| Parameter | Value |
|---|---|
temperature | 0 |
max_tokens | 1536–2048 |
enable_thinking | false (critical) |
| Client timeout | ≥ 300 s (long degree prompts) |
Use structured user headers (input_type / language / text) for best results.
max_new_tokens or post-process with a JSON repair utility.This model is intended for labour-market analytics, career guidance, and HR decision support — not for automated hiring decisions without human review. Outputs should be treated as advisory. The needs_review flag in the schema indicates low-confidence profiles that warrant manual inspection.
If you use SKILL-Bridge in academic or industrial research, please cite:
@misc{skillbridge2026,
title = {SKILL-Bridge: Multilingual ESCO Skill Profiling with Structured JSON Output},
author = {Taoufik, Hicham},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/hicham-taoufik/SKILL-Bridge}},
note = {Fine-tuned Qwen3.5-4B for ESCO v1.2.1 label-only skill extraction (EN/FR/AR)}
}
Built on Qwen3.5-4B (Alibaba Cloud). Skill taxonomy from the European Commission's ESCO classification. Training infrastructure: NVIDIA DGX Spark (GB10).