Most RAG systems fail on precision, not recall. So I build the evaluation harness
first and the architecture second. On a production search service for a US state
government agency that took answered-accuracy from 40% to 88% — and cut
confidently-wrong answers from 46 to 2.
Lead AI Engineer Unnanu · Austin, TX (remote)
Answered accuracy40%→88%
Wrong answers46→2
Abstain recall18%→97%
Gold set85 queries
01 Now
Lead AI Engineer at Unnanu, building search that abstains instead of guessing.
I joined in January 2025 as an intern and now lead the AI work. Day to day that means
retrieval quality, the evaluation apparatus that proves it, self-hosted LLM serving, and
the multi-cloud machinery that lets a customer deploy the whole thing into their own
account without an engineer on the call.
The through-line is refusing to ship a number I can't defend. A search system
that answers 90% of questions with 40% accuracy is worse than one that answers half and
is honest about the rest — especially in government work, where a confident wrong answer
is a compliance problem.
02 Selected work
Four things worth reading about.
2026
Confidence-gated retrieval for a government search service
Rebuilt retrieval as a confidence-ordered cascade where the model selects catalog rows rather than free-writing SQL, and abstains below both a confidence floor and an absolute lexical floor. Five measured rounds: 9% → 17% → 38% → 77% → 88%.
Curated gold set, p@1/p@3, facet-F1 and abstain-recall scoring, pooled candidates, LLM adjudication, frozen corpus manifests. Then compared four retrieval strategies on one corpus to find out which part of the pipeline was actually earning its keep — see Figure 1.
A walkthrough service plus a Terraform-driven worker that stands up a customer's search project inside their own GCP, AWS or Azure account, over whichever of SQL Server, PostgreSQL or MySQL they already run. Dry-run mode rehearses a deployment before touching real infrastructure.
Five-modality ingestion, and LLM serving on Apple Silicon
Document, audio, image, video and web pipelines on RabbitMQ with dead-letter recovery and worker supervision — a 100-file batch went from ~5 hours to 45–90 minutes. Served Qwen models across a 5-node exo/MLX cluster behind an OpenAI-compatible endpoint, with a per-call spend ledger.
Four retrieval strategies, one corpus, one gold set.
Same database, same queries, one build — only the retrieval layer differs. The bar is
accuracy on answers the system chose to commit to; the right column is how many
of those commitments were wrong. The gate is simple: ship nothing that commits a
confident falsehood.
Answered accuracy vs. wrong commitmentsn = 85 gold queries
v1rule-based
3.3%
29 wrong · gate FAIL
v2weighted catalog
93.3%
2 wrong · gate PASS
v3LLM-authored SQL
32.2%
40 wrong · gate FAIL
v4vector / RAG
46.3%
36 wrong · gate FAIL
The catch: vector was the best retriever in the set — it could reach
97% of the corpus, where the hand-curated catalog reached only 35%.
Curation buys precision and caps recall; embeddings buy recall and drift into confident
error. Recall and precision were living in different components, so I stopped picking a
lane and composed them: retrieve wide with vectors, then make the evidence clear a
bar before committing — otherwise abstain and say so.
04 Negative results
Things I tried that made it worse, and reverted.
I keep these because the reverts are what stop a team re-litigating the same idea in six
months — and because an engineer who only reports wins hasn't measured anything.
Ranked all sections through a catalog prefilter before retrieval. Common tokens drowned the distinctive ones.
recall 0.695 → 0.431
Injected generated questions into catalog cards, expecting better query matching. Questions turned out to be a query-side asset, not an index-side one.
recall 0.705 → 0.537
Parallelised translation across threads instead of one batched call.
5× slower
Swept the BM25 b parameter looking for better length normalisation.
monotonically worse
Ran BGE-M3 embeddings and a Qdrant vector store in the live ingest and search path. The embedding cost bought reachability the system couldn't safely commit on, so it moved out of the commit path.
removed after measuring
05 Stack
What I reach for.
Retrieval & LLM
RAG, hybrid search, BM25
Cross-encoder reranking
BGE-M3, text-embedding-3-large
Qdrant, Chroma, FAISS
Eval harnesses — p@k, nDCG, abstention
LangChain, LangGraph
Serving & ops
exo, MLX, Ollama
LoRA fine-tuning
Groq, Azure OpenAI, Gemini
Whisper, pyannote
Spend & latency observability
Request-level tracing
Backend
Python, FastAPI
C#, ASP.NET Core (.NET 8/10)
EF Core
RabbitMQ
Azure SQL, PostgreSQL, MySQL
Redis, SignalR
Frontend
TypeScript
React 19
Next.js 16
Tailwind
Chrome extensions (MV3)
Slack Bolt, OAuth 2.0
Cloud & delivery
Terraform
GCP — Cloud Run, Artifact Registry
Azure — App Service, Key Vault, ACR
AWS
Docker, multi-stage builds
Azure DevOps, GitHub Actions
Practice
Gold-set construction
Ablation studies
Managed identity, OIDC deploys
xUnit, Vitest, Playwright
WCAG 2.1 AA / Section 508
ADRs and decision logs
06 Contact
Open to new roles
AI/ML engineering, AI platform, search & relevance, forward-deployed.
Based in India and happy to relocate — customer travel is fine too. If you're working on
retrieval quality, evaluation infrastructure, or getting AI systems to run inside someone
else's cloud, I'd like to hear about it.