Offline answers from 800 documents, in three languages
An air-gapped retrieval system that answers officers' questions from 800+ English, Hindi and Marathi documents, traces every answer to its source, and never touches the internet.
The situation
A police force holds thousands of pages of orders, circulars and procedures across three languages. Finding the clause that applies usually means asking someone who happens to remember it — and none of this material can be sent to a cloud API.
Constraints we designed around
- Documents mix English, Hindi and Marathi, often within the same file.
- Data cannot leave the premises, so every model has to run locally.
- An officer needs the source passage, not a confident paraphrase.
What we built
Hybrid retrieval
Keyword search (BM25) and semantic search (BGE-M3 embeddings in Qdrant) run side by side, so exact section numbers and loosely worded questions both land on the right passage.
Reranking before generation
A cross-encoder reranker reorders candidates before anything reaches the model. This step is where most of the accuracy comes from.
A local language model
An open-weight Qwen2.5 model writes the answer on a single GPU and cites the passages it used, in the language the question was asked in.
One-command deployment
FastAPI backend, React interface and every model ship as one Docker Compose stack that starts on a machine with no network connection.
Deployment
Fully air-gapped. One GPU server (L40S class). No outbound network calls.
Outcomes
- documents in a single index
- 800+
- documents in a single index
- languages, mixed freely
- 3
- languages, mixed freely
- calls to external services
- 0
- calls to external services
Demonstrated to the department; now being developed into a full application.
Stack
- BM25S
- Qdrant
- BGE-M3
- BGE-Reranker-v2-m3
- Qwen2.5
- LangChain
- FastAPI
- React
- Docker Compose