mini-rag / README.md
mustaphaelkady's picture
Clean deploy mini-rag to Hugging Face
338036b
|
Raw
History Blame Contribute Delete
8.12 kB
---
title: Mini RAG
emoji: πŸ”Ž
colorFrom: blue
colorTo: green
sdk: docker
app_port: 7860
pinned: false
---
# Mini RAG
FastAPI mini RAG application with Supabase pgvector.
# mini-RAG
A lightweight Retrieval-Augmented Generation (RAG) backend built with FastAPI.
Upload documents, embed them, and query them with natural language β€” mini-RAG handles the full pipeline from file ingestion to LLM-generated answers.
---
## What it does
1. **Upload** β€” accept `.txt` or `.pdf` files per project
2. **Process** β€” split files into overlapping text chunks stored in PostgreSQL
3. **Index** β€” embed chunks using an LLM provider and store vectors in a vector DB
4. **Search** β€” retrieve the most semantically similar chunks for any query
5. **Answer** β€” generate a grounded answer from retrieved chunks using an LLM
---
## Stack
| Layer | Technology |
|---|---|
| API framework | FastAPI + Uvicorn |
| Validation | Pydantic v2 |
| Relational DB | PostgreSQL 18 + pgvector extension |
| Vector DB | pgvector (primary) or Qdrant (alternative) |
| Async DB driver | SQLAlchemy async + asyncpg |
| DB migrations | Alembic |
| File loading | LangChain + PyMuPDF |
| LLM providers | OpenAI-compatible (OpenRouter, Ollama) Β· Cohere |
| Reverse proxy | Nginx |
| Observability | Prometheus + Grafana + node-exporter + postgres-exporter |
| Containerization | Docker Compose |
---
## Repository layout
```
mini-rag/
β”œβ”€β”€ docker/
β”‚ β”œβ”€β”€ docker-compose.yml # full 8-service stack
β”‚ β”œβ”€β”€ env/ # environment files (not committed with real keys)
β”‚ β”œβ”€β”€ minirag/
β”‚ β”‚ β”œβ”€β”€ Dockerfile
β”‚ β”‚ └── entrypoint.sh # runs alembic then starts uvicorn
β”‚ β”œβ”€β”€ nginx/default.conf
β”‚ └── prometheus/prometheus.yml
β”œβ”€β”€ src/
β”‚ β”œβ”€β”€ main.py # FastAPI app, startup wiring
β”‚ β”œβ”€β”€ requirements.txt
β”‚ β”œβ”€β”€ controllers/ # business logic / service layer
β”‚ β”œβ”€β”€ helpers/config.py # settings loader
β”‚ β”œβ”€β”€ models/ # PostgreSQL models and data-access layer
β”‚ β”‚ └── db_schemes/minirag/ # SQLAlchemy ORM schemas + Alembic migrations
β”‚ β”œβ”€β”€ routes/ # HTTP endpoints
β”‚ β”œβ”€β”€ stores/
β”‚ β”‚ β”œβ”€β”€ LLM/ # generation + embedding provider abstraction
β”‚ β”‚ └── vectordb/ # vector DB provider abstraction
β”‚ β”œβ”€β”€ utils/metrics.py # Prometheus middleware
β”‚ └── assets/
β”‚ β”œβ”€β”€ files/ # uploaded files (grouped by project_id)
β”‚ └── databases/ # local Qdrant storage (if using QDRANT backend)
β”œβ”€β”€ ARCHITECTURE.md
β”œβ”€β”€ setup_guide.md
└── README.md
```
---
## Quick start (Docker Compose)
### 1. Configure environment files
```bash
cd docker/env
cp .env.example.postgres .env.postgres
cp .env.example.postgres-exporter .env.postgres-exporter
cp .env.example.grafana .env.grafana
cp .env.example.app .env.app
```
Edit each file. The most important one is `.env.app` β€” set your LLM provider keys and PostgreSQL credentials.
### 2. Start all services
```bash
cd docker
docker compose up -d --build
```
### 3. Verify
```
http://localhost/docs β†’ FastAPI Swagger UI
http://localhost:9090 β†’ Prometheus
http://localhost:3000 β†’ Grafana
```
For local dev setup (Windows + WSL 2 + Conda), see `setup_guide.md`.
---
## API overview
Base URL: `http://localhost/api/v1` (via Nginx) or `http://localhost:8000/api/v1` (direct)
| Method | Endpoint | Description |
|---|---|---|
| `GET` | `/` | Health check β€” returns app name and version |
| `POST` | `/data/upload/{project_id}` | Upload a file into a project |
| `POST` | `/data/process/{project_id}` | Split uploaded file(s) into chunks |
| `POST` | `/nlp/index/push/{project_id}` | Embed chunks and push into vector DB |
| `GET` | `/nlp/index/info/{project_id}` | Get vector collection metadata |
| `POST` | `/nlp/index/search/{project_id}` | Semantic search over indexed chunks |
| `POST` | `/nlp/index/answer/{project_id}` | Full RAG: retrieve + generate answer |
---
## End-to-end pipeline example
```bash
# 1. Upload
curl -X POST "http://localhost/api/v1/data/upload/1" \
-F "file=@/path/to/document.txt"
# 2. Process (chunk)
curl -X POST "http://localhost/api/v1/data/process/1" \
-H "Content-Type: application/json" \
-d '{"file_id":"<returned_file_id>","chunk_size":1000,"overlap_size":100,"do_reset":1}'
# 3. Index (embed + store vectors)
curl -X POST "http://localhost/api/v1/nlp/index/push/1" \
-H "Content-Type: application/json" \
-d '{"do_reset":1}'
# 4. Ask a question
curl -X POST "http://localhost/api/v1/nlp/index/answer/1" \
-H "Content-Type: application/json" \
-d '{"text":"What is this document about?","limit":5}'
```
---
## LLM provider options
### Generation
| Provider | `GENERATION_BACKEND` | Notes |
|---|---|---|
| OpenRouter | `OPENAI` | Remote API, no local install, set `OPENAI_API_URL=https://openrouter.ai/api/v1` |
| Ollama | `OPENAI` | Local models, set `OPENAI_API_URL=http://host.docker.internal:11434/v1/` |
| Cohere | `COHERE` | Set `COHERE_API_KEY` |
### Embedding
| Provider | `EMBEDDING_BACKEND` | Notes |
|---|---|---|
| Cohere | `COHERE` | `embed-multilingual-light-v3.0` supports 100+ languages |
| OpenAI | `OPENAI` | `text-embedding-3-small` (size 1536) or `text-embedding-3-large` |
---
## Vector DB options
| Backend | `VECTOR_DB_BACKEND` | Notes |
|---|---|---|
| pgvector | `PGVECTOR` | Runs inside the PostgreSQL container, no extra service needed |
| Qdrant | `QDRANT` | Separate Qdrant container, stores local files under `src/assets/databases/` |
The pgvector backend creates an HNSW index automatically once a collection reaches `VECTOR_DB_INDEX_THRESHOLD` rows (default 100).
---
## Prompt language support
RAG prompts are localized. Templates live in `src/stores/LLM/templates/locales/`.
Supported languages out of the box:
- English (`en`)
- Arabic (`ar`)
Set `PRIMARY_LANG` and `DEFAULT_LANG` in `.env` to control which templates are used.
---
## Observability
Prometheus scrapes metrics from three sources:
- FastAPI app β€” HTTP request counts and latencies per endpoint
- Node Exporter β€” host CPU, memory, disk, network
- Postgres Exporter β€” PostgreSQL connection pool, query performance, table sizes
Import the standard Grafana dashboards (IDs `1860` for Node Exporter and `9628` for PostgreSQL) to get instant visibility.
---
## Key configuration variables
| Variable | Default | Description |
|---|---|---|
| `POSTRGRES_HOST` | `pgvector` (Docker) | PostgreSQL host |
| `VECTOR_DB_BACKEND` | `PGVECTOR` | `PGVECTOR` or `QDRANT` |
| `GENERATION_BACKEND` | `OPENAI` | `OPENAI` or `COHERE` |
| `EMBEDDING_BACKEND` | `COHERE` | `OPENAI` or `COHERE` |
| `EMBEDDING_MODEL_SIZE` | `384` | Must match the model's actual output dimension |
| `PRIMARY_LANG` | `en` | Prompt template language |
| `VECTOR_DB_INDEX_THRESHOLD` | `100` | Rows needed before HNSW index is created |
See `src/.env.example` for the full list.
---
## Known issues
- `GENERATION_DEFAULT_TEMPRATURE` env key has a typo (matches the code β€” do not correct the env key without also updating `config.py`).
- `GET /nlp/index/info/{project_id}` returns a raw provider object that needs serialization cleanup before it is fully JSON-safe.
- The process endpoint success signal mentions "vectordb" even though this step only writes to PostgreSQL β€” it is misleading but harmless.
See `Errors&Sol.txt` for specific bugs encountered and their fixes.
See `ARCHITECTURE.md` for a full codebase breakdown.
---
## Security
- Do not commit real API keys. Rotate any keys that appear in `.env` files before sharing this repository.
- All `.env` files under `src/` are excluded by `.gitignore`. Files under `docker/env/` must be managed manually.
- The Prometheus metrics endpoint is exposed at a randomized path to limit accidental public exposure.