Problem
Cold outreach from job postings takes a template every time: copy the JD, find a matching portfolio project, write the email. Doing this manually across dozens of postings a week doesn't scale.
Approach
- 1
Built a scraping pipeline with LangChain's WebBaseLoader + regex cleaning that parses arbitrary job posting URLs.
- 2
Ran the cleaned JD through LLaMA 3.3-70B via Groq's API with a structured extraction prompt (role, skills, experience). Groq's throughput makes 70B-parameter inference feel snappy at request time.
- 3
Embedded a portfolio of 20+ (tech-stack, project-link) pairs into ChromaDB. When a JD comes in, semantic similarity picks the most relevant projects to reference.
- 4
Chained two LangChain PromptTemplates: (1) extract structured requirements, (2) generate an email that cites the matched projects — a two-step RAG pipeline.
- 5
Wrapped it all in a Streamlit UI so I paste a URL, click one button, and get the email.
Outcomes
- One-click cold-email generation from any job posting URL — deployed live on Streamlit Cloud.
- Every generated email references real portfolio work matched to the JD's requirements, not generic filler.
- Cut outreach turnaround from ~10 minutes per email to under 30 seconds.
Learnings
Groq's inference speed changes what's feasible at LLM request time — a 70B model is fine to call inline. Two-step chains (extract → generate) hallucinate less than one-shot prompts because the second call operates on structured input. ChromaDB is the right choice when you don't want to run a vector-DB service.