pucho.me

Voice RAG · हिन्दी & मराठी · 241,572 chunks

पूछो ask

Speak a question in Hindi or Marathi. Get an answer that is extracted, grounded and cited — in under 200 milliseconds. Nothing is invented; if the corpus can't support it, it says so.

Press the mic and speak, or type and hit enter.
60P50 ms
65P70 ms
108P100 ms
300/300under budget
02

The numbers are measured, not claimed.

Every figure below comes from a run you can reproduce — on the box that serves this page. Raw JSON lives in data/reports/.

StageP50P70P90P99P100
run the live benchmark above to populate
03

Twelve chunking strategies tested. One shipped.

Ask a question, then run every index over it. They disagree — that disagreement is the whole reason the ablation was worth running.

The ensemble didn't earn its keep

All 7 index subsets, 1,500 bilingual queries, paired bootstrap at 10k resamples. Every recall difference sat inside the noise; the 3-index ensemble was significantly behind a single index on MRR@10. We ship one — a third of the memory, a third of the search time.

ENSEMBLE − metadata_128 · R@10 +0.0047 [−0.0076, +0.0168] · n.s.

A tokenizer bug was shredding Devanagari

Python's \w drops vowel signs and the virama, so BM25 was indexing consonant fragments — invisible in English, catastrophic in Hindi. Fixing it gained +12% MRR, three times what all the ensemble work gained.

दिल्ली → ['द','ल','ल']  Delhi → ['Delhi']

int8 embeddings aren't batch-invariant

The latency tail tracked the longest sentence in a batch (r=0.84), not how many there were (r=0.02). Fixing the padding revealed that dynamic quantisation makes a wide batch less accurate, not more.

int8 Δ=1.03e-02 · fp32 Δ=4.66e-08

One corpus row was the entire P100

A single query is 2,717 characters — a translation artifact that loops — against a median of 32. It forced a full 512-token pass. Capping the query halved P100.

median 32 · p99 102 · max 2,717 chars