Qwen2.5-0.5B Resume Parser
A fine-tuned Qwen2.5-0.5B-Instruct model specialized for resume/CV parsing and structured candidate information extraction.
The model takes resume text as input and returns structured JSON containing candidate information, skills, experience, education, certifications, projects, awards, and spoken languages.
🚀 Experiment with the Model
For a FastAPI API and web UI to experiment with the model:
GitHub: https://github.com/gaddamthrinath/qwen2.5-0.5b-resume-parser
git clone https://github.com/gaddamthrinath/qwen2.5-0.5b-resume-parser.git
cd qwen2.5-0.5b-resume-parser
Model Details
| Property | Details |
|---|---|
| Base Model | Qwen/Qwen2.5-0.5B-Instruct |
| Parameters | 0.5B |
| Task | Resume parsing / information extraction |
| Fine-tuning | SFT |
| Input | Resume/CV text |
| Output | Structured JSON |
| Format | GGUF |
| Quantizations | Q4_K_M, Q8_0 |
| Context | 8192 tokens |
| Temperature | 0 |
| Language | English |
OCR & Layout Preservation
For PDF/image resumes, preserving the original layout and reading order is recommended.
In our experiments, layout-preserved OCR text generally produced better parsing results than flattening the entire resume into one continuous string.
This is especially important for:
- Multi-column resumes
- Section headings
- Job titles and companies
- Employment dates
- Bullet points
- Tables
- Contact information
You can experiment with LlamaLiteParser or other layout-aware OCR/document parsing tools.
The important principle is:
Preserve useful document layout and reading order before passing the text to the model.
Output Schema
{
"full_name": "string or null",
"email": "string or null",
"phone": "string or null",
"location": {
"city": "string or null",
"state": "string or null",
"country": "string or null"
},
"links": ["string"],
"summary": "string or null",
"skills": ["string"],
"experience": [
{
"company": "string or null",
"title": "string or null",
"location": "string or null",
"start_date": "string or null",
"end_date": "string or null",
"description": "string or null"
}
],
"education": [
{
"institution": "string or null",
"degree": "string or null",
"start_date": "string or null",
"end_date": "string or null"
}
],
"certifications": [
{
"name": "string or null",
"issuer": "string or null",
"date": "string or null"
}
],
"awards_achievements": [
{
"name": "string or null",
"issuer": "string or null",
"date": "string or null",
"description": "string or null"
}
],
"projects": [
{
"name": "string or null",
"description": "string or null",
"url": "string or null",
"technologies": ["string"]
}
],
"spoken_languages": ["string"]
}
GGUF Versions
| File | Quantization | Size |
|---|---|---|
Qwen2.5-0.5B-Instruct.Q4_K_M.gguf | Q4_K_M | ~398 MB |
Qwen2.5-0.5B-Instruct.Q8_0.gguf | Q8_0 | ~531 MB |
Q4_K_M is recommended for lower memory usage.
Q8_0 is recommended when higher numerical precision is preferred.
Ollama
Because the strict resume-parsing system prompt and chat template are natively baked into the GGUF files, the Ollama Modelfile is extremely simple.
Create a file named Modelfile:
FROM ./Qwen2.5-0.5B-Instruct.Q4_K_M.gguf
PARAMETER stop "<|im_start|>"
PARAMETER stop "<|im_end|>"
PARAMETER temperature 0
PARAMETER repeat_penalty 1.0
PARAMETER num_ctx 8192
PARAMETER num_predict 3072
Create the Ollama model:
ollama create qwen-resume-parser -f Modelfile
Run:
ollama run qwen-resume-parser
For Q8_0, simply change the FROM line to:
FROM ./Qwen2.5-0.5B-Instruct.Q8_0.gguf
Fine-Tuning
The model was fine-tuned using Supervised Fine-Tuning (SFT) to improve structured resume information extraction.
Resume Text
↓
Qwen2.5-0.5B-Instruct
↓
SFT Fine-Tuning
↓
Resume Parser
↓
Structured JSON
Training Dataset
Training dataset information will be added separately.
Limitations
Performance can vary depending on:
- Resume formatting
- OCR quality
- Resume length
- Non-English resumes
Responsible Use
This model is intended for resume information extraction and automation.
It should not be used as the sole basis for automated hiring, rejection, employment, or other high-impact decisions.
Base Model
This model is based on:
Qwen/Qwen2.5-0.5B-Instruct
Using the Model in Python (llama-cpp-python)
Since this repository contains GGUF files with the system prompt and Qwen ChatML template baked directly into their metadata, using the model in Python is extremely simple.
You do not need to pass the system prompt manually! Just pass the raw resume text as a user message, and the model will automatically apply the strict parsing rules and output the JSON.
from llama_cpp import Llama
# Load the model directly from Hugging Face
llm = Llama.from_pretrained(
repo_id="thrinath25/qwen2.5-0.5b-resume-parser",
filename="Qwen2.5-0.5B-Instruct.Q4_K_M.gguf",
n_ctx=4096,
verbose=False
)
resume_text = """
John Doe
Software Engineer
...
"""
# The baked-in chat template automatically applies the system prompt!
response = llm.create_chat_completion(
messages=[
{"role": "user", "content": resume_text}
],
temperature=0.0
)
print(response['choices'][0]['message']['content'])
[!WARNING] Unlike Ollama GGUF (where the
Modelfilebakes the system prompt into the registered model), rawmodel.safetensorsweights do not have the system prompt baked into the file.The fine-tuned model is strictly sensitive to the exact system prompt. When running inference with Hugging Face Transformers, vLLM, or custom pipelines, you must provide the exact system prompt to ensure structured JSON output.
SYSTEM PROMPT
You are an expert, strict resume parsing assistant.
Extract structured candidate information from the provided resume text into a single valid JSON object.
<json_schema>
{
"full_name": "string or null",
"email": "string or null",
"phone": "string or null",
"location": {
"city": "string or null",
"state": "string or null",
"country": "string or null"
},
"links": ["string"],
"summary": "string or null",
"skills": ["string"],
"experience": [
{
"company": "string or null",
"title": "string or null",
"location": "string or null",
"start_date": "string or null",
"end_date": "string or null",
"is_current": "boolean",
"description": "string or null",
"highlights": ["string"]
}
],
"education": [
{
"institution": "string or null",
"degree": "string or null",
"field_of_study": "string or null",
"start_date": "string or null",
"end_date": "string or null",
"gpa": "string or null"
}
],
"certifications": [
{
"name": "string or null",
"issuer": "string or null",
"date": "string or null"
}
],
"awards_achievements": [
{
"name": "string or null",
"issuer": "string or null",
"date": "string or null",
"description": "string or null"
}
],
"projects": [
{
"name": "string or null",
"description": "string or null",
"technologies": ["string"],
"url": "string or null"
}
],
"spoken_languages": ["string"]
}
</json_schema>
<rules>
1. Strict Grounding: Extract ONLY facts explicitly stated in the text. Never invent, extrapolate, or hallucinate missing details.
2. Missing or Uncertain Data: If any field, date, or detail is absent or not 100% grounded in the text, strictly output null for strings/objects and [] for arrays (e.g. education, certifications, awards_achievements, projects, spoken_languages).
3. Spoken Languages: "spoken_languages" refers EXCLUSIVELY to human natural languages.
4. Output Contract: Output ONLY the raw JSON object. Do not include markdown code fences (no ```json), commentary, or conversational filler.
</rules>
License
Apache 2.0
Links
- Hugging Face: https://huggingface.co/thrinath25/qwen2.5-0.5b-resume-parser
- GitHub / FastAPI / UI: https://github.com/gaddamthrinath/qwen2.5-0.5b-resume-parser