Skip to the work

A number nobody cancheck is not a number.

AI and ML engineer in London. Looking for an AI or ML internship now, full time from January 2027.

AI Digital Twin

It answers questions about me from evidence, cites what it used, and says when it does not know. That last part took the longest.

Retrieval path


  1. Questionplus the last 2 user turns
  2. Embedtext-embedding-3-small
  3. Search87 documents in ChromaDB
  4. Cutdrop past 0.75 cosine distance
  5. Boostintent, 0.12 off the distance
  6. Groundbest 5 chunks into the prompt
  7. Answerstreamed, with its sources
How a question about me becomes an answer with a citation. Every value on this path is a setting in the repository (source 1: ai-professional-twin, repository README on GitHub).

Part of that knowledge base is pulled from public GitHub READMEs, which is a live prompt-injection surface. Retrieved text is delimited, the prompt states that everything inside it is data rather than instructions, and the response rules forbid echoing an injected instruction back (source 1: ai-professional-twin, repository README on GitHub). That is not a guarantee. Pasting third-party markdown straight into a system prompt is worse.

Objective
Rebuild a vanilla JavaScript prototype into something that answers recruiter and interview questions about me from evidence, and shows what the evidence was.
Approach
A FastAPI service with ChromaDB retrieval over 87 indexed documents (source 1: ai-professional-twin, repository README on GitHub) built from YAML knowledge files, the resume PDF and live GitHub ingestion, embedded and generated with Azure OpenAI. Intent-boosted retrieval, conversation-aware follow-ups, eight function-calling tools, answers streamed over SSE, and a React 19 front end.
Result
Running on Railway and Vercel. Ingestion is a background task keyed on content hashes, so health checks answer in about 20 ms (source 2: Vishal Khan, resume (PDF)) during a cold start instead of restart-looping. Per-IP rate limiting and a daily spend cap keep it cheap. 370 tests run in CI (source 3: ai-professional-twin, the testing and quality section of the README) alongside mypy.

Two things that did not survive checking

Neither is on the resume; both were written after it. Both are public, both run their checks in CI, and both exist because a number nobody has tried to break is not evidence yet.

  • Auditing a published benchmark's scorer

    trail-scorer-audit, Patronus AI traces, Python, 274 tests in CI

    TRAIL is a benchmark of human-annotated agent execution traces, MIT licensed, whose abstract reports the best model scoring 11 percent. I wrote down nine properties a competent scorer should have and fixed them before any code existed. Seven came back violated and two latent (source 6: trail-scorer-audit, the nine pre-registered properties and their verdicts).

    The one that matters: a predictor that never opens a span, never reads the gold and has no idea what an error is scores 0.973 against 0.183 (source 5: trail-scorer-audit, repository README on GitHub) for the best published row, through the benchmark's own unmodified scorer. Both headline metrics divide by the number of errors in the answer key and never by the number the judge reported, so emitting an error everywhere is close to optimal play.

    Pre-registering is what makes that a finding rather than a story told afterwards. Six of the nine had a known direction going in, so what pre-registration bought was the magnitude and the contingency, not the sign. The audit is only possible because TRAIL's authors published their scorer, their gold labels and their traces. A benchmark that publishes a table and keeps its scoring code cannot be checked from outside at all.

    Repository, Auditing a published benchmark's scorer, opens in a new tab
    joint accuracy by model. Gold-blind predictor, GAIA 97.3%, Best published, GAIA 18.3%, Gold-blind predictor, SWE Bench 95.8%, Best published, SWE Bench 5.0%.Gold-blind predictor, GAIA97.3%Best published, GAIA18.3%Gold-blind predictor, SWE Bench95.8%Best published, SWE Bench5.0%

    Joint accuracy through TRAIL's unmodified scorer. The two highlighted rows are a program that cannot read: it emits 129.1x as many errors as the answer key holds on GAIA, and scores above every published model on both splits. 0.974 is the highest joint accuracy anything can reach on GAIA, so the gold-blind predictor is within 0.001 of the ceiling. Source (source 5: trail-scorer-audit, repository README on GitHub)

    joint accuracy
    modeljoint accuracy
    Gold-blind predictor, GAIA97.3%
    Best published, GAIA18.3%
    Gold-blind predictor, SWE Bench95.8%
    Best published, SWE Bench5.0%
  • Catching pipeline steps that disagree with themselves

    twicerun, DuckDB, Python, 331 tests in CI

    Run a batch pipeline several times on one input and report, per step, how often it failed to give the same answer. Running it five times is the easy half. Deciding whether two outputs are the same answer (source 7: twicerun, repository README on GitHub) is the project: DuckDB adds the terms of a parallel sum in whatever order the threads finish in, float addition is not associative, and so a plain two-run diff reports hundreds of findings on correct code.

    On the reference pipeline it separates the five steps that diverged from the three that did not, then re-runs each divergent step at one thread to say whether the thread count was the explanation or whether something else is going on. It stops there rather than guessing between a clock read, a data-dependent branch and appended state.

    The part I care about is what it refuses to say. A step that agreed with itself every time is reported as stable on this input, not as correct, and one such step is a planted bug that only moves once the input is stressed (source 8: twicerun, the annotated run on the reference pipeline, in the README). Where four clean comparisons are all the evidence there is, it prints the bound they support, a per-comparison divergence rate no higher than 53 percent, rather than a green tick.

    Repository, Catching pipeline steps that disagree with themselves, opens in a new tab
    of 4 comparisons by model. generate_inputs 0 of 4, daily_revenue 4 of 4, customer_keys 4 of 4, apply_price_updates 2 of 4, append_audit_log 4 of 4, mean_basket 4 of 4, sparse_customer_keys 0 of 4, roll_up_keys 0 of 4.generate_inputs0 of 4daily_revenue4 of 4customer_keys4 of 4apply_price_updates2 of 4append_audit_log4 of 4mean_basket4 of 4sparse_customer_keys0 of 4roll_up_keys0 of 4

    Comparisons that diverged, out of four, on the reference pipeline. Four of the five that fired are planted bugs; mean_basket is correct code whose float average moves in the last few bits, which is why a two-run diff is not enough on its own. sparse_customer_keys reads as zero here and is the fifth bug: it broke under a stressed input, so the tool reports it as stable on this input rather than as passing. Source (source 8: twicerun, the annotated run on the reference pipeline, in the README)

    of 4 comparisons
    modelof 4 comparisons
    generate_inputs0 of 4
    daily_revenue4 of 4
    customer_keys4 of 4
    apply_price_updates2 of 4
    append_audit_log4 of 4
    mean_basket4 of 4
    sparse_customer_keys0 of 4
    roll_up_keys0 of 4

Trajectory

A Bachelor of Commerce, four jobs, and no computer science degree until 2026. The transitions are the part worth writing down.

Nine years, from GST filings in 2018 to agent reliability in 2027. The work rises through four bands, Filings to Reporting to Pipelines to Models, while four periods of study run underneath and overlap it.FilingsReportingPipelinesModels20182020202220242026StudyBComPG, Data ScienceMSc, Data ScienceMSc, AI and CS
The work track rises through what he was actually doing rather than through job titles. The study track underneath runs alongside it for six of the nine years.
Career moves, by band
DatesOrganisationRoleBand
Jul 2018 to Sep 2020PJRJ AssociatesFinance, accounts and taxationFilings
Jan 2021 to Aug 2021Aryan CareE-commerce and finance executiveFilings
Aug 2021 to Dec 2023Avant GardeExecutiveReporting
Jun 2024 to Jan 2026TeleperformanceData EngineerPipelines
Jan 2026 to Jan 2027Northeastern University LondonMSc, AI and Computer ScienceModels

Entry 01, Jul 2018 to Sep 2020. PJRJ Associates

Finance, accounts and taxation

Two years of GST filings, income tax returns and audits. Every figure had to survive somebody checking it months later, which is a useful thing to learn before you learn anything else.

carried forward a low tolerance for figures nobody can trace

Entry 02, Jan 2021 to Aug 2021. Aryan Care Pvt. Ltd.

E-commerce and finance executive

Still filings, now sitting beside an e-commerce operation. First time I was looking at sales data rather than a tax return, and the first time the question was what the data meant rather than whether it balanced.

carried forward data as something to interrogate, not just to file

Entry 03, Aug 2021 to Dec 2023. Avant Garde Clean Room and Engg. Solutions

Executive

Built ML sales forecasting models reaching 80 to 90% accuracy (source 2: Vishal Khan, resume (PDF)) on monthly revenue projections, used daily for commercial planning. Rebuilt revenue and collections reporting in Excel with formulas, macros and VBA, cutting monthly reporting from about two hours to about thirty minutes (source 2: Vishal Khan, resume (PDF)). The forecasting was the interesting part. The reporting rebuild was the part people noticed.

carried forward a model is only as useful as the reporting that survives around it

Entry 04, Jun 2024 to Jan 2026. Teleperformance Global Business

Data Engineer

Databricks pipelines over millions of telecom records (source 2: Vishal Khan, resume (PDF)), call detail, billing and agent performance, feeding a data engineering team of 50 or more across regions. Migrated on-prem SQL Server schemas to Databricks, improving query performance by about 20% and cutting infrastructure cost by about 20% (source 2: Vishal Khan, resume (PDF)). Nobody let me near a model for two years. The pipeline work turned out to be the part that mattered.

Northeastern University London

MSc, AI and Computer Science

Agent reliability, mostly. Grounding, refusal behaviour, and what happens when retrieved text cannot be trusted. The twin is where the ideas get tested before they are written up.

Research

Two dissertations. One is finished and not online, the other is not finished. Both are here as work in progress rather than as credentials.

Liverpool John Moores University, 2024

Reinforcement learning for dynamic pricing in e-commerce

Tested whether reinforcement learning could beat pricing rules in a simulated e-commerce environment. Built a Gym-style environment on real e-commerce data, then trained DQN, A2C and PPO agents over multi-episode simulations. DQN produced the most stable profit curve (source 9: MSc dissertation, Liverpool John Moores University, 2024).

The dissertation is not published anywhere, which makes that the one number on this page you cannot go and check. Ask me and I will send the document.

Northeastern University London, in progress

Agentic AI and agent reliability

Still being written (source 10: MSc dissertation, Northeastern University London). The question is what makes an agent's answer trustworthy enough to act on: grounding, refusal behaviour, and treating retrieved text as untrusted input rather than as instructions.

The twin is the test bed, which is why it ships with a test suite and a prompt-injection section in its README instead of a demo video.

Also: MSc Data Science, Liverpool John Moores University, 2023 to 2024. Executive PG Program in Data Science, IIIT Bangalore, 2022 to 2023. Bachelor of Commerce, University of Delhi, 2018 to 2021.

Other work

Smaller than the twin and honest about it. The code is public, the numbers below are read straight out of the notebooks and READMEs, and the charts are redrawn from that data rather than screenshotted.

Stack

Grouped by how much of it I have actually shipped, which is not the same as the order it appears on a CV.

Shipped and maintained

In production, or in a repository with tests around it.

  • Python
  • SQL
  • FastAPI
  • React 19
  • TypeScript
  • Databricks
  • ChromaDB
  • RAG retrieval
  • Azure OpenAI
  • pandas
  • NumPy
  • pytest
  • Git and GitHub
  • Vercel
  • Railway

Used on project work

Coursework, dissertations, reporting that other people relied on.

  • PyTorch
  • TensorFlow
  • Keras
  • scikit-learn
  • LangChain
  • MCP
  • Azure
  • AWS
  • SQL Server
  • MySQL
  • MongoDB
  • statsmodels
  • Matplotlib
  • Seaborn
  • Plotly
  • Power BI
  • Streamlit
  • Excel with VBA

Read the docs, would need a week

Honest about it rather than padding the list above.

  • R
  • Neo4j
  • Tableau

Ask it something

It answers from the same knowledge base this page cites, and declines when the evidence is not there. Pick a question to copy it, then open the twin and paste.

Ask the twin

Opens in a new tab. No signup.

Tractography, not a metaphor. The twin is a retriever over about forty documents, which is nothing like this.Model: Neural Networks of the Brain, from Sketchfab. Compressed from 1.79 MB to 78 KB with Draco geometry.

Contact

Email gets read the same day. A call is fifteen minutes, and I will have the repository open while we talk.

Location
London, United Kingdom
Availability
Immediate joiner
Work status
Part time
Right to work
Student visa. AI and ML internships until January 2027, full time after that on the graduate route.