RYAN ZERNACH

Full-Stack AI Systems Engineer

Ryan_Zernach_2025_Senior_AI_Systems_Engineer_Remote_United_States

🍷 CellarChat™ RAG Agent for 1M+ Users

I built CellarChat™, an AI wine assistant for CellarTracker's 1M+ member platform, with RAG, agents, OpenAPI tools, and LLM evals across Python, TypeScript, React Native, Redis, and PGVector. The point was not to put ChatGPT next to a wine list. It was to make the product more useful: grounded answers, real actions, and an internal React Native evaluations dashboard where product and leadership could compare versions, catch regressions, and gate releases with evidence.

Related Links
CellarTracker Website
CellarChat Feature
Apple App Store
Google Play Store
🍷 CellarChat™ RAG Agent for 1M+ Users
A new cross-platform mobile app for a 25+ year-old online wine community with 1M+ members.

CellarChat in motion

CellarChat carries conversational context through multi-step tool calls without losing the product feel. The animation also nods to the Tesseract-powered computer-vision and OCR pipelines that keep label parsing tied to real wine data.

CellarChat in motion
Conversational context, workflow orchestration, and product-aware responses in motion.

The work behind useful answers

The hard part was making an assistant useful, not merely fluent. Members needed personal recommendations, grounded in collection state and tasting language, that led to real actions. Early context windows were much smaller than they are now, so retrieval and orchestration had to earn their place. And because the system changed week to week, I needed proof—not anecdote—that it was improving. The evaluations dashboard made that proof visible, repeatable, and usable in release decisions.

  • Context windows: with a practical ceiling around 150k tokens, embeddings and retrieval compressed and prioritized the right context, reducing cost and fitting critical details into one request.
  • Release evidence: I connected CI/CD evals to the React Native quality-ops dashboard I owned end to end, using trend lines for evidence-based go/no-go calls.
  • Deterministic math: bottle counts and inventory arithmetic used math-capable tools, not non-deterministic LLM-only calculations.
  • Disambiguation: “Mendocino” can mean a region, subregion, or appellation. I generated thousands of synthetic conversations and fine-tuned an OpenAI model with Azure AI Foundry LoRA so the assistant would clarify rather than assume.

Evaluations made quality visible

I owned evaluations and observability end to end: the golden-set methodology, CI/CD eval pipeline, and React Native dashboard product teams used each week. They answered one leadership question with data: did a change improve the product or regress it? Canonical prompts ran against representative cellar profiles rather than synthetic averages. I split the work into quantitative and qualitative tracks, then made trend lines, inflection points, and regressions visible before broad rollout.

  • Golden set: stable, high-value prompts paired with representative users across cellar sizes, data quality patterns, and usage behaviors.
  • Quantitative track: hard-coded SQL against user-profile and cellar tables produced deterministic pass/fail signals for bottle counts, holdings by region or variety, and other inventory facts.
  • Qualitative track: LLM-as-judge rubrics scored recommendation and interpretation answers for relevance, grounding, clarity, and actionability.
  • Dashboard: I designed and shipped one React Native surface for agentic AI/ML quality operations, run history, version comparisons, pass rates, judge scores, and regression alerts.
  • Release gating: eval runs fed the pipeline and dashboard trends informed reviews, so prompt, retrieval, tool, and model changes shipped only when both tracks moved acceptably.

Evaluation Dashboard

I designed and built this React Native dashboard as CellarChat's operational home for quality. Product and leadership used it to run agentic AI/ML evaluations, compare builds, inspect regressions, and justify release decisions. SQL-backed checks and LLM-as-judge scores sit together, so a weekly change has to show its impact on member-facing behavior.

The React Native quality-ops dashboard I designed and built for CellarChat releases.

My role: system, not prompt

From August 2023 to July 2025, I helped turn CellarChat from concept into a production AI surface. I led core RAG architecture, agentic workflows, OpenAPI tool integration, LLM observability, and the golden-set methodology. I built CI/CD-connected evaluations and a React Native dashboard that tracked quantitative and qualitative quality for product and executive stakeholders. CellarTracker members track inventory, choose bottles, monitor drinking windows, and learn from community tasting notes. That sounds simple until structured records—bottle counts, vintages, storage locations, dates—meet unstructured notes, preferences, and prompts. A useful answer needs both, in product context, with a clear next action. I contributed to the Python orchestration and retrieval backend, then integrated the system into TypeScript web experiences and React Native mobile surfaces. At this scale, “ship and hope” was never the plan.

  • RAG architecture and retrieval quality tuning for structured and unstructured wine data
  • Agentic workflows with OpenAPI tool-calling and multi-step orchestration paths
  • End-to-end ownership of LLM evals, observability, and the React Native evaluations dashboard for release gating
  • Golden-set design, SQL-backed quantitative scoring, LLM-as-judge rubrics, and CI/CD trend visualization
  • Python backend delivery plus TypeScript and React Native product integration
🍷 CellarChat™ RAG Agent for 1M+ Users
I also shipped mobile barcode scanning and bottle-label capture workflows powered by Tesseract OCR/CV to ground bottle data.

Retrieval: put the right cellar in view

RAG grounded answers in member-specific context and trusted wine data. The retrieval path combined personal cellar information with broader tasting intelligence, so recommendation and exploration answers had context instead of guesses. It handled direct lookups and fuzzy intent across variety, pairing, vintage, readiness, region, and price. The engineering bet was simple: improve retrieval quality and relevance before changing model behavior. It paid off more often than prompt tweaks, and every retrieval change appeared in the evaluations dashboard before it shipped.

Tools: answers that can act

I architected OpenAPI-based tool-calling workflows so the model could take reliable, product-aware actions instead of only generating text. Tools gave the assistant controlled access to collection and product capabilities, improving usefulness and reducing hallucinated behavior. Fine-tuning and orchestration improved tool selection and multi-step requests. The target was predictable real-world behavior: choose the right path, gather the right context, and leave the member with a clear next move. The same dashboard pipeline surfaced regressions in bottle-count math and multi-step flows alongside RAG quality.

Integration: where members already work

I connected AI workflows to real web and mobile surfaces. CellarChat lived in the core CellarTracker experience, including the collections flow where members decide what to drink and manage inventory. I worked in Python on backend AI services, TypeScript on frontend integration, and React Native on cohesive mobile experiences. The evaluations dashboard was a first-class internal product, not a throwaway admin page. I also contributed to subscription and payment improvements; successful AI products still have to fit the wider product, platform, and business.

Impact

CellarChat brought AI assistance into CellarTracker's core wine experience for 1M+ members. It connected recommendations and collection intelligence to daily decisions, not novelty chat. The evaluations dashboard gave stakeholders visible trends, comparable runs, and a repeatable release bar instead of “it feels better” reviews. Full-stack integration put those capabilities directly into web and mobile product surfaces, while the work also supported subscription and payment improvements.

  • Shipped production AI assistance for CellarTracker's 1M+ member platform
  • Designed and built the React Native evaluations dashboard for weekly quality reviews, regression detection, and CI/CD-informed release gating
  • Connected AI workflows to React Native mobile surfaces, where members could thumbs up, thumbs down, or leave custom response feedback
  • Operationalized golden-set evals with quantitative SQL checks and qualitative LLM-as-judge scoring through the dashboard—not one-off scripts
  • Contributed to growth work: app rating improvements, Apple Pay subscriptions, and recurring revenue initiatives
🍷 CellarChat™ RAG Agent for 1M+ Users
CellarTracker’s App Store and Google Play listings, each showing a 4.9-star rating.

Lessons Learned

CellarChat made one lesson unavoidable: embeddings are the backbone of production RAG. They shape the context a model sees, the failures an eval exposes, and whether a weekly change improves a member-facing answer. The dashboard made those lessons legible to the organization: each one below could be traced to a chart, not debated in a meeting. These are production patterns from a 1M+ member wine platform, not notebook theory.

  • Embeddings are the interface between product data and the model. If retrieval is wrong, prompt engineering cannot rescue the answer.
  • Wine data made one embedding space do double duty: structured facts such as bottle counts and locations alongside tasting notes, preferences, and free-form questions.
  • With context windows capped around 150k tokens, embeddings compressed a cellar into one useful request instead of a costly wall of noise.
  • Embedding quality starts with the data model. “Mendocino” can mean a region, subregion, or appellation; bad vectors fetch the wrong document and invite a confident wrong answer.
  • Chunk boundaries matter as much as the embedding model. Poorly splitting tasting notes, inventory rows, and help articles produces vectors that look close in cosine distance but fail in product context.
  • Chunk metadata—member ID, cellar scope, vintage, storage location, and content type—lets retrieval filter before ranking. That is cheaper and more reliable than semantics alone.
  • Production retrieval is hybrid: vector similarity, structured lookups, and hard filters keep inventory math and recommendations from competing in one pile of text.
  • Re-embedding is a release event. A model, dimension, or chunking change needs a backfill plan or it silently changes the answers members receive.
  • Stale embeddings are a quiet regression. New bottles, edited notes, and deleted holdings matter only when the index refresh keeps pace with member activity.
  • Duplicate and near-duplicate chunks inflate recall and muddy ranking. Canonical sources—one cellar row, one summary chunk—improved precision more than changing embedding providers.
  • Embed the task, not only the question. “What should I drink tonight?” and “How many bottles of Barolo do I have in Seattle?” need different retrieval profiles despite similar language.
  • Negative retrieval signals matter: excluding other members’ cellars, outdated vintages, and generic wine filler reduces hallucination pressure as much as finding the right passage.
  • Grounding checks should lead back to chunks, not vibes. I could defend a release decision only when a failure mapped to a wrong chunk, missing metadata filter, or bad rank.
  • Embedding choices set token cost and latency. Strong retrieval with smaller, curated context beat large raw dumps on quality per inference dollar.
  • Fine-tuning and LoRA complement, not replace, embeddings. Disambiguation training helped Mendocino-style edge cases, while retrieval still put the right cellar facts in context each turn.
  • SQL-backed golden answers exposed embedding gaps quickly: a failed quantitative eval was often the wrong cellar slice vectorized, not faulty LLM reasoning.
  • Qualitative evals depend on embeddings too. When retrieval mixed generic wine advice with member inventory, LLM-as-judge scores for relevance and grounding fell with it.
  • RAG observability means logging embedding queries, top-k results, chunk IDs, and scores in an evaluations dashboard the team actually uses. Without that trail, model failures and vector failures blur together.
  • Treat the embedding index as a product surface: version it, diff it in CI, and gate releases when retrieval metrics move. Members experience retrieval as the product.
  • The durable lesson: embeddings are not preprocessing in production RAG; they are the system. Prompts and agents orchestrate, but vectors decide what truth the model can see.

Closing

CellarChat™ is the kind of AI engineering I enjoy most: turning an ambiguous product problem into a reliable, evaluated LLM system that stakeholders can trust—well beyond a demo that only works on Tuesday.

CellarChat support documentation