I take AI systems from prototype to production: grounded RAG, multi-agent systems, and the evaluation and guardrails that make them safe to ship. Safety lives in code, not prompts. Every claim carries a number.
🎓 Master of Data Science, UBC · ☁️ AWS & Databricks certified · 📍 Open across Canada and the US
I work where “the model works” becomes “the system is ready to ship.”
Nine systems, end to end. Every card reads the same way: what it does → the result → how it works → the stack. Browse all nine →
|
Stops a code change from quietly breaking your AI. ✅ 10 / 10 planted bugs caught · $0 to run Records the agent once, replays it offline with no API keys, and fails the build before a bad change merges.
|
Finds the cheapest mix of AI models that still gets the job right. ✅ 3.6× cheaper at the same quality Splits an agent into planner, doer and checker, then scores all 15 combinations on the same 8,100 graded runs.
|
A company assistant that answers with sources, or admits it doesn't know. ✅ 85.9% routing · 100% of hard cases escalated One orchestrator picks a specialist across documents, governed metrics and a knowledge graph, then checks every citation.
|
|
Turns raw social conversation into customer types you can actually prove. ✅ 4 personas + 11 sub-types, each statistically validated An LLM tags behavioural signals at scale, three clustering algorithms agree on the groups, and significance tests confirm each one is real.
|
Reads sales calls and decides which misrouted lead earns a refund. ✅ Precision 43% → 89% on the same model The LLM only extracts facts; plain code makes the decision, so a bad guess shows up as a visible error instead of a silent one.
|
Ask a data question in plain English, get the chart and the answer. ✅ 91% routed correctly · 7 specialist agents An orchestrator hands the question to the right specialist, which runs its code in a sandbox behind 40+ security checks.
|
|
Notices when a model goes stale and retrains it on its own. ✅ 5-stage closed loop · zero manual scheduling A drift metric watches live traffic and triggers retraining automatically, but a human still approves the new model.
|
Search that understands what you meant, not just what you typed. ✅ +22% better results, A/B tested Keyword and meaning-based search run together and their rankings are fused, then a guarded assistant answers from the evidence only.
|
An AI analyst that asks permission before it touches your database. ✅ 1M+ rows queried · zero writes allowed Three approval gates before anything runs, and read-only SQL enforced at the syntax-tree level rather than by a prompt.
|
| 🛡️ Guarded Safety rules and approval gates live in code, not prompts. |
📏 Measured Models chosen on quality, latency, cost and failure analysis. |
💸 Cost-Aware Rules and small models handle the easy work first. |
🤝 Human-Approved Retraining is automatic. Promotion to production is not. |
| 🧵 RAG & Retrieval |
|
| 🤖 Agents & Safety |
|
| 🚀 MLOps & LLMOps |
|
| 🧠 ML & NLP |
|
| 🗄️ Data & Cloud |
|
| 📊 Statistics |
|
Mountains, movement, and a bit of competition.
![]() ⛷️ Skiing |
![]() 🎾 Tennis |
![]() 🏃 Running |
![]() 🐎 Polo |
![]() 🥾 Hiking |
![]() 🏋️ Strength |
def ship(problem):
return build(problem,
grounded=True, # cite the evidence, or abstain
guarded=True, # safety in code, not in the prompt
measured=True, # a number behind every claim
cost_aware=True, # the cheapest model that still passes
human_approved=True, # a person promotes to production
)Machine Learning Engineer · Data Scientist · Master of Data Science, UBC








