An AI-powered recruitment system that evaluates resumes against Job Descriptions using multi-dimensional scoring, semantic matching, and explainable AI.
Built for the Internship Take-Home Assignment โ Option A: Evaluation & Scoring Engine (Depth over Breadth)
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ Streamlit โโโโโโถโ FastAPI API โโโโโโถโ Gemini 2.5 Flashโ
โ Frontend โโโโโโโ /evaluate โโโโโโโ (via LangChain) โ
โ :8501 โ โ :8000 โ โโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโ โโโโโโโโโโฌโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโ
โ ChromaDB โ
โ (Embeddings + โ
โ Vector Search) โ
โโโโโโโโโโโโโโโโโโโโ
| Component | Technology |
|---|---|
| Language | Python 3.10+ |
| Backend API | FastAPI + Uvicorn |
| LLM | Google Gemini 2.5 Flash |
| Reasoning Layer | LangChain |
| Vector Store | ChromaDB (in-memory) |
| Embeddings | Sentence-Transformers (all-MiniLM-L6-v2) |
| PDF Parsing | PyPDF2 |
| Data Validation | Pydantic v2 |
| Frontend UI | Streamlit |
resume-shortlisting-app/
โโโ app/
โ โโโ __init__.py
โ โโโ main.py # FastAPI app + /evaluate endpoint
โ โโโ models/
โ โ โโโ __init__.py
โ โ โโโ schemas.py # Pydantic models (ResumeData, EvaluationOutput)
โ โโโ core/
โ โ โโโ __init__.py
โ โ โโโ prompts.py # LangChain prompt templates
โ โโโ services/
โ โ โโโ __init__.py
โ โ โโโ evaluator.py # LLM parsing + scoring orchestration
โ โ โโโ chroma_service.py # ChromaDB semantic matching
โ โโโ api/
โ โโโ __init__.py
โโโ streamlit_app.py # Streamlit frontend UI
โโโ requirements.txt
โโโ SYSTEM_DESIGN.md # Architecture & design document
โโโ .env # API keys (not committed)
โโโ README.md # This file
git clone https://github.com/mridulnehra/ai-resume-shortlisting-engine.git
cd ai-resume-shortlisting-engine
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
Create a .env file in the project root:
GOOGLE_API_KEY=your_gemini_api_key_here
source venv/bin/activate
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000
The API will be live at http://localhost:8000. Swagger docs at http://localhost:8000/docs.
In a separate terminal:
source venv/bin/activate
streamlit run streamlit_app.py --server.port 8501
Open http://localhost:8501 in your browser.
POST /evaluateContent-Type: multipart/form-data
| Parameter | Type | Description |
|---|---|---|
job_description |
string (form field) | The full job description text |
resume_pdf |
file (PDF) | The candidateโs resume |
Response (200 OK):
{
"exact_match": { "score": 85, "explanation": "Candidate has Python, FastAPI..." },
"semantic_similarity": { "score": 78, "explanation": "Strong conceptual match..." },
"impact": { "score": 90, "explanation": "Reduced latency by 20%..." },
"ownership": { "score": 75, "explanation": "Led development of analytics..." },
"overall_score": 82,
"tier": "Tier A",
"final_recommendation": "Fast-track. Strong technical fit."
}
GET /healthReturns {"status": "healthy"} - used for monitoring and load balancer health checks.