Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

Job Application Copilot

An agentic RAG assistant that compares a resume against a job description, honestly flags gaps, and drafts tailored resume bullets — built after getting tired of paywalled resume-checker tools.

The problem

While applying to internships and jobs across multiple platforms, I wasn't getting interview calls and couldn't tell what was going wrong with my resume. Several online resume-checker tools looked promising but turned out to be paywalled after a free preview. So I built my own tool that analyzes my resume against real job descriptions, using an AI agent instead of a fixed script.

What it does

  • Paste a job description, get a structured breakdown of which requirements your resume genuinely supports and which are real gaps
  • Ask follow-up questions in a chat interface — e.g. "write me a bullet for the statistics requirement" — and the agent decides which tool to use based on what you're actually asking
  • Upload any resume (PDF, DOCX, or TXT) — not hardcoded to one person's data

How it works

This isn't a single fixed pipeline — it's an agent that decides its own actions:

  1. Retrieval layer: the resume is split into chunks, embedded with sentence-transformers (all-MiniLM-L6-v2), and stored in ChromaDB for semantic search
  2. Tools: three functions the agent can call — search_resume (semantic search), gap_analysis (compare JD requirements against resume evidence), and suggest_bullet (draft a grounded resume bullet for a specific requirement)
  3. Agent loop: powered by Groq (openai/gpt-oss-120b) using tool-calling — the model reads the user's question and decides which tool(s) to call and in what order, rather than following a hardcoded if/else
  4. Interface: a Streamlit app with a sidebar for the JD/resume upload and a chat interface for follow-ups

Debugging notes (the part I'm most proud of)

Building this surfaced three real bugs worth documenting, because finding and fixing them mattered more than the first working version:

  • Hallucination in the synthesis step: the agent initially invented fabricated achievements (fake projects, fake metrics) to fill in gaps it had no real evidence for. Traced to a missing grounding instruction in the final-answer generation step — fixed by making "never invent unsupported experience" part of the core system prompt, not just one tool's instructions.
  • False-negative gap detection: a real skill (Python) was incorrectly flagged as missing. Traced to two causes: a comma-separated skills chunk that embedded poorly against natural-language queries, and a brittle hardcoded distance threshold. Fixed by rewriting the chunk as natural sentences and redesigning gap detection to let the LLM judge relevance from retrieved text, instead of trusting a single magic number.
  • Agent looping without a final answer: the agent sometimes called search_resume repeatedly with fragmented single-word queries instead of calling gap_analysis once with the full requirement list, and never converged. Fixed with temperature=0 for more consistent behavior and explicit strategy instructions in the system prompt.

Tech stack

Python · Streamlit · ChromaDB · sentence-transformers · Groq API · pypdf · python-docx

Setup

pip install -r requirements.txt

Create a .env file in this folder with:

GROQ_API_KEY=your_key_here

Run:

streamlit run app.py

Known limitations

  • Generic paragraph-based chunking for uploaded resumes is less precise than hand-labeled sections — an unusually formatted resume may produce awkward chunk boundaries
  • No automated evaluation set for gap-detection accuracy yet
  • In-memory vector store — resets each session rather than persisting across runs

About

An agentic RAG assistant that compares your resume against a job description and honestly flags gaps

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages