Inspiration
Research experience matters a lot for undergrads. But finding it at UMBC is hard. Opportunities are spread across dozens of department pages, lab websites, and faculty profiles. Many students don't know which professors take undergrads or even where to start looking. Cold emailing a professor is intimidating when you're not sure your background fits. We wanted one place where a student could see what exists, find what fits them, and reach out with confidence.
What it does
Retrieve is a website for finding research opportunities at UMBC.
- Browse and filter. Students can explore 138 research opportunities across 12 departments. They can filter by research area tags like machine learning, neuroscience, or evolutionary biology.
- Three kinds of opportunities. Each listing is marked as a research lab, independent research with a faculty member, or a research program. The site speaks about each one accurately. It never calls a faculty member's independent research a "lab."
- Resume matching. Students upload a PDF resume and state their interests. Retrieve returns every opportunity that fits, with a short reason for each match. Each reason points to a specific item on the resume when one fits.
- Email drafting. For any opportunity, Retrieve drafts an outreach email addressed to the right person. It uses the student's resume when one is uploaded and still works without one. Drafts leave out phone numbers and other personal contact details.
- AI chat bot.** Students can ask questions about the listed opportunities. The chat answers only from our data.
How we built it
Backend. Python and Flask serve the pages and a small JSON API.
- Frontend. Jinja templates, Bootstrap, and plain JavaScript.
- Data. A single
labs.jsonfile. Each record has a name, lead, department, research areas, description, contact email, and website. - AI. We used the Anthropic API. Claude Sonnet handles resume matching and email drafting at low effort to keep cost down. Claude Haiku runs the chat. pypdf extracts text from uploaded resumes.
- Guardrails. We added checks in code on top of the prompts. They remove hedged or invented match reasons and fix email greetings to use the exact contact name. They also strip contact info from drafts. A test script checks the data for missing fields, duplicate people, and shared websites. It also flags emails that make claims about the student that the resume does not support. ## Challenges we ran into Data collection was by far our biggest challenge. There is no single list of research opportunities at UMBC. We had to search through multiple department pages, lab sites, and faculty directories. Many lab websites were broken, archived, or pointed to pages that no longer existed. Others had vague or missing descriptions and no clear contact.
We also had to clean up what we collected.
- Department directories labeled many faculty as "Research Group." We initially took that as the lab name. We replaced these with real lab names wherever we could find the lab's own page.
- Some records were duplicates of the same person listed twice.
- Some were general department overviews rather than real opportunities, so we removed them.
On the AI side, early resume matches sometimes stretched the truth. Matching reasoning might describe a student's project with words the resume never used. We tightened the prompts and added code checks so that matches stay grounded in what the student actually wrote.
Accomplishments that we're proud of
- A working end-to-end flow. A student can upload a resume, see matched opportunities with specific reasons, and get a ready-to-edit email in a few clicks.
- A hand-verified dataset of 100+ opportunities, built from scratch within 24 hours.
- Resume match reasons and emails that point to real resume items instead of generic praise.
What we learned
- Data is the hardest part of a project like this. The AI features only work as well as the listings behind them.
- Prompts alone don't guarantee accurate output. Simple code checks after the model responds caught problems the prompts missed.
- Choosing the right model for each task matters. A cheaper model worked well for the chat bot but resume matching and emails needed a stronger one.
What's next for Retrieve
- Faculty accounts. Professors could post and update open positions directly. That would keep listings current and show who is actually taking students.
- More opportunities. Add real programs like REUs and summer research programs, and expand to more departments.
- Link checking. Automatically flag broken websites and outdated listings.
- Public deployment. Put Retrieve online so any UMBC student can use it. -Network Scaling. Expand Retrieve beyond just UMBC research opportunities.


Log in or sign up for Devpost to join the conversation.