AI/ML Engineer · Building at the intersection of graph neural networks, LLM agents, and retrieval systems
📍 Currently open to AI/ML Engineer roles — Mumbai / remote
| Demo | What you'll see |
|---|---|
| QueryPilot | Natural-language → SQL running live on real data, behind a read-only SQLite authorizer |
| Agent Eval Harness | A real detected regression between two agent versions, scored on trajectories |
| RailGraph | 600-station rail network — PageRank, betweenness, k-shortest-paths, resilience sim |
| IPO GMP Predictor | XGBoost pipeline with time-series CV and calibrated confidence bands (synthetic data) |
| LLM Regression Detector | CI-style prompt-regression dashboard: v1 fails at 0.82, v2 passes at 0.93 |
| SEBI Enforcement Explorer | Real public SEBI orders, classified and analysed — search, network, timeline |
Hosted free on Streamlit Community Cloud. Apps sleep when idle — the first load may take ~30s to wake.
GNN-based root cause analysis for network topologies — two working prototypes:
- Transductive — localises root causes within a single fixed topology.
- Inductive — trained across multiple topologies, generalises to a previously unseen topology at inference, so a new network doesn't need a retrained model.
(Prototypes; not yet published — happy to walk through the approach.)
LLM agents & multi-agent systems
| Project | What it does | Stack |
|---|---|---|
| 🤖 Autonomous Data Scientist | Give it a CSV and "predict churn" — it cleans the data, engineers features, tunes the winning model, evaluates it honestly, and ships a model card and slide deck. Generated code runs in a locked-down sandbox | LangGraph · OpenAI · FastAPI · Redis |
| ⚖️ Research + Debate Agent | Agents research in parallel, argue both sides, audit their own sources for bias, and arbitrate into a report where every claim carries a citation and a confidence score | LangGraph · OpenAI · ChromaDB · FastAPI |
| 🏦 Credit Memo Agent | Drafts a business loan credit memo: checklist gaps, financials extracted with a source page and row label on every figure, ratios computed in Python rather than by the model. A balance sheet that doesn't balance is a finding, not a silent correction. Runs fully offline on Ollama — the cloud path is opt-in and can't activate by accident | LangGraph · Ollama · pdfplumber · FastAPI |
| 🕸️ Text-to-Graph Agent | Natural language → executed Cypher over a knowledge graph. A wrong relationship direction doesn't throw, it returns an empty set that reads as "no data" — so entities resolve to node identities first, hops are planned, and a validator binds parameters and injects a LIMIT before anything runs | LangGraph · Neo4j · ChromaDB · FastAPI |
| 🕵️ corpgraph-rag | GraphRAG over a Neo4j graph of Indian corporate entities — directors, auditors, promoters, SEBI orders, mutual funds. English question → LLM query plan → few-shot Cypher generation → traversal → cited answer. The generator's own write-clause check is just a fast-fail; the real guarantee is a regex-enforced read-only guard on the Neo4j client itself, so a prompt-injected write fails before it ever reaches the database. Ships an optional GATv2 layer that scores likely undisclosed relationships | LangGraph · Neo4j · PyTorch Geometric · Streamlit |
| 📰 FinAgent | A junior-analyst team for equity research: orchestrator routes Indian vs. global filings (SEC EDGAR / BSE), agents pull live yfinance metrics, run local sentiment, and synthesize a cited report. Every paid dependency (Claude, Tavily) degrades to a free equivalent, so the full pipeline runs for $0 — verified end-to-end with real filings, real news, real metrics, zero errors | LangGraph · Claude · ChromaDB · FastAPI |
| 📄 equity-report-gen | Ticker in, 8-page equity research PDF out. An 8-node pipeline — profile, financials, technicals, news, sentiment, peers, LLM outlook, PDF compiler — where every node fails closed: a dead API degrades its section to "Data unavailable" instead of aborting the whole report. Ratio math and RSI/MACD are unit-tested rather than just wired up, which is how a real RSI div-by-zero edge case got caught before it shipped | LangGraph · WeasyPrint · Plotly · FastAPI |
Retrieval & RAG
| Project | What it does | Stack |
|---|---|---|
| 🔎 RAG Hybrid Search | Dense + BM25 retrieval fused with Reciprocal Rank Fusion, a cross-encoder reranker on top, and an LLM-as-judge that catches hallucinated citations before they reach the user | ChromaDB · BM25 · cross-encoder · FastAPI |
| 📊 FinRAG | RAG over long, dense financial PDFs (annual reports, RBI circulars) — hybrid retrieval plus a faithfulness check on every answer | ChromaDB · MiniLM · Claude / Ollama |
AI engineering & evaluation
| Project | What it does | Stack |
|---|---|---|
| 🧭 QueryPilot · ▶ Live | Natural language → SQL against a live introspected schema, with four layered safety checks — a SQLite authorizer denies every non-read at prepare time, so a text-level bypass still fails safe. Clickable with no API key | Claude / Ollama · SQLite · Streamlit |
| 🧭➕ QueryPilot v2 | Production rebuild of QueryPilot: same 4-layer safety, Streamlit swapped for FastAPI + a schema-aware RAG layer that retrieves only the 3 relevant table chunks per question (not a full schema dump), Postgres query history, full Docker Compose | FastAPI · ChromaDB · Postgres · Docker |
| 🧪 Agent Eval Harness · ▶ Live | Scores multi-step agent trajectories, not prompt/response pairs: right tools, right order, recovered from failures, stayed in budget — and did anything the agent actually did justify the answer it gave? Catches the fluent final report quoting a metric no tool in the run ever produced. Every score cites the step indices it rests on | OpenAI · Pydantic · FastAPI · pytest |
| 🚦 LLM Regression Detector · ▶ Live | Prompts drift silently. A CI harness that runs a golden dataset through every prompt change, scores it, and alerts on regressions before they ship | OpenAI · pytest · GitHub Actions |
| 🧬 llm-regressor · 📦 PyPI | The pip-installable sibling: model-agnostic (Claude/OpenAI/Ollama/LiteLLM) regression testing you drop into any repo, not a hosted dashboard. Deterministic checks fail closed, judge-scored checks flag a >20% drop vs. baseline, and self-consistency measures embedding variance across repeated runs of the same prompt — exits nonzero on any CRITICAL regression to gate CI | click · rich · pytest · GitHub Actions |
| 🕵️ Stream Fraud Detector | Real-time transaction scoring: Kafka(Redpanda) stream → XGBoost+IsolationForest ensemble with SHAP explanations → Redis rolling per-user features → Postgres → Evidently drift monitoring. Verified against a live docker-compose stack, not just unit tests | Kafka · XGBoost · SHAP · Evidently · FastAPI |
Applied ML & data
| Project | What it does | Stack |
|---|---|---|
| 🕸️ Elliptic GATv2 AML | Flags illicit Bitcoin transactions on a 200k-node temporal graph, benchmarking GATv2/GCN against Random Forest and an MLP under identical splits — on this dataset Random Forest wins (Illicit-F1 0.81 vs. GATv2's 0.43), and the README says so instead of only showing the model that flatters the pitch. Every number in the table traces to a committed results/*.json run, not a hand-typed claim |
PyTorch Geometric · scikit-learn · GitHub Actions |
| 🚂 RailGraph · ▶ Live | Treats India's rail network as a graph rather than a timetable: PageRank for station importance, betweenness to find the junctions whose failure disrupts the most traffic | NetworkX · Folium · Plotly |
| 📈 IPO GMP Predictor · ▶ Live | Models IPO listing-day returns from Grey Market Premium and subscription signals, using time-series CV to avoid leaking future market regimes (synthetic dataset — demonstrates the pipeline, not validated on real markets) | XGBoost · scikit-learn · Streamlit |
| ⚖️ SEBI Enforcement Explorer · ▶ Live | Turns SEBI's unstructured HTML order listing into a searchable dataset — violation classification, entity extraction, and pattern analytics | BeautifulSoup · NetworkX · Streamlit · Plotly |
Proposed a fix for Textualize/rich (56k ⭐) — CONTRIBUTING.md still tells new contributors to run poetry shell, which Poetry removed in 2.0, so setup fails at step one. Fix posted on #3817, documenting the officially recommended eval $(poetry env activate).
