metadata
title: Research Paper RAG Chatbot
emoji: π¬
colorFrom: blue
colorTo: indigo
sdk: docker
app_port: 7860
pinned: false
Research Paper RAG Chatbot
An AI-powered agentic RAG (Retrieval-Augmented Generation) system for students and researchers. Upload research papers or fetch them live from arXiv, then query across them in natural language with cited, context-aware responses β streamed in real time.
Live Demo: Hugging Face Spaces
Features
- Upload PDFs β ingest your own research papers with a 4-step checkpointed pipeline
- Fetch from arXiv β download and index papers directly by arXiv ID
- Agentic RAG pipeline β LangGraph StateGraph with adaptive routing, document grading, and cited answer generation
- Real-time streaming β chat responses streamed via Server-Sent Events (SSE)
- Session isolation β each browser session has its own paper library and vector search scope
- PDF Viewer β read papers in-browser with page navigation
Architecture
RAG Pipeline (LangGraph StateGraph)
User Query β Router β [retrieve | live_fetch] β grade_docs β generator β citation β END
| Node | File | Description |
|---|---|---|
| Router | nodes/router.py |
LLM classifies query as "retrieve" or "live_fetch" |
| Retrieve | nodes/retrieve.py |
Searches local ChromaDB; scoped to session's papers |
| Live Fetch | nodes/live_fetch.py |
Fetches from arXiv, indexes chunks |
| Grade Docs | nodes/grade_docs.py |
LLM grades each chunk as relevant/irrelevant |
| Generator | nodes/generator.py |
Builds context, calls Groq LLM, returns cited answer |
| Citation | nodes/citation.py |
Appends formatted Sources block with arXiv/DOI links |
Ingestion Pipeline (4-step, checkpointed)
PDF β Parse (PyMuPDF) β Clean β Chunk β Embed (BAAI/bge-base-en-v1.5) β ChromaDB
Each step is checkpointed in MongoDB. Retrying a failed ingestion skips already-completed steps.
Storage
| Store | Purpose |
|---|---|
| ChromaDB | Vector embeddings for semantic search |
| MongoDB | Paper records, ingestion checkpoints, request logs |
| Local disk | Uploaded PDF files (uploads/documents/, uploads/arxiv/) |
API Routes
| Endpoint | Description |
|---|---|
POST /api/v1/chat |
SSE streaming chat |
POST /api/v1/upload |
Upload a PDF |
GET /api/v1/papers |
List papers (session-scoped) |
DELETE /api/v1/papers/{id} |
Delete a paper |
POST /api/v1/papers/fetch/arxiv/{id} |
Fetch & index an arXiv paper |
GET /api/v1/uploads/{id}/view |
Serve PDF for viewer |
GET /api/v1/health |
Health check |
Quick Start (Local)
Prerequisites
- Python 3.11+
- MongoDB running on
localhost:27017 - uv (recommended) or pip
1. Clone the repo
git clone https://github.com/salvirezwan/Research-Paper-RAG-chatbot.git
cd "Research-Paper-RAG-chatbot/Academic Research RAG"
2. Install dependencies
# Using uv (recommended)
pip install uv
uv sync
# Or using pip
pip install -r requirements.txt
3. Configure environment
cp .env.example .env
Edit .env:
GROQ_API_KEY=your_groq_api_key_here
MONGODB_URL=mongodb://localhost:27017
MONGODB_DATABASE_NAME=academic_research_rag
CHROMA_PERSIST_PATH=./data/chroma_db
CHROMA_COLLECTION_NAME=research_papers
GROQ_MODEL=llama-3.3-70b-versatile
EMBED_MODEL_NAME=BAAI/bge-base-en-v1.5
UPLOAD_DIR=uploads/documents
Get a free Groq API key at console.groq.com
4. Run
# Option A β dev shortcut (Windows, opens two terminals)
.\dev.bat
# Option B β manual
python -m uvicorn backend.main:app --host 0.0.0.0 --port 8000 --reload
streamlit run frontend/app.py
- Backend: http://localhost:8000
- Frontend: http://localhost:8501
- API Docs: http://localhost:8000/docs
Docker (Full Stack)
docker compose -f docker/docker-compose.yml up --build
- Frontend: http://localhost:8501
- Backend: http://localhost:8000
Hugging Face Spaces Deployment
The app runs as a single Docker container on a free HF Space (2 vCPU / 16 GB RAM).
Process layout
supervisord (PID 1)
βββ nginx β port 7860 (reverse proxy)
β βββ /api/* β 127.0.0.1:8000 (FastAPI)
β βββ /* β 127.0.0.1:8501 (Streamlit)
βββ uvicorn β port 8000
βββ streamlit β port 8501
Ephemeral storage
Since HF Spaces has no persistent disk, the app uses:
- ChromaDB
EphemeralClient(in-memory vectors) - mongomock-motor
AsyncMongoMockClient(in-memory MongoDB) /tmp/uploads/for uploaded files
All data is lost on restart β expected behaviour for the free tier.
Deploy your own
- Create a new Space at huggingface.co β Docker SDK
- Push this repo to the Space's git remote
- Space Settings β Secrets: add
GROQ_API_KEY - Space Settings β Variables: add
APP_PUBLIC_URL=https://<your-username>-<your-space-name>.hf.space - First startup takes ~5 min (downloads the ~450 MB embedding model)
Environment Variables
| Variable | Default | Description |
|---|---|---|
GROQ_API_KEY |
β | Required. Groq API key |
MONGODB_URL |
mongodb://localhost:27017 |
MongoDB connection string |
MONGODB_DATABASE_NAME |
academic_research_rag |
Database name |
CHROMA_PERSIST_PATH |
./data/chroma_db |
ChromaDB storage path |
CHROMA_COLLECTION_NAME |
research_papers |
ChromaDB collection |
GROQ_MODEL |
llama-3.3-70b-versatile |
Groq model ID |
EMBED_MODEL_NAME |
BAAI/bge-base-en-v1.5 |
HuggingFace embedding model |
UPLOAD_DIR |
uploads/documents |
PDF upload directory |
APP_PUBLIC_URL |
`` | Public base URL (required for HF Spaces) |
Tech Stack
| Layer | Technology |
|---|---|
| LLM | Groq API (LLaMA-3.3-70B) |
| Orchestration | LangGraph |
| Backend | FastAPI, Python 3.11 |
| Frontend | Streamlit |
| Vector Store | ChromaDB |
| Embeddings | BAAI/bge-base-en-v1.5 (HuggingFace) |
| Database | MongoDB (Motor async) |
| PDF Parsing | PyMuPDF, Unstructured |
| Deployment | Docker, nginx, supervisord, Hugging Face Spaces |
| Paper Sources | arXiv API |