Business Context: The Manual Analysis Problem
The typical financial analyst workflow for a quarterly earnings cycle involves downloading 10-20 PDF reports, manually extracting revenue, EBITDA, and guidance figures into a spreadsheet, reading management commentary for qualitative signals, and then trying to remember context from prior quarters when a question comes up in a meeting. This workflow is slow, error-prone, and does not scale. When a portfolio manager asks a question about how a company's gross margin trend compares to peers over six quarters, the answer should take seconds, not hours. The AI financial report analysis agent makes that possible. It is not a replacement for analyst judgment on investment decisions. It is a research assistant that eliminates the extraction and retrieval work so analysts can spend their time on interpretation and thesis development. FCA-regulated firms in the UK should note that the agent is positioned as decision support, not automated investment advice, which is an important distinction for compliance purposes.
Architecture: Document Ingestion to Natural Language Q&A
The system is built in three layers. The ingestion layer accepts PDF uploads via a Next.js frontend, extracts text and tables using AWS Textract or a PyPDF pipeline, chunks the content semantically, generates embeddings via OpenAI or Cohere, and stores them in a vector database (Supabase pgvector or Pinecone). Metadata per chunk includes company name, report type, period, and document date. The retrieval layer accepts natural language queries, embeds the query, retrieves the most relevant chunks across the document corpus, and passes them to Claude with a structured prompt. The response layer formats Claude's output as structured JSON: key figures in a table, narrative summary, relevant quotes with source document references, and a confidence note where the source data is ambiguous. The frontend displays results in a clean analyst interface with the ability to drill into source quotes and export summaries to Excel. All documents and query logs are stored securely in AWS S3 with encryption at rest.
AI Components: Claude for Extraction and Reasoning
Anthropic Claude handles two distinct tasks in this agent. First, structured data extraction: given a chunk of financial report text, extract revenue, gross profit, EBITDA, net income, and any forward guidance into a standardised JSON schema. Claude's instruction-following capability makes this reliable across different report formats and writing styles. Second, qualitative reasoning: given a question and retrieved document chunks, synthesise a natural language answer with citations. Claude is particularly strong at this because it can hold multiple documents in context simultaneously and reason across them coherently. The system prompt includes strict instructions to cite every claim with a document reference and to explicitly flag when an answer is based on inference rather than stated fact. This is critical for a regulated financial context where analysts need to trace every figure back to its source for compliance documentation.
Challenges: PDF Quality, Data Ambiguity, and Compliance
Financial report PDFs are notoriously difficult to parse. Tables rendered as images, scanned legacy documents, and complex multi-column layouts all break naive PDF text extraction. SpeedMVPs handles this with a combination of AWS Textract for table extraction, fallback OCR for image-heavy pages, and a post-processing normalisation step that catches common extraction errors before data reaches the vector store. Data ambiguity is the second challenge. Financial terminology is inconsistent across companies and regions. One company's 'adjusted EBITDA' is another's 'underlying operating profit'. The system includes a normalisation layer that maps variant terminology to standard definitions, flagging ambiguous cases for analyst review. For FCA-regulated firms, the agent includes a compliance wrapper: all outputs carry a disclaimer that the agent is a research tool, not investment advice, and all sessions are logged for the 5-year record-keeping period required under MiFID II. GDPR considerations apply to any personal data that appears in financial reports, so the agent includes data classification on ingestion.
Outcomes: What Analysts Report After Deployment
Analyst teams that deploy this agent consistently report two primary outcomes. Research preparation time for investment meetings drops by 60-70%. The two hours of spreadsheet work before a quarterly earnings call compresses to 20-30 minutes of reviewing and interpreting AI-generated summaries. Second, the depth of cross-document analysis improves. Analysts start asking questions they previously would not have asked because the lookup cost was too high. Six-quarter gross margin trend against five peers is now a 30-second query rather than a 2-hour build. Secondary benefits include reduced transcription errors (the agent extracts directly from source documents with citations) and improved knowledge retention (new analysts can query the document corpus to understand historical context without relying on tribal knowledge from senior colleagues).
Lessons: Building for Financial Analyst Trust
Financial analysts are sceptical by training. They will not trust an AI agent that cannot show its working. Every output must be traceable to a source document. Build citations into the product from day one, not as an afterthought. The second lesson is to invest in the extraction accuracy of structured data before the conversational layer. Analysts will accept an imperfect natural language summary, but they will not accept an incorrect revenue figure. Build robust extraction tests against a sample of your actual documents before you build the Q&A interface. Third, involve a senior analyst in the system prompt design for financial queries. The nuance of how questions are phrased, what counts as a direct answer versus an inference, and how to handle missing data, these are judgment calls that require domain expertise. The agent will reflect the quality of thinking that goes into the prompt.