Skip to content
SHAROZ221Public

About

RAG-powered document Q&A app — upload a document and chat with it. Parses, chunks, and embeds locally, retrieves via ChromaDB, and generates grounded answers with source citations using Gemini 3.8 Flash. Built with Flask.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Latest commit

 

History

10 Commits

Folders and files

Repository files navigation

Typing SVG

Retrieval-Augmented Q&A for Your Documents

Python Flask ChromaDB Gemini Status License


A Python-based RAG application that lets you upload documents and have grounded, multi-turn conversations with them — with every answer traced back to the exact source chunk it came from.


🔍 What is DocChat?

DocChat turns any document into something you can talk to. Upload a file, ask a question in plain English, and get an answer generated only from what's actually in the document — not the model's memory.

  • 📄 Upload a document → Parsed, chunked, and embedded locally
  • ❓ Ask a question → Top-matching chunks retrieved via vector search
  • 🤖 Answer generated → Grounded strictly in retrieved context, with citations
  • 🚫 Answer not in the document? → DocChat says so instead of guessing
  • 💬 Follow-up question? → Chat history carries the conversation forward

This is the same core pattern (retrieve → augment → generate) behind production RAG systems like enterprise document search and internal knowledge-base assistants.


⚙️ How It Works

Document Upload
        │
        ▼
┌───────────────────┐
│   Parse & Chunk    │──► Sentence-boundary-aware splitting
└───────────────────┘
        │
        ▼
┌───────────────────┐
│  Embed & Store      │──► Local embeddings → ChromaDB (cosine index)
└───────────────────┘

User Question
        │
        ▼
┌───────────────────┐
│  Retrieve Top-K     │──► Semantic search over stored chunks
└───────────────────┘
        │
        ▼
┌───────────────────┐
│  Build Prompt        │──► Context + chat history + question
└───────────────────┘
        │
        ▼
   Gemini 2.5 Flash ✅ → Grounded Answer + Cited Sources

Every answer is generated strictly from retrieved chunks — no source, no answer, just an honest "not found in the documents."


📁 Supported Formats

Format Extension Parser
PDF .pdf PyMuPDF
Word Document .docx python-docx
PowerPoint .pptx python-pptx
Excel Spreadsheet .xlsx openpyxl
Plain Text .txt built-in
Markdown .md built-in

💬 Chat Interface

Local App → localhost:5000

The interface shows in real time:

  • 📂 Document sidebar — uploaded files with drag-and-drop upload and per-file delete
  • 💭 Chat thread — user/assistant message bubbles with markdown rendering
  • 📎 Source cards — collapsible citations showing source file, page, and similarity score
  • 🌙 Dark/light toggle — theme preference persisted locally
  • 🔁 Multi-turn memory — follow-up questions resolved using chat history

🚀 Getting Started

Prerequisites

Installation

# 1. Clone the repository
git clone https://github.com/SHAROZ221/DocChat.git
cd DocChat

# 2. Create and activate a virtual environment
python -m venv venv
source venv/bin/activate      # Windows: venv\Scripts\activate

# 3. Install dependencies
pip install -r requirements.txt

# 4. Configure your API key
cp .env.example .env
# → edit .env and add your GEMINI_API_KEY

# 5. Run the app
python run.py

# 6. Open the app
# → http://127.0.0.1:5000

📁 Project Structure

DocChat/
├── app/
│   ├── __init__.py        → Flask app factory & service singletons
│   ├── config.py           → Environment and app configuration
│   ├── routes/
│   │   ├── main.py         → Main UI route
│   │   ├── upload.py       → File upload & document management
│   │   └── chat.py         → Q&A retrieval and conversation routes
│   ├── services/
│   │   ├── parser.py       → Multi-format document text extraction
│   │   ├── chunker.py      → Sentence-aware chunking with overlap
│   │   ├── embedder.py     → Local sentence-transformers embedder
│   │   ├── vectorstore.py  → ChromaDB client & cosine search
│   │   ├── retriever.py    → Top-k chunk retrieval orchestrator
│   │   ├── llm.py           → Gemini client with RAG prompting
│   │   └── chat_session.py → Multi-turn session state manager
│   ├── static/              → CSS & JS (AJAX, drag-and-drop, theming)
│   ├── templates/           → Jinja2 chat interface
│   └── uploads/             → Uploaded files (gitignored)
├── tests/                   → Unit tests (parser, chunker, sessions)
├── .env.example              → Environment variable template
├── requirements.txt          → Python dependencies
├── run.py                    → Application entry point
└── README.md

🧰 Built With

Technology Purpose
Python 3.10+ Core language
Flask 3 Web server and routing
sentence-transformers Local, free text embeddings
ChromaDB Persistent vector store, cosine similarity
Gemini 2.5 Flash Grounded answer generation
PyMuPDF / python-docx / python-pptx / openpyxl Multi-format document parsing
Tailwind CSS Frontend styling

🧪 Try It Locally

Upload any document and try questions like:

"Summarize the key points of this document"
"What does section 3 say about pricing?"
"Does this mention anything about deadlines?"

Then ask something that isn't in the document at all — DocChat should tell you it can't find the answer instead of making one up.


🎯 Learning Outcomes

Building this project covers core GenAI/LLM engineering skills:

  • ✅ Document parsing across multiple file formats
  • ✅ Chunking strategy and why overlap matters for retrieval quality
  • ✅ Embedding generation and vector similarity search
  • ✅ Retrieval-augmented prompt construction
  • ✅ Hallucination control via strict context-grounding
  • ✅ Multi-turn conversational state management
  • ✅ End-to-end RAG pipeline, from raw file to cited answer

Made with 🤖 by Sharoz

BCA Final Year · GenAI/LLM Application Engineering · India

GitHub LinkedIn

"Retrieve • Ground • Answer"

About

RAG-powered document Q&A app — upload a document and chat with it. Parses, chunks, and embeds locally, retrieves via ChromaDB, and generates grounded answers with source citations using Gemini 3.8 Flash. Built with Flask.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages