
AI Resume Intelligence Engine
Document AI for HR Data Extraction
A document-AI engine that parses resumes from PDF/DOCX, extracts employers, titles, skills and experience with confidence scores, matches resumes to jobs via semantic search, and generates standards-ready HR-XML.
PDF · DOCX
Formats supported
Confidence
Per-field
Semantic
Matching
HR-XML
Output
Business challenge
HR systems need clean, structured employment history, but resumes arrive as messy PDFs, scans and DOCX files. Manual data entry is slow and error-prone, and downstream systems require a strict XML schema with traceable confidence.
What I built
I built a staged pipeline: normalize input, OCR-ready segmentation, extract entities (employers, titles, skills, dates), attach a confidence score to every field, match resumes to jobs via semantic search, and serialize to HR-XML. Low-confidence fields are flagged for human review, keeping humans in the loop where it matters.
Why it matters
Recruiting and HR platforms live and die by data quality. Bad extraction means bad matches and bad reporting. The engine had to turn arbitrary resume formats into trustworthy, structured data that both machines and human reviewers could rely on.
How it's designed
Interface
How the intelligence flows
- 01Normalize — detect format and convert PDF/DOCX (OCR-ready) to text.
- 02Segment — split into sections (experience, education, skills).
- 03Extract — NER + local LLM for employers, titles, skills and dates.
- 04Score — calibrated confidence per field, flagging low-confidence values.
- 05Embed & match — semantic resume-to-job matching via vector search.
- 06Serialize — emit standards-ready HR-XML.
How data is modeled
- PostgreSQL tables for documents, extracted_records and confidence per field.
- pgvector embeddings for resume-to-job semantic matching.
- Job-state tracking for idempotent, resumable batch processing.
- Object storage for source files with references back to extracted fields.
Key endpoints
/api/parseParse a resume file into structured, confidence-scored fields./api/matchMatch a parsed resume against a job description./api/searchSemantic search across parsed resumes./api/export/{id}.xmlExport a parsed resume as HR-XML.Technologies
Key features
- Multi-format ingestion — PDF, DOCX and OCR-ready scans.
- Entity extraction — employers, titles, skills, dates.
- Per-field confidence scoring with review flags.
- Resume-to-job semantic matching.
- HR-XML generation to a strict schema.
- Local LLM support to keep PII in-house.
Challenges & trade-offs
Wildly inconsistent inputs
Resumes have no standard layout. A robust section segmenter plus fallback heuristics kept extraction accurate across formats.
Trustworthy confidence scoring
Every extracted field carries a calibrated confidence so downstream systems and reviewers know exactly what to trust.
OCR-ready without over-engineering
The pipeline was structured so image-only documents can flow through an OCR stage without reworking the extraction logic.
Code snippet
def extract_employment(sections: list[Section]) -> list[EmploymentRecord]:
records = []
for block in find_experience(sections):
employer, e_conf = ner.employer(block)
title, t_conf = ner.title(block)
start, end, d_conf = dates.parse(block)
records.append(EmploymentRecord(
employer=employer,
title=title,
start=start,
end=end,
confidence=min(e_conf, t_conf, d_conf),
needs_review=min(e_conf, t_conf, d_conf) < 0.75,
))
return recordsHow it ships
- Containerized API + worker fleet with horizontal scaling for batch spikes.
- PostgreSQL for job state and extracted records; object storage for source files.
- Queue-backed processing with retries and dead-letter handling.
Security
- — PII-aware storage with encryption at rest.
- — Scoped access tokens for the ingestion API.
- — Audit trail linking every extracted field to its source document.
Scalability
- — Worker pool scales independently of the request API.
- — Idempotent jobs allow safe retries and reprocessing.
- — Streaming XML serialization avoids large in-memory documents.