heyshubh.
HomeWorkBlogAbout
← Back to Work
Case Study · Neoflo.ai

Grounded, cited,
or abstain.

Agentic search over filings a frontier model cannot open.

In finance the answer is a number in a table, not a sentence you can paraphrase. Wealth managers work from filings that run eight to ten thousand pages. Most models will not open a file that size. So the question was never which model. It was how the knowledge is organised underneath it.

TypeWork project
CompanyNeoflo.ai
RoleHead of Product · owner and PM
DomainWealth management · retrieval
StatusIn build · live with a customer
98%
Data accuracy
50%
Time saved on research
< 1 hr
Research to report
The Problem

Four things about finance documents break a standard retrieval system. Answers live in tables and charts, not prose. Every monthly factsheet repeats the same sections, so which month and which fund is the entire problem. Identifiers like ISIN and fund code must match exactly, and embeddings smear precisely those tokens. And a question like ten-year revenue needs many facts gathered and computed, not one passage found.

The obvious fallbacks fail too. Stuffing the whole document costs about four times the tokens, still hits the file limit, and degrades in the middle. Fine-tuning fails differently. Factsheets change every month, and a fine-tuned model still cannot cite a source.

What I Did

Six layers: sources, ingestion, representation, storage, retrieval, agentic search. One principle underneath. Precision is established at ingestion, not recovered at rerank.

Ingestion is layout-first. A detector classifies each region before any text is lifted, so a table is captured as a table with its headers attached to every cell. Charts get a separate vision pass. Representation anchors every chunk to canonical metadata: entities to stable fund IDs, dates to one ISO period, aliases collapsed through a finance ontology. Storage keeps three backends and a planner routes each sub-query. Retrieval filters to the exact fund and period before it ranks anything. The agentic layer decomposes, iterates, hands arithmetic to SQL, and abstains rather than guess.

Decisions
01
The representation layer is the product, not the model

Answer quality is set by how knowledge is organised beneath the model.

Rejected the assumption that a better model fixes retrieval.

02
Anchor once, at ingestion

Canonicalise entities, dates and aliases going in, so retrieval becomes a cheap metadata filter instead of interpretation under uncertainty.

Costs ingestion complexity and per-domain adapter work. Buys recall that holds as the corpus grows.

03
Filter on metadata before ranking

The single biggest lever against near-identical monthly files.

Rejected relying on a strong reranker to rescue a weak candidate set.

04
The model plans the calculation. It does not perform it

Aggregation is routed to SQL over the extracted tables.

Rejected model arithmetic, which turns ten-year revenue from a hallucination risk into an exact result.

05
Abstain rather than answer off the wrong page

Grounded, cited, or abstain. Never guessed.

It costs coverage, deliberately.

06
Retrieval over long context

Rejected stuffing on three grounds: cost, reliability, and auditability.

A stuffed prompt has no citation trail, and the file gets rejected anyway.

Outcome

Live with a wealth manager. 98% data accuracy. Half the time on research. Research and report inside an hour.

Deployed as research synthesis, natural language search, voice transcription for call notes, and workflow integration.

Got a wild idea?
Let's build it.Let's build it.

Shubham Shrivastava
Shubham ShrivastavaHead of Product · Neoflo.ai
© Shubham Shrivastava 2026