Building an AI Job Description Analyzer Using Python, Flask, and Local LLM
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