salvirezwan's picture
Added HF formatter to README
7b2a6f2
|
Raw
History Blame Contribute Delete
6.46 kB
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

Docker (Full Stack)

docker compose -f docker/docker-compose.yml up --build

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

  1. Create a new Space at huggingface.co β†’ Docker SDK
  2. Push this repo to the Space's git remote
  3. Space Settings β†’ Secrets: add GROQ_API_KEY
  4. Space Settings β†’ Variables: add APP_PUBLIC_URL = https://<your-username>-<your-space-name>.hf.space
  5. 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