A beginner-friendly RAG dashboard for HR and billing documents using Gemini, ChromaDB, LangGraph, and Streamlit, with a lightweight ColPali-ready document/image extraction POC.
This project demonstrates a practical Retrieval-Augmented Generation workflow for business documents. Users ask questions through a Streamlit dashboard, LangGraph classifies the question, ChromaDB retrieves relevant HR or billing context, and Gemini generates the final answer.
The current implementation supports text-based RAG for HR and billing policies. It also includes a simple document extraction POC for text, Markdown, SVG, and image documents. ColPali is included as the planned visual-retrieval direction for scanned PDFs and image-heavy documents, but the current image extraction POC uses Gemini Vision.
Current version: 1.0.0
User
-> Streamlit
-> LangGraph classifier/router
-> HR / Billing ChromaDB retrieval
-> Gemini
-> Answer
- Streamlit chatbot UI for HR, billing, and general questions
- LangGraph classifier/router for workflow control
- ChromaDB vector search for HR and billing knowledge-base retrieval
- Gemini chat model and Gemini embeddings
- Optional LangSmith tracing for observability
- Lightweight document extraction POC for text, Markdown, SVG, and image documents
- Clear user-facing message for missing, expired, invalid, or quota-limited Gemini credentials
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
export GEMINI_API_KEY="YOUR_GEMINI_API_KEY"
streamlit run streamlit_app.pyuv sync
export GEMINI_API_KEY="YOUR_GEMINI_API_KEY"
uv run streamlit run streamlit_app.py- Import this GitHub repository into Replit.
- Add a Replit Secret named
GEMINI_API_KEYcontaining your Gemini API key. - Optional: add LangSmith Secrets for tracing:
LANGSMITH_TRACING=trueLANGSMITH_API_KEYLANGSMITH_PROJECT=multimodal-rag-dashboard
- Run:
uv lock
uv sync
uv run streamlit run streamlit_app.py --server.address 0.0.0.0 --server.port $PORTThe repository contains a .replit file with the Streamlit run command, so Replit can use the Run button after dependencies are synchronized.
- How many days can I work from home?
- How many annual leave days do employees get?
- Can I get a refund for my annual subscription?
- What is Kubernetes?
Sample documents live in documents/.
Run the lightweight extraction and keyword-search POC:
python document_poc.pyThe POC reads text-like files locally and can use Gemini Vision for .png, .jpg, .jpeg, and .webp image documents when GEMINI_API_KEY is set. This is a simple image/document extraction demo, not a full ColPali retrieval pipeline.
GitHub Actions runs a simple CI workflow on pushes and pull requests to main.
The workflow:
- installs Python dependencies
- compiles the Python files
- runs the document extraction POC smoke test
- optionally checks a deployed Replit URL when
REPLIT_APP_URLis configured as a GitHub Actions secret
Workflow file: .github/workflows/ci.yml
Replit publishing is snapshot-based from the Replit Project Editor. To update the live Replit app after a GitHub push, pull the latest main branch in Replit and publish a new snapshot.
For private Replit deployments, Replit external access tokens can be used by CI for smoke tests. Add these optional GitHub Actions secrets:
REPLIT_APP_URLREPLIT_ACCESS_TOKEN
The CI workflow uses REPLIT_ACCESS_TOKEN only for an HTTP health check. It does not publish or republish the Replit app.
LangSmith tracing is optional. The app runs without it.
To enable tracing locally:
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY="YOUR_LANGSMITH_API_KEY"
export LANGSMITH_PROJECT="multimodal-rag-dashboard"For Replit, add the same values in Secrets. Do not commit LangSmith or Gemini API keys.
This project is licensed under the MIT License. See LICENSE.
Never commit API keys, .env files, or private credentials to GitHub. Use Replit Secrets or environment variables.
If the Gemini API key is expired, invalid, missing, or out of quota, the app shows a clear Gemini API key/token expired or invalid message.