JA
Back to Projects

Portfolio Project

What Would (S)he Say

A Generative AI chatbot with multiple "personas" including Homer Simpson, Barbie, and Jesus Christ. I built the "personas" by generating vector stores in Python with LangChain and OpenAI, then host them in Weaviate.

Aug 2025

Overview

What Would (S)he Say is a live generative AI chatbot that answers any question in the voice of a selected persona (Homer Simpson, Barbie, Jesus). Rather than relying on prompt instructions alone to imitate a voice, each persona is grounded in its own vector store built from primary source material: episode dialogue, screenplays, scripture. I generated the vector stores in Python with LangChain and OpenAI, stored them in Weaviate, wired the backend through Supabase, and vibe coded the React front end and edge functions in Lovable. It's deployed and running.

Try it Now

Problem

Getting a language model to convincingly hold a specific voice is harder than it looks. Prompt instructions alone produce a thin imitation — the model approximates a character from whatever it absorbed in training, and the result drifts toward generic within a few turns. The interesting question is whether grounding responses in the character's actual recorded language produces meaningfully better fidelity than describing that character to the model. This project was built to test that, and to see how far a modern AI-assisted stack could carry a working product end to end.

Approach

The build-time work happens in Python. For each persona, I assembled a source corpus — the full dialogue archive of The Simpsons, the Barbie screenplay, the American King James Version of the Bible — then chunked it into Document objects and batch uploaded them to a Weaviate collection to generate that persona's vector store. Source selection is the load-bearing decision here: a corpus of a character's actual recorded speech is what the retrieval layer has to work with, and no amount of prompt engineering downstream compensates for a thin one.

At runtime, selecting a persona from the dropdown instantiates a retriever against the matching vector store. When a user submits a question, the application queries that retriever by similarity match to assemble context, composes a RAG chain from the user's question, the retrieved context, and a persona-specific prompt, invokes it against OpenAI, and streams the response back to the chat window. Front end and edge functions were built in Lovable on Vite, TypeScript, React, shadcn-ui, and Tailwind, with Supabase handling backend connectivity.

Outcome

The application is live and working. Persona responses read distinctly (e.g. Homer's answers sound structurally different from Barbie's or Jesus's) not just tonally relabeled, which is the qualitative result the retrieval approach was meant to produce. Building it end to end also demonstrated how compressed the path from concept to deployed product has become: the entire front end and edge layer was prompted into existence in Lovable, leaving my actual engineering effort concentrated where it mattered, on corpus selection and the retrieval pipeline.

The honest limits track directly to source data. Persona quality is bounded by corpus depth and cleanliness, a full multi-season dialogue archive gives the retriever far more to match against than a single screenplay, and that asymmetry shows. I also built this without a formal evaluation framework, so fidelity is assessed by inspection rather than measured, which is the first thing I'd add in a next iteration. It's a demonstration of what grounded persona retrieval can do, not a production system with guardrails around it.

View the Code Repository on GitHub

Get in touch.

Available for speaking, podcasts, panels, writing collaborations, and founding PM / co-founder roles. Reach out on LinkedIn, X, GitHub, or Substack.