LLM Career Mentor
CareerGENAI
A full-stack AI career mentor that reads résumé inputs, identifies skill gaps, and turns them into a learning roadmap.
The problem
Career advice is usually generic. A student can name a target role but rarely knows which gaps matter most or what to build next.
CareerGENAI takes a résumé and a target direction and returns a skill profile, the gaps between that profile and the role, a learning roadmap, and project ideas that would close those gaps.
I built it to see how far an LLM could go as a mentor when its output is treated like data, so the app can render it, store it, and come back to it, instead of as a block of chat text.
Constraints
- The model’s answer had to be machine-readable so the frontend could draw charts and roadmap steps from it.
- A résumé is personal data, so the pipeline should keep only what the results view needs.
- The whole stack needed to start with one command on a laptop for development and demos.
My role
- Designed a microservice-based architecture and the API surface.
- Built the FastAPI backend with separate parsing and recommendation services and mentor and health routers.
- Built the Next.js frontend and the results view with Recharts.
- Integrated Gemini 2.5 Flash with structured JSON responses and set up PostgreSQL and Docker Compose.
System design
Each stage does one job and hands a typed result to the next. That keeps prompts small and lets me test or replace a stage without touching the others.
- ParseNormalize résumé text into sections the later stages can read.
- Extract skillsAsk the model for skills as structured JSON, not prose.
- Analyze gapsCompare the extracted profile with the target direction.
- Plan roadmapTurn gaps into ordered learning steps.
- Suggest projectsPropose portfolio projects that exercise the missing skills.
- Persist runStore the result in PostgreSQL under a run ID that the results endpoint reads.
Tradeoffs
Structured output instead of free text
Why Each model call returns JSON that matches a schema, so the backend can validate it and the UI can render it directly.
Cost Schemas constrain the model, and a malformed response has to be caught and handled instead of shown as-is.
Persisted runs with a run ID
Why Generation and display are decoupled. The results page can be reloaded or revisited without calling the model again.
Cost Storing runs means storing derived personal data, so retention and deletion become design questions.
What I can show
Illustrative walkthrough
The sample below uses a fictional résumé to show the shape of the output: input, skill analysis, and roadmap. It is not real model output.
Architecture
The pipeline diagram above reflects the services, routers, and storage in the codebase.
1 · Résumé input
- Candidate
- Alex Rivera (fictional)
- Target
- Junior ML engineer
B.S. Statistics · Built churn models in Python and SQL · Course projects in scikit-learn · Shared notebooks with a campus club
2 · Skill analysis
- PythonStrong
- SQLStrong
- Model evaluationWorking
- DockerGap
- Model serving / APIsGap
3 · Learning roadmap
- Package an existing model in DockerCloses the container gap with work already done.
- Serve it behind a FastAPI endpointShows the model can be used by other software.
- Add basic monitoring and a write-upTurns a notebook into a portfolio project.
What I would explore next
- Build a small labeled résumé set to measure skill-extraction accuracy instead of judging it by eye.
- Add run deletion and a retention window before any public deployment.
- Finish the AWS-ready deployment path.