Systems Library / Operations & Admin / How to Build an AI Resume Screening System
Operations & Admin hr people

How to Build an AI Resume Screening System

Screen resumes automatically using AI to find the best candidates faster.

Jay Banlasan

Jay Banlasan

The AI Systems Guy

Reviewing 200 resumes for one role takes hours. Most of those resumes do not even meet basic requirements. I built an AI resume screening system that reads every application, scores it against the job requirements, and surfaces the top candidates in minutes.

This ai resume screening hiring automation saves hiring managers from drowning in applications.

What You Need Before Starting

Step 1: Define the Scoring Rubric

RUBRIC = {
    "role": "Senior Python Developer",
    "required_skills": ["python", "sql", "api development", "git"],
    "preferred_skills": ["aws", "docker", "ci/cd", "terraform"],
    "min_experience_years": 5,
    "education": "bachelor's degree in computer science or equivalent",
    "deal_breakers": ["no python experience", "entry level only"]
}

Step 2: Extract Text from Resumes

import fitz  # PyMuPDF
from pathlib import Path

def extract_resume_text(file_path):
    path = Path(file_path)
    if path.suffix.lower() == ".pdf":
        doc = fitz.open(str(path))
        text = ""
        for page in doc:
            text += page.get_text()
        return text
    elif path.suffix.lower() in [".txt", ".md"]:
        return path.read_text()
    return ""

Step 3: Score Each Resume with AI

import anthropic
import json

client = anthropic.Anthropic()

def score_resume(resume_text, rubric):
    prompt = f"""Score this resume against the job requirements. Return JSON only.

Job: {rubric['role']}
Required Skills: {', '.join(rubric['required_skills'])}
Preferred Skills: {', '.join(rubric['preferred_skills'])}
Minimum Experience: {rubric['min_experience_years']} years
Deal Breakers: {', '.join(rubric['deal_breakers'])}

Resume:
{resume_text[:3000]}

Return this JSON structure:
{{
    "candidate_name": "name from resume",
    "score": 0-100,
    "required_skills_met": ["list of matched required skills"],
    "preferred_skills_met": ["list of matched preferred skills"],
    "estimated_experience_years": number,
    "deal_breaker_flags": ["any deal breakers found"],
    "summary": "2-3 sentence assessment",
    "recommendation": "advance|review|reject"
}}"""

    message = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}]
    )
    return json.loads(message.content[0].text)

Step 4: Process All Resumes in Batch

def screen_all_resumes(resume_dir, rubric):
    results = []
    for filepath in Path(resume_dir).glob("*"):
        text = extract_resume_text(filepath)
        if not text.strip():
            continue
        score = score_resume(text, rubric)
        score["file"] = filepath.name
        results.append(score)

    results.sort(key=lambda x: x["score"], reverse=True)
    return results

Step 5: Generate the Shortlist Report

def generate_shortlist(results, top_n=10):
    shortlist = [r for r in results if r["recommendation"] == "advance"][:top_n]

    report = f"# Candidate Shortlist\n\n"
    report += f"Screened: {len(results)} resumes\n"
    report += f"Advancing: {len(shortlist)} candidates\n\n"

    for i, candidate in enumerate(shortlist, 1):
        report += f"## {i}. {candidate['candidate_name']} (Score: {candidate['score']})\n"
        report += f"{candidate['summary']}\n\n"

    return report

What to Build Next

Add a feedback loop where hiring managers mark AI recommendations as correct or incorrect. Use that data to refine your scoring prompts over time. The system gets better with every hire.

Related Reading

Want this system built for your business?

Get a free assessment. We will map every system your business needs and show you the ROI.

Get Your Free Assessment

Related Systems