Skip to content

Agentic Financial Research

97% of answers traceable to the filing they came from, up from 63%

A financial research team needed dense filings turned into direct, checkable answers. We recommended an agentic retrieval loop with citation-level grounding and a scoped refusal boundary, benchmarked against the base models before it shipped.

Client
Atlas
Documents
10-Ks, filings, contracts
Build
Python, Gemini, vector store
Service areas
Five of six

The result — benchmarked against the base models

Answers grounded in source
97%
Overall pass rate
+22%
Correct refusals, from zero
67%

01Brief

The problem

The client wanted an agentic platform that could read dense financial documents — annual reports, 10-Ks, filings, contracts — and put what is inside them in front of a reader as plainly as possible. The requirement was not a summary of the document; it was a direct answer to a specific question, with the passage it came from attached.

The work being replaced

An analyst opening a three-hundred-page filing and hunting for the figure by hand.

What replaced it

One question, one answer, and the page it was read off — checkable without leaving the reply.

02Constraint

Why the obvious path doesn’t work here

The standard LLM pipeline — extract the text, chunk it, embed it, retrieve once, answer — breaks on financial filings at three separate stages, and the failures compound.

  • Stage 1
    Extraction

    The document is already wrong before the model sees it.

    Ordinary extraction reads a two-column filing straight across the page, interleaving two unrelated sentences into one line, and fixed-window chunking cuts tables so figures arrive stripped of the row and column headers that told you what they measured. Everything downstream is reasoning over text the filing never said.

  • Stage 2
    Retrieval

    One similarity search can’t answer a financial question.

    A normal pipeline embeds the question once and answers from whatever the top matches return. “How much did total assets grow across the years” needs figures from three separate pages, and a single search returns three passages about the same one. Embeddings are near-blind to the literals that decide the answer, too — the 2024 paragraph and the 2023 paragraph are almost identical vectors and completely different numbers.

  • Stage 3
    Answering

    Nothing in the chain can say “not in here.”

    Handed passages that don’t contain the answer, the model answers anyway, filling the gap from what it knows about banks in general. Benchmarked on the client’s own documents, the base models correctly declined an out-of-scope question 0% of the time — and a fabricated figure arrives formatted, confident, and indistinguishable from a real one.

03Recommendation

Our solution

Build vs buy

A document-chat product cannot be steered into citation-level grounding it was not designed for, and the refusal behaviour the client needed is a property of the retrieval loop, not the model. The call was to build.

The loop, end to end

Column-aware ingestPage-as-parent chunksHybrid retrievalAgent decides: search again?Cited answer or refusal
  1. AI Strategy & Roadmap

    Build an agentic retrieval loop rather than a chatbot wrapped around a PDF. The agent decides when to go back to the documents and what to look for, instead of answering from a single pass of context — which is what turns “here is roughly what the filing says” into “here is the figure, and here is the page it is on.” Scoped from the start to financial documents only, so the boundary of what it will answer is a design decision rather than an afterthought.

  2. AI Stack

    A custom Python service over a managed vector store rather than an off-the-shelf document-chat tool: column-aware extraction that crops each column of a two-column filing separately, page-as-parent chunking so a retrieved fragment is swapped back for its full page before the model reasons over it, and hybrid retrieval combining vector similarity with keyword search — because a financial question is half semantic and half an exact ticker, line item, or year. Gemini runs the reasoning loop; a knowledge graph built at ingestion handles the questions that span a whole document rather than sitting in one passage.

  3. AI Governance

    Every answer carries citations back to the exact passages it was drawn from, surfaced in the interface rather than buried — the reader checks the source without leaving the answer. The agent’s reasoning trace is exposed alongside each reply, so a wrong answer can be diagnosed instead of merely disbelieved, and the agent is scoped to refuse questions its documents do not cover. Full tracing on every model call and every request means a disputed answer can be reconstructed after the fact.

  4. AI Evaluation

    Bench the agentic loop against the base models before committing to it, across six dimensions rather than a single accuracy score. That evaluation is what established the loop was earning its complexity, and it stays as the regression suite for every change after.

    GroundingRefusalHallucinated figuresOutput cleanlinessIn-scope answeringOverall pass
  5. AI Security

    Authenticated calls on every hop, and visitor-supplied model keys held only for the life of the session rather than persisted server-side. Ingestion is content-hashed and idempotent, so re-uploading a document cannot quietly duplicate or corrupt what is already in the store.

Plan for your workflow. Ready for strategy.

Contact us