ResearchBridge

RAG-powered semantic search matching pre-meds to research and volunteer opportunities.

ResearchBridge

ResearchBridge matches pre-med students to research, volunteer, and clinical opportunities by meaning rather than keywords. It embeds a student’s background and each opportunity, retrieves the closest matches, and writes a short explanation of why each one fits. When nothing is a good match, it says so instead of forcing a weak one.

The stack is a FastAPI backend with PostgreSQL and pgvector for vector search, embeddings for the matching, and an ingestion pipeline that pulls and normalizes opportunity listings. A React/TypeScript frontend drives the full flow end to end: profile creation, ranked matches, fit explanations, cold emails, and the readiness report. Most of the real work turned out to be in the data layer, where sources are messy and extractions fail quietly.

The part I cared most about is trust. A confident but wrong match is worse than no match, so every explanation is grounded in the retrieved opportunity’s own text, and the system refuses when the retrieval support is weak rather than inventing a reason to justify a match.

To check whether any of that actually works, I built an evaluation layer that measures retrieval hit rate, refusal accuracy, and faithfulness (whether an explanation stays true to its source). The evaluation caught the initial cosine similarity threshold of 0.40 rejecting genuine matches. Calibrating it to 0.32 raised refusal accuracy from 62% to 89%. Distilling opportunity text to key facts looked promising but worsened the separation between matches and non-matches, so I switched back to the original chunking and kept the negative result as evidence. Writing the eval also surfaced something I did not expect: the faithfulness score was rating answers as faithful when they were grounded in the wrong source. Faithful and true were two different things, and the eval had to measure them separately.

Separate from the matching pipeline, a tool-calling readiness agent compares a student’s logged research and volunteer hours against medical school requirements and produces a structured gap report. Every number — hours logged, deficit, severity — is computed in code. Only the recommendation prose is authored by the LLM.

Status: capstone complete. Full source available on GitLab.