← Projects

FinSight AI

PDF-parsingfinancial-analysiscollege projectLLMsGitHub ↗

Architecture

                          ┌──────────────────────────┐
                          │   Streamlit UI (ui.py)    │
                          │  upload · dashboard · chat │
                          └────────────┬─────────────┘
                                       │
                  ┌────────────────────┴────────────────────┐
                  │                                          │
       PDF upload │                            chat message  │
                  ▼                                          ▼
   ╔══════════════════════════════╗          ╔══════════════════════════════╗
   ║      INGESTION GRAPH         ║          ║        QUERY GRAPH           ║
   ║      (runs once/PDF)         ║          ║      (runs once/message)     ║
   ╟──────────────────────────────╢          ╟──────────────────────────────╢
   ║                              ║          ║                              ║
   ║          START               ║          ║          START               ║
   ║            │                 ║          ║            │                 ║
   ║            ▼                 ║          ║            ▼                 ║
   ║      split_document          ║          ║       route_query            ║
   ║   (locate 3 statements)      ║          ║  (pick relevant statements)  ║
   ║         ╱      ╲             ║          ║            │                 ║
   ║  Send×3╱        ╲Send×3      ║          ║            ▼                 ║
   ║       ▼          ▼           ║          ║     generate_answer ◄──────┐ ║
   ║  summarize_   parse_         ║          ║   (answer + chart_spec)    │ ║
   ║  statement    statement      ║          ║            │               │ ║
   ║  (×3 ‖)       (×3 ‖)         ║          ║            ▼        "retry" │ ║
   ║       ╲          ╱           ║          ║     validate_answer ───────┘ ║
   ║        ╲        ╱            ║          ║   (audit vs source data)     ║
   ║         ▼      ▼             ║          ║            │  "done"         ║
   ║       build_kpis             ║          ║            ▼  (max 2 retries)║
   ║   (8 executive KPIs)         ║          ║           END                ║
   ║            │                 ║          ║                              ║
   ║           END                ║          ╚══════════════════════════════╝
   ╚══════════════════════════════╝
            │                                          │
            ▼                                          ▼
   raw_pages → chunks → summaries          answer_text + chart_spec
   + parsed_statements + kpis              (rendered in chat)

                         ┌─────────────────────────┐
                         │   OpenAI GPT-4o          │
                         │ (structured JSON output) │
                         └─────────────────────────┘
                    every node calls the LLM via main.py client

Tech Stack

LayerTechnologyPurpose
OrchestrationLangGraph >=0.2.0State-graph workflows, parallel fan-out (Send), conditional retry edges
LLMOpenAI GPT-4o (openai>=1.0.0)Document navigation, parsing, summarisation, routing, answering, validation
UIStreamlit >=1.44.0Web app — dashboard, tabs, chat interface
PDF parsingPyMuPDF (fitz) >=1.25.0Per-page text extraction from annual reports
ChartsPlotly >=5.24.0Interactive bar / line / pie / waterfall charts
Datapandas >=2.0.0Statement tables in the UI
ValidationPydantic >=2.7.4Type models (via LangGraph)
Configpython-dotenv >=1.0.0Loads OPENAI_API_KEY from .env
LanguagePython 3.12