Karishma.
Work
02 · Agent2026

A conversational companion for Owne, my hormonal-health brand.

Owne is the hormonal-health and Ayurvedic wellness brand I started in 2023. By this year it had a product line, a point of view, and a recurring customer question that no FAQ page answers well: "is this normal?" So I built Ask Owne — a RAG-backed AI guide that lives directly in the storefront — to answer it with something more specific than a generic wellness chatbot would give.

The architecture is straightforward on paper: a Vercel serverless function, OpenAI for embeddings and generation, Qdrant as the vector store. Customer questions get embedded, matched against a knowledge base split across a hormone-education reference and a ritual-and-recipe library, and the closest matches get assembled into a structured prompt. The model replies in OpenAI's Structured Outputs format — a strict JSON schema with named fields for the likely hormonal pattern, a food suggestion, a movement suggestion, a product ritual, and a safety note — rather than a single freeform string. That schema constraint did more for response quality than any amount of prompt tweaking. It's much easier to control where a product mention lands when "where the product goes" is a field, not a hope.

Self-harm and a missed period with cramping are both urgent. They are not the same kind of urgent, and the system has to know that.

The riskiest part of any health-adjacent agent is escalation logic, so that's where I spent the most care. A deterministic moderation layer checks every message for self-harm language before anything reaches the model; if it fires, the response is forced into a support-redirect path, full stop, no model discretion. Physical red-flag symptoms — heavy bleeding, fainting, a missed period with a chance of pregnancy — get a different path: full guidance, led by a prominent safety note urging medical care. Early versions conflated the two categories, which meant a question about dizziness got the same crisis-redirect treatment as a question about hopelessness. Separating them was a short prompt fix with an outsized effect on whether the agent actually felt trustworthy.

The bug that took longest to diagnose wasn't a bug in the code — it was a bug in how retrieval ranks information. Owne's actual point of difference is a dosha-and-agni framework for thinking about hormonal symptoms, but it's written abstractly, and vector search ranks by literal similarity to whatever the user typed. A message about bloating matches chunks about bloating, not the philosophical section explaining why bloating matters in Ayurvedic terms. The result was technically correct, brand-empty answers. The fix was to stop trusting ranking for that one section: I built a deterministic extractor that pulls the core Ayurveda framework out of the knowledge base by heading and injects it into every prompt, regardless of what retrieval surfaces.

If the fact that makes your product yours isn't guaranteed to show up, it isn't really part of your product.

Two smaller fixes mattered more than they should have. The schema originally had two separate fields that could each name the hero product, so it showed up twice in one reply — once near the top, like an opening pitch. Collapsing that to a single field, capped at one mention and moved to the end of the response, fixed it immediately. Separately, the model would occasionally name a specific recipe by title without saying how to make it, traced to a name-only index table in the knowledge base getting embedded as its own retrievable chunk, disconnected from the chunk holding the real method. Excluding that index from embedding, plus a hard rule — never name a recipe unless the method comes with it — closed the gap.

The last piece was making it real for a non-technical merchant workflow — mine. The chat lives in a Shopify theme section with merchant-editable settings (API endpoint, greeting copy, example prompts), because most days I'm editing through Shopify's browser-based code editor, not a terminal. It's deployed on Vercel and live on the storefront now. There's no clean before/after number to point to yet — it just shipped. What I can point to is the architecture decisions that made it worth shipping: a schema that controls itself, a safety layer that doesn't guess, and a brand voice that can't quietly disappear under retrieval ranking.