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.
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.
- 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
This isn't a single fixed pipeline — it's an agent that decides its own actions:
- Retrieval layer: the resume is split into chunks, embedded with
sentence-transformers(all-MiniLM-L6-v2), and stored in ChromaDB for semantic search - Tools: three functions the agent can call —
search_resume(semantic search),gap_analysis(compare JD requirements against resume evidence), andsuggest_bullet(draft a grounded resume bullet for a specific requirement) - 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 - Interface: a Streamlit app with a sidebar for the JD/resume upload and a chat interface for follow-ups
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_resumerepeatedly with fragmented single-word queries instead of callinggap_analysisonce with the full requirement list, and never converged. Fixed withtemperature=0for more consistent behavior and explicit strategy instructions in the system prompt.
Python · Streamlit · ChromaDB · sentence-transformers · Groq API · pypdf · python-docx
pip install -r requirements.txtCreate a .env file in this folder with:
GROQ_API_KEY=your_key_here
Run:
streamlit run app.py- 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