enterprise · 2025 · DatVerse engineering portfolio
LLM job-fit and skill-gap assistant — resume + JD parser with NLP fallback chain
Django + pgvector job-fit assistant: resume and job-description parsing through a transformer-NER + sentence-embedding fallback chain, with vector similarity colocated in PostgreSQL.
- 4-stage NLP fallback chain: transformer NER → SkillNER → spaCy → sentence-embedding similarity architectural record
- pgvector vector similarity colocated in PostgreSQL with no separate vector service architectural record
Context
A candidate uploads a resume, pastes a job description, and wants a structured fit-score plus a prioritized skill-gap list, not a generic “you need more skills” hand-wave. The platform decision was whether vector similarity belongs in a separate vector service or colocated with the relational data.
Problem
Single-approach skill extraction misses skills. Transformer NER catches the long tail but misses taxonomy-anchored skills; SkillNER catches the taxonomy but misses informal language; spaCy gives a lexical baseline but misses semantic equivalents. Without a fallback chain, every approach silently drops candidates.
Approach
A multi-stage NLP fallback chain: transformer-based NER first (Nucha-BERT / JobBERT class models for high precision), SkillNER second (taxonomy-backed coverage), spaCy third (lexical baseline), sentence-embedding similarity via pgvector last (semantic long-tail). Each fallback catches what the previous layer missed. Vector similarity colocated with relational data in PostgreSQL via pgvector, so relational and vector queries hit the same store with no separate vector service.
Solution
- Django 5 + Django REST Framework backend with drf-spectacular OpenAPI schema and JWT-secured endpoints (djangorestframework-simplejwt).
- PostgreSQL + pgvector for colocated relational and vector data: skills, embeddings, and user/resume/JD records in one store.
- Resume parser via pdfplumber with regression-test fixtures.
- Multi-stage NLP fallback chain: transformer NER → SkillNER → spaCy → sentence-embedding similarity.
- Modular Django apps per concern: resume parsing, JD parsing, gap analysis, progress tracking, learning resources, search/match.
- TypeScript + Vite SPA frontend wired to the backend OpenAPI contract.
- CPU-only PyTorch wheel installation path so the backend runs end-to-end on a developer laptop without the multi-GB CUDA payload.
- pytest test suite, ruff linting, INSTALL.md verified on Python 3.13 (Windows).
Outcome
Above. The fallback-chain + pgvector-colocation pair is the architectural contribution. The “vector store inside PostgreSQL” approach matters when teams want one operational store rather than two, and is paste-ready as a reference for similar parsing / matching / scoring use cases.
Have a similar project?
Send a short brief. We'll reply within one business day.
Start a project