AI Candidate
A chatbot designed to answer recruiters' questions about my professional background, in my voice, grounded in what I've written. I designed it, built it, and keep it running.
- Role
- Design, build, and operate. Solo.
- Shipped
- October 2025
- Rebuilt
- July 2026, from retrieval to a single prompt
- Stack
- Next.js, TypeScript, Supabase, OpenAI
Why I built it
Companies use AI to screen candidates. I wanted to turn that around: an agent that answers a recruiter's first-round questions for me, so both of us find out sooner whether a role is a fit.
I wrote up the first version in I Built an AI Version of Myself (opens in a new tab).
Version one: retrieval
The first build was a retrieval system. My content went in through an admin page, in five categories: resume, experience stories, technical projects, communication style, and skills and preferences.
- Each category had its own chunker, because a resume and a behavioral story break apart differently.
- Vector search alone returned false positives, so results were ranked on a blend: 60% semantic similarity, 25% category relevance, 15% tag match.
- A semantic cache reused responses to similar questions, avoiding another retrieval and generation pass when a suitable cached answer was available.
- Writing samples were processed twice, once for facts and once for how I phrase things. That second pass is what made it sound like me.
Version two: one prompt
When I finished version one I wasn't sure retrieval had been necessary. Everything I'd written came to about 26,000 tokens, which fits in a single prompt.
In July 2026 I built a second architecture behind a flag: the whole knowledge base goes into the prompt and retrieval is skipped. It returns the same response format as the first, so I could compare the two side by side. The single prompt won and became the default.
- Model choice came from testing. The smaller model could not hold my voice rules in a prompt that long. The next one up could, so that is what runs.
- It fails loudly. If the knowledge base ever outgrows the prompt, the system refuses to build it. It does not quietly drop content.
Keeping it honest
A chatbot that speaks for a real person to someone making a hiring decision has one job above the rest: don't make things up. I designed these guardrails to reduce invented answers and keep conversations focused on my professional background. Prompt instructions do not guarantee factual answers.
- Grounding instructions. The prompt restricts answers to the supplied background and forbids invented employers, dates, titles, tools, or metrics. When information is missing, it instructs the model to say so and point the recruiter to my LinkedIn.
- Topic boundaries. The prompt instructs the model to avoid salary numbers, decline questions about protected characteristics or topics unrelated to my work, and steer back to professional background.
- Redirecting creative requests. The prompt instructs the model to redirect requests for creative content, such as poems, back to questions about my professional background.
- It says what it is. The page states that it is an AI chatbot before the first message.
- Abuse limits. Sessions and messages are rate limited per visitor.
- Data retention. A daily job deletes conversations past the retention window.
What I learned
- Voice is most of the work. Facts are easy to load; sounding like one specific person takes samples and explicit rules.
- The simpler architecture was easier to keep honest. With everything in one prompt there is no retrieval step to return the wrong passage.
- Build the second version so it can be compared with the first. Keeping both behind a flag is what let me choose on evidence.