AI engineer — agentic systems, grounded retrieval, and the evals that keep them honest. Bangalore, India
I build LLM systems that survive contact with the real world: multi-agent graphs that pause for human approval, retrieval that cites a page number and refuses when the answer isn't in the corpus, and evaluation harnesses that gate CI so a regression fails the build instead of the user.
A rule I hold myself to — every project runs offline with zero API keys. Deterministic mock models, replayed search and LLM fixtures, seeded sample data. Clone it, run one command, watch the entire loop execute. Add a key and it switches to live providers with no code changes.
| Project | What it is | What it demonstrates |
|---|---|---|
| Cerebro | A deep-research agent on LangGraph: plan → research → synthesize → self-critique → cited report | Supervisor orchestration with a nested research_team subgraph fanning out via Send; three real interrupt() / Command(resume=…) HITL gates with editable state; time-travel over checkpoints, including forking a new branch from any past step |
| Enterprise Knowledge Assistant | Production-shaped RAG over internal company documents | Hybrid retrieval — embeddings + BM25 fused with Reciprocal Rank Fusion, then cross-encoder re-ranking; page-bounded chunking so every citation maps to a real page; a grounding gate that refuses instead of hallucinating |
| Anthrasync | Four document-automation workflows — invoices, PO matching, résumé screening, support triage — on one shared pipeline | The LLM extracts; unit-tested Python decides. Schema-constrained Gemini output, a deterministic PO match engine with ± tolerance, idempotency and dead-lettering, confidence-based routing to human review, 87 tests |
| RAG-Agent | A modular retrieval-augmented generation agent | The retrieval stack pulled apart into swappable pieces — the reference I build the bigger systems from |
| portfolio.anubhavlal.dev | My portfolio, plus a terminal-emulator version of it | Zero build step, zero framework — Supabase-backed content with local JSON fallbacks, so the site still renders when the network doesn't |
- Runnable beats impressive. No credentials, no cloud account, no "trust me, it works locally" — a deterministic offline path is a first-class feature, and it's what makes CI hermetic too.
- Evals are tests. Citation validity, grounding coverage, retrieval Hit@k / MRR / Recall@k, plus an optional LLM judge — running in CI and gating the merge, not in a notebook.
- Keep judgment out of the prompt. Models extract and summarize; tolerances, escalation rules, and thresholds live in typed Python that a test can pin down.
- One contract, end to end. Pydantic → OpenAPI → generated TypeScript, with a CI check that fails on drift. The API and the UI can't disagree about a field.
- Design for the human in the loop. Approval gates with editable state, checkpointed runs you can rewind and fork, and per-run token / cost / latency you can actually see.
| Agents & LLMs | LangGraph · LangChain · Gemini · Claude · structured output via Pydantic schemas · SSE token streaming · LangSmith tracing |
| Retrieval | pgvector (HNSW) · ChromaDB · BM25 · Reciprocal Rank Fusion · cross-encoder re-ranking · page-accurate citations |
| Backend | Python 3.12 · FastAPI (async) · Postgres / Supabase · Docker · uv · structlog |
| Frontend | Next.js (App Router) · React 19 · TypeScript (strict) · Tailwind · TanStack Query · React Flow |
| Quality | pytest · mypy strict · ruff · generated API types · eval harnesses · GitHub Actions |
Currently: open to AI / backend engineering roles — résumé · anubhavlal.15@gmail.com
Off the clock: still a Potterhead, and still convinced the Marauder's Map was the best-designed observability dashboard in fiction.


