This project is a Retrieval-Augmented Generation (RAG) based chatbot built in local mode using FastAPI, Streamlit, and ChromaDB.
It allows users to ask questions against ingested documents (e.g. Zoom documentation) and receive grounded answers from an LLM.
- 📄 Document ingestion and embedding using ChromaDB
- 🔍 Semantic search with MMR-based retrieval
- 🤖 LLM-powered answers with context grounding
- 💬 Conversational memory support
- ⚡ FastAPI backend for scalable access
- 🖥️ Streamlit UI for interactive chat
- 🔐 Secrets managed via
.env(not committed)
ZoomChatbot/
├─ app/
├─ config.py # Configuration (paths, models, keys)
├─ rag_chain.py # RAG pipeline (retriever + LLM)
├─ app_server.py # FastAPI backend
├─ ingest/
├─ ingest.py # Document ingestion & vector creation
├─ data/
├─ ZoomDocuments/ # Source documents (Sample docs uploaded. One can replace these with relavant one)
├─ ui/
├─ streamlit.py # Streamlit chat UI
├─ vector_store/
├─ # ChromaDB (ignored in Git)
├─ .env # Environment variables (ignored)
├─ requirements.txt
└─ README.md
1️⃣ Create virtual environment (optional but recommended)
python -m venv zoomEnv zoomEnv\Scripts\activate
2️⃣ Install dependencies pip install -r requirements.
3️⃣ Configure environment variables Create a .env file in project root: OPENAI_API_KEY=your_api_key_here
📥 Ingest Documents Place your documents inside: data/ZoomDocuments/
Run ingestion from project root: python -m ingest.ingest
This will: -Chunk documents -Create embeddings -Persist vectors in ChromaDB
🚀 Run FastAPI Backend uvicorn app.app_server:app --reload
API will be available at: http://127.0.0.1:8000 Swagger UI: http://127.0.0.1:8000/docs
💬 Run Streamlit UI streamlit run ui/streamlit.py Then open the browser link shown in terminal.
🧠 Architecture Overview Streamlit UI ↓ FastAPI (/ask) ↓ RAG Chain ↓ ChromaDB + LLM
-Vector store is created once during ingestion -FastAPI loads the persisted store -Streamlit acts as a thin client
Notes
- .env, vector_store/, and virtual environments are ignored via .gitignore
- ChromaDB persistence uses is_persistent=True
- Ingest and query must use the same embedding model
Future Enhancements -Session-based memory in FastAPI -Source citations in UI -Authentication & rate limiting -Dockerization -Multi-document collections