# sahahahil/pdf-q-a- architecture

> Architecture diagram of the GitHub repository sahahahil/pdf-q-a-, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/sahahahil/pdf-q-a-
- Repository: https://github.com/sahahahil/pdf-q-a-

## Overview

This repository is a local, multi-PDF question-answering application with both terminal and Streamlit interfaces. Its workflow loads PDFs, splits them into chunks, indexes embeddings for semantic retrieval, and uses retrieved context to generate grounded answers with Ollama/Llama2. The Streamlit interface additionally displays retrieved sources and keeps chat history in session state. The graph reflects the sampled Python code; external model integrations are shown as dependencies, not as inspected repository modules.

Main entry points: [`app_streamlit.py`](https://github.com/sahahahil/pdf-q-a-/blob/main/app_streamlit.py) (Streamlit app), [`rag_pdf_qa.py`](https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py) (QA chain builder), [`data`](https://github.com/sahahahil/pdf-q-a-/tree/main/data) (PDF folder)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interfaces["User interfaces"]
  node_cli["CLI workflow<br/>[rag_pdf_qa.py]"]
  node_streamlit["Streamlit app<br/>[app_streamlit.py]"]
  node_history[("Chat history<br/>[app_streamlit.py]")]
  node_source_display["Source display<br/>[app_streamlit.py]"]
end

subgraph group_ingestion["PDF ingestion"]
  node_pdf_folder["PDF folder"]
  node_loader["PDF loader<br/>[rag_pdf_qa.py]"]
  node_splitter["Chunk splitter<br/>[rag_pdf_qa.py]"]
end

subgraph group_retrieval["Semantic retrieval"]
  node_embedding_model["Sentence embeddings"]
  node_vector_store[("In-memory vector store<br/>[rag_pdf_qa.py]")]
  node_retriever["Top-3 retriever<br/>[rag_pdf_qa.py]"]
end

subgraph group_answering["Grounded answering"]
  node_chain_builder["QA chain builder<br/>[rag_pdf_qa.py]"]
  node_prompt["Context-only prompt<br/>[rag_pdf_qa.py]"]
  node_ollama["Ollama Llama2"]
  node_parser["String output parser<br/>[rag_pdf_qa.py]"]
end

node_cli_user(("Terminal user"))
node_web_user(("Web user"))

node_cli_user -->|"asks questions"| node_cli
node_web_user -->|"asks questions"| node_streamlit
node_cli -->|"loads PDFs"| node_loader
node_streamlit -->|"loads PDFs"| node_loader
node_pdf_folder -->|"provides files"| node_loader
node_loader -->|"passes documents"| node_splitter
node_cli -->|"splits documents"| node_splitter
node_streamlit -->|"splits documents"| node_splitter
node_cli -->|"builds index"| node_retriever
node_streamlit -->|"builds index"| node_retriever
node_retriever -->|"embeds chunks"| node_embedding_model
node_retriever -->|"indexes chunks"| node_vector_store
node_vector_store -->|"creates retriever"| node_retriever
node_cli -->|"builds QA chain"| node_chain_builder
node_streamlit -->|"builds QA chain"| node_chain_builder
node_chain_builder -->|"configures prompt"| node_prompt
node_chain_builder -->|"configures model"| node_ollama
node_chain_builder -->|"configures output parsing"| node_parser
node_cli -->|"queries documents"| node_retriever
node_streamlit -->|"fetches sources"| node_retriever
node_chain_builder -->|"retrieves context"| node_retriever
node_chain_builder -->|"formats context"| node_prompt
node_prompt -->|"sends grounded prompt"| node_ollama
node_ollama -->|"returns answer"| node_parser
node_cli -->|"invokes QA chain"| node_chain_builder
node_streamlit -->|"invokes QA chain"| node_chain_builder
node_streamlit -->|"stores chat"| node_history
node_streamlit -->|"shows citations"| node_source_display
node_retriever -->|"returns source pages"| node_source_display
node_cli -->|"prints answer"| node_cli_user
node_streamlit -->|"displays answer"| node_web_user

click node_cli "https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py"
click node_streamlit "https://github.com/sahahahil/pdf-q-a-/blob/main/app_streamlit.py"
click node_history "https://github.com/sahahahil/pdf-q-a-/blob/main/app_streamlit.py"
click node_pdf_folder "https://github.com/sahahahil/pdf-q-a-/tree/main/data"
click node_loader "https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py"
click node_splitter "https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py"
click node_vector_store "https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py"
click node_retriever "https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py"
click node_chain_builder "https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py"
click node_prompt "https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py"
click node_parser "https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py"
click node_source_display "https://github.com/sahahahil/pdf-q-a-/blob/main/app_streamlit.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_streamlit,node_history,node_source_display,node_cli_user,node_web_user toneBlue
class node_pdf_folder,node_loader,node_splitter toneAmber
class node_embedding_model,node_vector_store,node_retriever toneMint
class node_chain_builder,node_prompt,node_ollama,node_parser toneRose
```

## Components

### User interfaces

- [CLI workflow](https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py): `rag_pdf_qa.py`
- [Streamlit app](https://github.com/sahahahil/pdf-q-a-/blob/main/app_streamlit.py): `app_streamlit.py`
- [Chat history](https://github.com/sahahahil/pdf-q-a-/blob/main/app_streamlit.py): `app_streamlit.py`
- [Source display](https://github.com/sahahahil/pdf-q-a-/blob/main/app_streamlit.py): `app_streamlit.py`

### PDF ingestion

- [PDF folder](https://github.com/sahahahil/pdf-q-a-/tree/main/data): `data`
- [PDF loader](https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py): `rag_pdf_qa.py`
- [Chunk splitter](https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py): `rag_pdf_qa.py`

### Semantic retrieval

- **Sentence embeddings**
- [In-memory vector store](https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py): `rag_pdf_qa.py`
- [Top-3 retriever](https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py): `rag_pdf_qa.py`

### Grounded answering

- [QA chain builder](https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py): `rag_pdf_qa.py`
- [Context-only prompt](https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py): `rag_pdf_qa.py`
- **Ollama Llama2**
- [String output parser](https://github.com/sahahahil/pdf-q-a-/blob/main/rag_pdf_qa.py): `rag_pdf_qa.py`

### Other components

- **Terminal user**
- **Web user**

## Connections

- Terminal user → CLI workflow: asks questions
- Web user → Streamlit app: asks questions
- CLI workflow → PDF loader: loads PDFs
- Streamlit app → PDF loader: loads PDFs
- PDF folder → PDF loader: provides files
- PDF loader → Chunk splitter: passes documents
- CLI workflow → Chunk splitter: splits documents
- Streamlit app → Chunk splitter: splits documents
- CLI workflow → Top-3 retriever: builds index
- Streamlit app → Top-3 retriever: builds index
- Top-3 retriever → Sentence embeddings: embeds chunks
- Top-3 retriever → In-memory vector store: indexes chunks
- In-memory vector store → Top-3 retriever: creates retriever
- CLI workflow → QA chain builder: builds QA chain
- Streamlit app → QA chain builder: builds QA chain
- QA chain builder → Context-only prompt: configures prompt
- QA chain builder → Ollama Llama2: configures model
- QA chain builder → String output parser: configures output parsing
- CLI workflow → Top-3 retriever: queries documents
- Streamlit app → Top-3 retriever: fetches sources
- QA chain builder → Top-3 retriever: retrieves context
- QA chain builder → Context-only prompt: formats context
- Context-only prompt → Ollama Llama2: sends grounded prompt
- Ollama Llama2 → String output parser: returns answer
- CLI workflow → QA chain builder: invokes QA chain
- Streamlit app → QA chain builder: invokes QA chain
- Streamlit app → Chat history: stores chat
- Streamlit app → Source display: shows citations
- Top-3 retriever → Source display: returns source pages
- CLI workflow → Terminal user: prints answer
- Streamlit app → Web user: displays answer
