NEXA MULTIMODAL RAG
Motor RAG (Retrieval‑Augmented Generation) multimodal de alto rendimiento construido sobre principios de Arquitectura Hexagonal, preparado para servir como base de conocimiento a sistemas de agentes autónomos.
Pure software architecture
Robust backend · No visual UI
Vista General del Proyecto
Diseñé y desarrollé Nexa, un motor de ingesta, vectorización y búsqueda semántica multimodal que transforma documentos heterogéneos (PDF, DOCX, JSON, imágenes) en vectores de alta calidad almacenados en ChromaDB. Implementé un pipeline de extracción híbrido que combina OCR local (PyMuPDF) con modelos en la nube (Mistral OCR, DeepSeek OCR 2) y un clasificador de páginas que decide en tiempo real cuál usar para minimizar costes. El sistema aplica dos estrategias de chunking intercambiables mediante una fábrica (Entity Chunker para catálogos, Recursive Chunker para documentos largos), enriquece imágenes con Gemini Flash‑Lite y vectoriza por lotes con Gemini Embedding 2. Expone una API REST multi‑tenant lista para ser consumida por agentes conversacionales externos como Aethelgard.
Módulos Core
Ingesta Multiformato con OCR Híbrido
Pipeline unificado que acepta PDF, DOCX, TXT, MD, JSON e imágenes. Un clasificador local (PyMuPDF) analiza cada página y decide si se extrae con texto nativo (coste 0) o se envía a Mistral OCR (alta precisión) o DeepSeek OCR 2 (ultra bajo coste). Incluye un DocumentExtractor que normaliza la salida a objetos ExtractedPage con contenido limpio y metadatos de página.
Chunking Estratégico con Fábrica de Estrategias
Dos estrategias de chunking intercambiables mediante el patrón Factory. EntityChunker (para catálogos y JSON) crea un chunk por producto y extrae automáticamente URLs de imágenes, SKU y precios a los metadatos. RecursiveChunker (para documentos largos) divide el texto respetando párrafos y oraciones con solapamiento configurable, garantizando la integridad semántica de cada fragmento.
Vectorización por Lotes y Base de Datos Vectorial
Gemini Embedding 2 Preview convierte textos y descripciones visuales en vectores de 3072 dimensiones. El adaptador GeminiEmbeddingAdapter envía múltiples textos en una sola llamada HTTP (batching), reduciendo drásticamente la latencia. Los vectores y metadatos se almacenan en ChromaDB (local) con soporte planificado para migración a pgvector en Supabase.
Búsqueda Multimodal con Orquestador Adaptativo
SearchOrchestrator consulta el tipo de colección y selecciona dinámicamente el retriever adecuado: CatalogRetriever (filtros por metadatos + umbral de similitud + reranking opcional) o DocumentRetriever (expansión de consulta y compresión de contexto mediante LLM). La respuesta incluye fuentes enriquecidas con número de página, tipo de chunk e imágenes asociadas.
Enriquecimiento Visual con Gemini Flash‑Lite
ImageEnricher detecta referencias a imágenes en el Markdown y lanza peticiones asíncronas en paralelo a Gemini Flash‑Lite. Genera descripciones textuales autocontenidas que se almacenan como chunks de tipo 'image', permitiendo búsquedas semánticas sobre el contenido visual de gráficos, tablas y fotografías.
API Multi‑tenant y Administración
Endpoints REST para gestión de usuarios, negocios, canales y colecciones. Cada negocio puede asociarse a múltiples colecciones y canales (WhatsApp Cloud API, widget web). Los módulos users, businesses, collections y documents encapsulan su propia lógica de negocio, repositorios y esquemas Pydantic.
Arquitectura Hexagonal y Contratos de Datos
El sistema sigue estrictamente los principios de Ports & Adapters. Las dependencias se invierten mediante puertos (ICollectionRepository, IDocumentRepository, IVectorStore, IEmbeddingProvider, ILLMClient) que son implementados por adaptadores concretos. Un contenedor de inyección de dependencias (Container) centraliza la instanciación, facilitando el cambio de tecnologías sin tocar la lógica de negocio.