Skip to main content

Command Palette

Search for a command to run...

Building an AI Job Description Analyzer Using Python, Flask, and Local LLM

Published
2 min read

Introduction

Job descriptions often contain large blocks of unstructured text.

Recruiters and candidates manually scan them to identify required skills, experience levels, and role expectations. This process is time-consuming and inconsistent.

In this article, I’ll show how to build a simple AI Job Description Analyzer using Python, Flask, and a locally running LLM (via Ollama).

The system extracts:

  • Key skills

  • Required experience

  • Tech stack

  • Role summary

All without using cloud APIs.

The goal is to demonstrate how GenAI can assist real hiring workflows.


Architecture Overview

The system follows a simple pipeline:

User Input
↓
Flask API
↓
Local LLM (Ollama)
↓
Structured Job Insights

Users paste job descriptions.

The backend forwards them to a local LLM.

The model returns structured analysis.

Results are displayed in the browser.


Prerequisites

  • Python 3.10+

  • Ollama installed

  • llama3 model

  • Basic Flask knowledge

Start model:

ollama run llama3

Backend Implementation

Create app.py:

from flask import Flask, request, jsonify, send_from_directory
import requests

app = Flask(__name__, static_folder=".")

OLLAMA_URL = "http://localhost:11434/api/generate"

@app.route("/")
def home():
    return send_from_directory(".", "index.html")

@app.route("/analyze", methods=["POST"])
def analyze():
    jd = request.json["jd"]

    prompt = f"""
Analyze the following job description and provide:

1. Required Skills
2. Experience Level
3. Tech Stack
4. Short Role Summary

Job Description:
{jd}
"""

    payload = {
        "model": "llama3",
        "prompt": prompt,
        "stream": False
    }

    response = requests.post(OLLAMA_URL, json=payload)
    return jsonify({"response": response.json().get("response","")})

if __name__ == "__main__":
    app.run(debug=True)

Simple Web Interface

Create index.html:

<!DOCTYPE html>
<html>
<body>

<h2>AI Job Description Analyzer</h2>

<textarea id="jd" rows="10" cols="70" placeholder="Paste job description"></textarea><br>
<button onclick="analyze()">Analyze</button>

<pre id="result"></pre>

<script>
async function analyze(){
  let jd = document.getElementById("jd").value;

  let res = await fetch("/analyze",{
    method:"POST",
    headers:{"Content-Type":"application/json"},
    body:JSON.stringify({jd:jd})
  });

  let data = await res.json();
  document.getElementById("result").innerText = data.response;
}
</script>

</body>
</html>

Running the Analyzer

pip install flask requests
python app.py

Open:

http://localhost:5000

Key Engineering Learnings

GenAI Converts Unstructured Text into Insights

Job descriptions become structured information.


Local Models Preserve Privacy

Sensitive hiring data stays on the machine.


Prompt Design Drives Output Quality

Clear instructions produce usable results.


Conclusion

This Job Description Analyzer shows how LLMs can assist hiring teams by transforming raw text into actionable insights.

With extensions like role matching or resume comparison, this can evolve into a recruitment assistant.


Source Code

Full implementation:

→ https://github.com/Gs4492/ai-job-description-analyzer