Plataforma web para estimar presupuestos de proyectos tecnológicos usando RAG (Retrieval-Augmented Generation). Permite ingestar presupuestos históricos, indexarlos con embeddings vectoriales, y generar estimaciones de horas y costes para nuevos proyectos basándose en datos reales.
El sistema consta de dos repositorios independientes:
- rag-estimation-platform (este repo) — Aplicación web Rails para la gestión de estimaciones, exportación PDF/JSON y UI.
- rag-estimation-service — Servicio RAG con FastAPI, pgvector y OpenAI para indexación y estimación con IA.
┌─────────────────┐ HTTP (Faraday) ┌──────────────────────┐
│ │ ───────────────────────────► │ │
│ Rails App │ POST /api/v1/ingest │ RAG Service │
│ :3000 │ POST /api/v1/estimate │ :8000 │
│ │ POST /api/v1/search │ │
│ ┌───────────┐ │ GET /api/v1/ingest/:id/... │ ┌────────────────┐ │
│ │ SolidQueue│ │ ◄───────────────────────── │ │ FastAPI │ │
│ │ Jobs │ │ JSON responses │ │ + pgvector │ │
│ └───────────┘ │ │ │ + OpenAI API │ │
│ │ │ └────────────────┘ │
└────────┬────────┘ └──────────┬───────────┘
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────────┐
│ PostgreSQL 16 │ │ PostgreSQL 16 │
│ (Rails data) │ │ + pgvector │
│ :5433 │ │ (embeddings) │
└─────────────────┘ │ :5432 │
└──────────────────────┘
| Componente | Stack | Responsabilidad |
|---|---|---|
| rag-estimation-platform | Rails 8, PostgreSQL 16, Hotwire (Turbo + Stimulus), Tailwind CSS, SolidQueue | UI web, autenticación, gestión de estimaciones, exportación PDF/JSON |
| rag-estimation-service | FastAPI, PostgreSQL 16 + pgvector, OpenAI API | Indexación de presupuestos, búsqueda vectorial, estimación de horas con LLM |
- Ruby 3.4.4
- PostgreSQL 16
- Node.js (para Tailwind CLI — lo instala
tailwindcss-rails) - Python 3.11+ (para el servicio RAG)
- Docker y Docker Compose (alternativa para BD y/o servicio RAG)
- API key de OpenAI (para el servicio RAG)
Se explica primero porque la plataforma Rails depende de él.
cd ../rag-estimation-service
cp .env.example .env
# Editar .env → añadir OPENAI_API_KEY
docker compose up --buildEsto levanta:
- PostgreSQL con pgvector en
:5432 - Servicio FastAPI en
:8000
Verificar que funciona:
curl http://localhost:8000/api/v1/healthDocs interactivos de la API: http://localhost:8000/docs
- Instalar PostgreSQL 16 con la extensión pgvector
- Crear el entorno e instalar dependencias:
cd ../rag-estimation-service
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"- Configurar variables de entorno:
cp .env.example .env
# Editar .env → añadir OPENAI_API_KEY y ajustar DATABASE_URL si es necesario- Ejecutar migraciones y arrancar:
alembic upgrade head
uvicorn app.main:app --reload --port 8000- Base de datos: necesitas PostgreSQL corriendo. Puedes usar Docker solo para la BD:
docker compose -f docker-compose.dev.yml up dbEsto levanta PostgreSQL en :5433 (para no chocar con el :5432 del servicio RAG).
- Variables de entorno:
# Crear .env.development (o verificar que existe)
cat .env.developmentDebe contener:
DATABASE_URL=postgresql://postgres:postgres@localhost:5433/rag_estimation_platform_development
RAG_SERVICE_BASE_URL=http://localhost:8000- Instalar dependencias y preparar la BD:
bin/setup- Cargar datos de prueba:
bin/rails db:seed- Arrancar la aplicación:
bin/devEsto levanta Rails en :3000 + el watcher de Tailwind CSS.
docker compose -f docker-compose.dev.yml up --buildNota: dentro del contenedor,
RAG_SERVICE_BASE_URLapunta ahttp://host.docker.internal:8000para conectar con el servicio RAG que corre en el host.
Los seeds crean datos de ejemplo para probar toda la plataforma:
| Recurso | Datos |
|---|---|
| Usuario demo | demo@lidr.co / password123 |
| Documentos | 7 presupuestos de ejemplo (SaaS, e-commerce, fintech, etc.) |
| Estimaciones | 7 estimaciones con bloques funcionales, tareas y referencias |
bin/rails db:seed- El usuario sube un JSON en
/ingest - Rails envia
POST /api/v1/ingestal servicio RAG - El servicio RAG chunkeriza el presupuesto, genera embeddings (OpenAI), y lo almacena en pgvector
IngestionStatusJoben Rails sondeaGET /api/v1/ingest/:id/statushasta que completa
- El usuario crea una estimacion y la estructura en bloques/tareas
EstimationJobenviaPOST /api/v1/estimatecon la descripcion del proyecto- El servicio RAG busca presupuestos similares por vector y genera estimacion de horas con LLM
TaskValidationJobenviaPOST /api/v1/estimate/validatepara refinar horas tarea a tarea
- El usuario busca en
/search - Rails envia
POST /api/v1/searchal servicio RAG - Devuelve chunks relevantes con score de similaridad
bin/rails test # Todos los tests
bin/rails test:system # Tests de sistema (requiere Chrome/Chromium)Los tests usan WebMock — no requieren el servicio RAG corriendo. Fixtures en test/fixtures/.
| Comando | Descripcion |
|---|---|
bin/dev |
Arranca Rails + Tailwind watcher |
bin/rails db:seed |
Carga datos de prueba |
bin/rails db:migrate |
Ejecuta migraciones pendientes |
bin/rails routes |
Lista todas las rutas |
bin/rails test |
Ejecuta tests |
| Variable | Descripcion | Default |
|---|---|---|
DATABASE_URL |
PostgreSQL connection string | — |
RAG_SERVICE_BASE_URL |
URL del servicio RAG | http://localhost:8000 |
| Variable | Descripcion | Default |
|---|---|---|
DATABASE_URL |
PostgreSQL+asyncpg connection string | — |
OPENAI_API_KEY |
API key de OpenAI | — |
EMBEDDING_MODEL |
Modelo de embeddings | text-embedding-3-small |
LLM_MODEL |
Modelo LLM para estimaciones | gpt-4o |
API_KEY |
API key del servicio | dev-api-key |