TFG — Grado en Ingeniería de Tecnologías de Telecomunicación  ·  v2.3.0

Generación Aumentada
mediante Recuperación con Modelos Locales

Transformando conocimiento corporativo (SharePoint, Web, BOE e Imágenes) en respuestas accionables mediante Inteligencia Artificial local y Open Source. 15 microservicios, 100% on-premise.

jarvis-pipeline (9099)

Arquitectura del Sistema

15 microservicios orquestados con Docker Compose. Despliegue 100% On-Premise.

Ecosistema Completo y Modelos de IA

%%{init: {'theme':'dark', 'themeVariables': {'clusterBkg':'#0f172a','clusterBorder':'#334155'}}}%% graph TD classDef default fill:#1e293b,stroke:#3b82f6,stroke-width:2px,color:#f8fafc; classDef model fill:#0f172a,stroke:#10b981,stroke-width:2px,color:#f8fafc,stroke-dasharray: 5 5; classDef db fill:#0f172a,stroke:#8b5cf6,stroke-width:2px,color:#f8fafc; classDef external fill:#7c2d12,stroke:#fb923c,stroke-width:2px,color:#fff; classDef monitor fill:#1e293b,stroke:#f59e0b,stroke-width:2px,color:#f8fafc; USER((Usuario)) -->|HTTPS 8443| NGINX[NGINX TLS + WebSocket] NGINX --> OWUI[OpenWebUI :3002] OWUI -->|HTTP POST| JARVIS{Pipeline JARVIS :9099} JARVIS -->|RAG / Search / Scrape| BACKEND[Backend FastAPI :8002] BACKEND --> DDG[DuckDuckGo]:::external BACKEND --> PW[Playwright] PW -.-> TRAF((Trafilatura)):::model BACKEND -.->|OCR| OCR((PaddleOCR GPU)):::model BACKEND --> EMBED INDEXER[Indexer :8003 Cron 5min] -->|Graph API + MSAL| SP[SharePoint]:::external INDEXER -->|Ficheros| BACKEND JARVIS --> MCP[MCP-BOE :8011] MCP --> BOEAPI[API BOE]:::external JARVIS -->|Vision| VISION((Qwen 2.5 VL 7B)):::model BACKEND --> QDRANT[(Qdrant :6335)]:::db BACKEND -->|"SQL Agent v2.1"| PG[(PostgreSQL :5433)]:::db BACKEND --> REDIS[(Redis :6380)]:::db BACKEND --> MINIO[(MinIO S3 :9002)]:::db BACKEND --> QP[QueryProcessor v2.3] QP -->|Intent detection| LITELLM[LiteLLM Proxy :4001] EMBED((MiniLM-L12-v2 384d)):::model LITELLM -.->|Embeddings| EMBED LITELLM -.->|FACTUAL · PROCEDURAL| LLM1((JARVIS rag-qwen-ft)):::model LITELLM -.->|ANALYTICAL · Summarización| LLM2((Qwen 2.5 32B Q4)):::model subgraph Observabilidad [Monitorizacion] GRAF[Grafana :3003]:::monitor PROM[Prometheus :9091]:::monitor DCGM[DCGM GPU :9401]:::monitor PGADMIN[pgAdmin :5051]:::monitor GRAF -->|PromQL| PROM PROM --> DCGM PROM -->|/metrics| BACKEND PGADMIN -->|SQL| PG end
Servicios Propios APIs Externas Modelos de IA Bases de Datos Observabilidad

Modelos Locales (Qwen 2.5)

Inferencia local con cuantización Q4/Q8 mediante Ollama y LiteLLM. Modelo principal JARVIS fine-tuned con LoRA sobre documentación corporativa real + modelo de visión Qwen 2.5 VL 7B para análisis de imágenes y OCR asistido.

Búsqueda Híbrida

Búsqueda semántica (embeddings MiniLM-L12-v2) + léxica (BM25) sobre Qdrant con filtrado por departamento y control de acceso.

Observabilidad Completa

3 dashboards Grafana (Backend, GPU, BBDD) + Prometheus + NVIDIA DCGM para monitorizar VRAM, latencia y throughput en tiempo real.

Conexiones Multicanal

Sincronización automática con Microsoft SharePoint vía MSAL y Graph API. Web scraping con renderizado JavaScript mediante Playwright + extracción NLP con Trafilatura. Búsqueda en internet vía DuckDuckGo con fallback HTML.

  • Sincronización Delta Incremental (cada 5 min)
  • Cadena de Extracción: Trafilatura → Readability → BeautifulSoup
  • PaddleOCR con GPU para PDFs Escaneados
[✓] Conectado a SharePoint (Graph API)
[*] Detectados 45 documentos nuevos/modificados
[*] OCR GPU en 15 PDFs escaneados...
[✓] 2.340 chunks generados y cargados a Qdrant

Consulta Jurídica Inteligente

Servidor MCP (Model Context Protocol) propio que consulta la API del BOE. Incluye resolución semántica de nombres coloquiales a identificadores oficiales y generación de resúmenes estructurados con el LLM.

  • Servidor FastMCP funcional y validado
  • Resolución semántica: "Ley de Datos" → BOE-A-2018-16673
  • Integrado en el pipeline JARVIS vía API directa

BOE Explorer

Agente Encaminador JARVIS

Pipeline inteligente de 1.498 líneas que analiza cada mensaje y lo dirige al modo de operación adecuado. 14 categorías de intención con evaluación por prioridad, Sticky Mode para preguntas de seguimiento y control de acceso departamental.

  • RAG, Web Search, Scraping, BOE, OCR, Visión...
  • Memoria de sesión por usuario (imágenes, web, decisiones)
  • 92% de precisión en encaminamiento (46/50 tests)

14 Modos de Operación

RAG · Chat · Web Search · Scraping · BOE · Visión · OCR · Archivos · Ayuda · Listar Docs · Estado · Sticky Mode · Referencia a imagen/web · Decisión pendiente

SQL Agent — NL→SQL v2.1

Consulta tablas de datos estructurados con lenguaje natural sin necesidad de aprender SQL. El agente inspecciona el esquema, genera consultas SELECT seguras mediante LiteLLM y las auto-corrige si producen errores de sintaxis.

  • Validación por lista blanca: solo SELECT, WITH, EXPLAIN
  • Auto-corrección hasta 2 reintentos con el error como contexto
  • Endpoint unificado RAG+SQL con auto-routing (/api/v1/query)

Validación de Seguridad

✅ SELECT COUNT(*) FROM ...
✅ WITH cte AS (SELECT ...)
❌ DROP TABLE — bloqueado
❌ DELETE / UPDATE — bloqueado

Query Processor — Routing Inteligente v2.3

Cada consulta pasa por el QueryProcessor antes de llegar a Qdrant. Detecta la intención (FACTUAL, PROCEDURAL, ANALYTICAL), elige el modelo LLM óptimo y genera variaciones de la pregunta para ampliar el recall semántico.

  • JARVIS para consultas rápidas y precisas (<3s)
  • qwen2.5-32b para análisis comparativo multi-documento
  • ×3 variantes de query → fusión → reranker final

Smart Model Routing

FACTUAL    → JARVIS (rápido)
PROCEDURAL → JARVIS (citas OK)
ANALYTICAL → qwen2.5-32b (32K)
Resumen    → qwen2.5-32b (síntesis)

Monitorización Avanzada

Control total sobre los recursos del sistema con 3 dashboards Grafana diseñados a medida, métricas Prometheus en el backend y telemetría GPU con NVIDIA DCGM Exporter.

  • Dashboard Backend: latencia, throughput, distribución de modos
  • Dashboard GPU: VRAM, temperatura, utilización CUDA
  • Dashboard BBDD: PostgreSQL + Qdrant stats

Prometheus + Grafana + DCGM

Latencia RAG ~3.0s · Retrieval ~2.4s · 1.400 docs · 123.323 vectores

Estructura del Proyecto

Componentes principales del backend y sus responsabilidades (v2.3.0).

Fichero Descripción
api/search.py Búsqueda híbrida (dense + BM25 + reranking) con expansión paralela asíncrona y validación JWT
api/chat.py v2.3 Chat RAG con streaming SSE, QueryProcessor integrado (intent → expansion → routing) y memoria conversacional
api/query.py v2.1 Endpoint unificado RAG + SQL con auto-routing inteligente (POST /api/v1/query)
core/sql_agent.py v2.1 Agente NL→SQL: genera y ejecuta SELECT seguros con whitelist, timeout y auto-corrección
core/auth.py v2.1 Validación JWT Azure AD para multi-tenant (activa con AZURE_JWT_VALIDATION=true)
core/query_processor.py v2.3 Intent detection (FACTUAL/PROCEDURAL/ANALYTICAL) → smart model routing (JARVIS vs qwen2.5-32b) → query expansion (×3 variantes vía LLM, fusión y dedup)
core/retrieval.py Pipeline híbrido con filtros avanzados (filename, date_range, from_ocr, source_type)
core/memory/manager.py v2.3 Historial conversacional en PostgreSQL con summarización automática usando qwen2.5-32b (32K ctx, mejor síntesis)
processing/embeddings/ Embeddings MiniLM-L12-v2 con singleton thread-safe (double-checked locking) y caché Redis
integrations/boe_connector.py Cliente API del BOE con resolución semántica de 35+ nombres coloquiales de leyes
integrations/sharepoint/ Sincronización incremental Microsoft Graph API con delta tokens y soporte multi-site

Métricas del Sistema

Medidas en despliegue real en entorno corporativo durante el desarrollo del TFG.

~3.0s

Latencia RAG media
(retrieval + LLM)

~2.4s

Retrieval híbrido
(BM25 + dense + reranker)

1.400

Documentos
indexados en producción

123.323

Vectores
en Qdrant

Multi-tenant

Aislamiento por colección
por área de conocimiento

17.400+

Líneas Python
desarrollo propio

Evolución de los Modelos de IA

Del diseño inicial al despliegue real — por qué Qwen 2.5 reemplazó a Llama 3.1.

Modelo Fase VRAM Rol / Motivo
llama3.1:8b-q4 Inicial ~5 GB Prototipo. Limitado en español y contexto largo.
llama3.1:8b-q8 Inicial ~9 GB Mayor calidad, pero ventana de contexto insuficiente (4K).
JARVIS (rag-qwen-ft) Actual ✓ ~8 GB Qwen 2.5 14B + LoRA sobre docs corporativos. Español nativo, 8K ctx.
qwen2.5:32b-q4_K_M Actual ✓ ~19 GB Consultas ANALYTICAL (routing automático) + summarización de historial largo. 32K ctx.
qwen2.5vl:7b Actual ✓ ~6 GB Vision-Language: análisis de imágenes, OCR asistido.
MiniLM-L12-v2 Actual ✓ CPU Embeddings multilingüe 384 dims. Fine-tuned sobre corpus corporativo.

* La migración de Llama → Qwen se realizó en diciembre 2025. Qwen 2.5 superó a Llama 3.1 en comprensión del español (+23%), seguimiento de instrucciones complejas y contexto largo. En v2.3.0 se añadió smart model routing: JARVIS para consultas rápidas/precisas, qwen2.5-32b para análisis complejos. Documentado en docs/FINE_TUNING_GUIDE.md.