Ask Jayraj: AI Resume Assistant
Ask anything about my experience. Answers come only from my verified profile, retrieved with Oracle AI Vector Search – never guessed.
OVERVIEW
A public AI assistant that answers recruiters' questions about my experience, skills and availability. Built end to end in Oracle APEX and PL/SQL on Oracle AI Database 26ai, using the Gemini API for language and embeddings. Runs at zero cost on apex.oracle.com's free tier.
THE PROBLEM
Recruiters skim a resume in seconds and often have one specific question ("Has he led a team?", "What's his notice period?"). A generic AI chatbot would invent answers; this one must only use verified facts.
HOW IT WORKS
- AskThe visitor asks a question in any wording, with typos or in another language.
- RewriteGemini cleans the question (fixes spelling, expands abbreviations, translates); meaningless input is detected and the visitor is asked to rephrase.
- EmbedThe question becomes a 768-dimension vector (Gemini embedding model).
- Vector searchOracle AI Database 26ai finds the closest profile chunks by cosine distance (top 8, with a relevance cut-off) in a native VECTOR column.
- Grounded answerGemini writes the reply using only those chunks; if they don't contain the answer, the assistant says it doesn't know and points to my email.
- LoggingEvery question, rewritten query, chunks used, response time and feedback is stored.
Questions about availability, notice period or salary are detected after the rewrite step and answered with a fixed redirect to email/LinkedIn, so no search or AI call is made.
KNOWLEDGE BASE · SYNCED AUTOMATICALLY FROM THIS WEBSITE
My website is the single source of truth. It exposes my CV at a private endpoint (/api/profile, protected by an API key) as one self-contained fact per line, plus a SHA-256 fingerprint header. In Oracle, a scheduled PL/SQL job runs daily:
- Fetches the profile using an APEX Web Credential (the key is never in code)
- Validates it: HTTP 200, plain-text content, valid fingerprint, minimum line count, and content rules (no phone numbers, no restricted topics); a bad fetch never touches the knowledge base
- Compares the fingerprint with the last sync; if unchanged, it stops with no AI calls (about 0.2 seconds)
- If changed, it replaces the CV document and re-embeds it (34 facts in about 25 seconds) in a single transaction, so visitors never see a half-built knowledge base and a failure rolls back automatically
- Logs every run as UNCHANGED, UPDATED or FAILED with the reason
When I update this website, the assistant updates itself, with no manual data entry. A small manual FAQ holds only redirects (availability, notice period and salary go to email/LinkedIn).
GUARDRAILS AND ENGINEERING
- Answers only from retrieved sources; an explicit "I don't know" instead of guessing
- Prompt-injection protection in the system rules
- API key stored encrypted in an APEX Web Credential, never in code
- Retry with backoff on 429/500/503, plus an automatic fallback model
- Rate limiting in PL/SQL: per-visitor cooldown, per-session and site-wide daily caps, checked before any API call
- Output rendered as plain text (XSS-safe); JSON built with JSON_OBJECT_T
- Autonomous-transaction logging; live stats and thumbs up/down feedback on every answer
- Daily automated knowledge-base sync with change detection (SHA-256) and content validation
- Transactional rebuild with automatic rollback; every sync run logged
- Source labels taken from each fact (e.g. "Experience: Medical Guardian", "Technical Skills")
- Availability, notice-period and salary questions redirected in code, never answered by the AI
- Answers in the visitor's language
INTERESTING PROBLEMS I SOLVED
“Messy questions missed the right facts”
→ Added a query-rewrite step before the vector search.
“Log rows looked missing”
→ On Oracle RAC, identity values are not in time order; sorted by timestamp instead.
“In-database embedding model not allowed on the free tier”
→ Generated embeddings via Gemini, kept storage and similarity search inside Oracle.
“Keeping the assistant in sync with my CV”
→ Replaced hand-maintained knowledge-base tables with a daily job that pulls from my website, detects changes by fingerprint and only re-embeds when something changed.
“Background job couldn't read Web Credentials”
→ A scheduler job runs outside APEX, so it creates an APEX session for the app before syncing and removes it afterwards.
“Free-tier model overloads”
→ Retry with backoff, then a lighter primary model and a fallback; response time dropped from about 20 seconds to a few seconds.
TRY IT
Loads the assistant from Oracle APEX, right here on the page.
Not loading? Open the assistant in a new tab
TECH STACK
← Back to all projectsLet's talk.
Work, photography collaborations, or just hello.