Módulo 8: Proyecto Final Integrador
3. Etapa 2: Diseño de Arquitectura
Descripción
En esta etapa diseñas la arquitectura completa del sistema RAG: componentes, flujos de datos, tecnologías, y diagramas.
Componentes principales
Basándote en requisitos y restricciones, tu arquitectura debe incluir:
1. Ingestion Pipeline (offline)
PDFs/LaTeX/DOCX → Extracción de texto → Chunking → Embeddings → Vector DB
2. Query Processing (online)
User Query → Detección de tipo → Búsqueda (semantic/keyword/hybrid) → Resultados
3. RAG Pipeline (online, para Q&A)
Query → Retrieval → Augmentation → LLM → Response
Diagrama de arquitectura (solución sugerida)
┌─────────────────────────────────────────────────────────┐
│ INGESTION (Offline) │
├─────────────────────────────────────────────────────────┤
│ │
│ [100K Docs] (PDF, LaTeX, DOCX) │
│ ↓ │
│ [Text Extraction] │
│ - PyPDF2 (PDFs) │
│ - pandoc (LaTeX → text) │
│ - python-docx (DOCX) │
│ ↓ │
│ [Chunking] │
│ Strategy: Hierarchical (por secciones) │
│ Size: 600 tokens, overlap 100 │
│ ↓ │
│ [Embeddings] │
│ Model: Sentence-BERT local (all-mpnet-base-v2) │
│ Dimensions: 768D │
│ ↓ │
│ [Metadata Extraction] │
│ - Author, year, department, type │
│ ↓ │
│ [Vector Database] │
│ - Weaviate (self-hosted) │
│ - HNSW index │
│ - ~500K chunks (100K docs × 5 chunks avg) │
│ │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ QUERY PROCESSING (Online) │
├─────────────────────────────────────────────────────────┤
│ │
│ [User Query] │
│ ↓ │
│ [Query Analysis] │
│ ¿Contiene metadata exacta? (author, year, ID) │
│ └─ YES: Exact match (keyword + filter) │
│ └─ NO: Semantic search │
│ ↓ │
│ ┌──────────────┬──────────────┐ │
│ │ Keyword │ Semantic │ │
│ │ (BM25) │ (cosine) │ │
│ └──────┬───────┴──────┬───────┘ │
│ │ │ │
│ └──────┬───────┘ │
│ │ │
│ v │
│ [RRF Fusion] (k=60) │
│ ↓ │
│ [MMR] (λ=0.6, diversidad) │
│ ↓ │
│ [Metadata Boost] │
│ - Papers < 2 años: 1.2x │
│ ↓ │
│ [Top-20 Results] │
│ │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ RAG PIPELINE (Q&A) │
├─────────────────────────────────────────────────────────┤
│ │
│ [User Question] │
│ "¿Qué metodología usa el paper de Smith?" │
│ ↓ │
│ [Retrieval] (same as Query Processing) │
│ Top-5 chunks │
│ ↓ │
│ [Augmentation] │
│ Build prompt: │
│ "Contexto: [5 chunks] │
│ Pregunta: [user question]" │
│ ↓ │
│ [LLM Generation] │
│ Model: GPT-3.5 Turbo │
│ Temperature: 0.1 │
│ Max tokens: 500 │
│ ↓ │
│ [Response + Sources] │
│ "Según el paper de Smith (2023): │
│ La metodología consiste en..." │
│ │
└─────────────────────────────────────────────────────────┘
Decisiones de arquitectura
Decisión 1: Embeddings locales (Sentence-BERT)
Justificación:
- ✅ Restricción: Datos privados (no pueden salir)
- ✅ Costo: $0 después de setup (GPU local)
- ✅ Calidad: Sentence-BERT (all-mpnet-base-v2) es competitivo para textos académicos
- ❌ Trade-off: 768D (vs 1536D OpenAI), menor calidad pero aceptable
Alternativa rechazada: OpenAI embeddings (viola restricción de privacidad)
Decisión 2: Weaviate self-hosted (vector DB)
Justificación:
- ✅ Open-source (no costo de licencia)
- ✅ HNSW nativo (rápido para 500K chunks)
- ✅ Hybrid search nativo (keyword + semantic)
- ✅ Metadata filtering (author, year, department)
- ✅ Self-hosted (datos privados)
Alternativa rechazada: Pinecone (managed pero costo $70-200/mes, suma a presupuesto)
Decisión 3: GPT-3.5 Turbo para LLM
Justificación:
- ✅ Costo: 20x más barato que GPT-4 ($0.0005 vs $0.01/1K tokens)
- ✅ Latencia: 2x más rápido (1-2s vs 2-5s)
- ⚠️ Trade-off: Menor calidad que GPT-4, pero suficiente para Q&A académico
Alternativa considerada: Llama 3 (self-hosted) → Ahorra costo pero requiere GPU dedicada adicional
Decisión 4: Hybrid search (RRF) + MMR
Justificación:
- ✅ RF2 (búsqueda exacta): Keyword garantiza matches exactos (author, year)
- ✅ RF1 (búsqueda conceptual): Semantic entiende sinónimos
- ✅ RF4 (diversidad): MMR evita 20 papers similares
Implementación:
1. Ejecutar keyword (BM25) y semantic (cosine) en paralelo
2. Fusionar con RRF (k=60)
3. Aplicar MMR (λ=0.6) sobre top-100 → Diversificar a top-20
4. Boost temporal (papers recientes)
Decisión 5: Chunking hierarchical (por secciones)
Justificación:
- ✅ Papers tienen estructura (Abstract, Methods, Results, Conclusion)
- ✅ Chunks semánticamente coherentes (sección completa)
- ✅ Metadata por chunk (ej: section="Methods")
Parámetros:
- Tamaño: 600 tokens (balance contexto/precisión)
- Overlap: 100 tokens (captura transiciones)
- Estrategia: Dividir por headers Markdown (##, ###) o detectar secciones en PDFs
Stack tecnológico completo
Ingestion:
- Text extraction: PyPDF2, pandoc, python-docx
- Chunking: LangChain RecursiveCharacterTextSplitter
- Embeddings: Sentence-BERT (all-mpnet-base-v2)
- Orchestration: Python scripts + Airflow (para re-indexación periódica)
Storage:
- Vector DB: Weaviate (self-hosted en GPU server)
- Metadata DB (opcional): PostgreSQL (para queries complejas sobre metadata)
Query Processing:
- API: FastAPI
- Search: Weaviate hybrid search (BM25 + cosine)
- Ranking: Custom (RRF + MMR en Python)
RAG:
- LLM: OpenAI GPT-3.5 Turbo (API)
- Prompting: Custom prompt templates
- Streaming: OpenAI streaming API (mejor UX)
Infrastructure:
- Embedding server: GPU server (NVIDIA T4, $0.35/hora = $250/mes)
- Weaviate server: CPU + SSD (c5.2xlarge AWS, $0.34/hora = $245/mes)
- API server: Serverless (AWS Lambda + API Gateway, ~$50/mes)
Flujos de datos
Flujo 1: Indexación inicial (una vez)
1. Extraer texto de 100K docs (paralelo, 24 horas)
2. Chunking hierarchical → 500K chunks
3. Generar embeddings (Sentence-BERT local):
- Batch size: 32
- Throughput: ~1000 chunks/minuto
- Tiempo: 500K / 1000 = 500 minutos (~8 horas)
4. Upsert a Weaviate (batch 100):
- Tiempo: ~2 horas
Total: ~34 horas (1.5 días)
Costo: $0 (hardware ya existe)
Flujo 2: Query de búsqueda (typical)
User: "papers sobre machine learning después de 2020"
1. Parse query:
- Tema: "machine learning"
- Filtro: year >= 2020
2. Embedding de query (Sentence-BERT local): 50ms
3. Weaviate hybrid search:
- Keyword: "machine learning" (BM25)
- Semantic: embedding coseno
- Filtro: year >= 2020
- Top-K: 100
- Latencia: 80ms
4. RRF fusion + MMR (Python): 100ms
5. Retornar top-20 → Usuario
Total latency: 230ms ✅ (< 2s target)
Flujo 3: Query de Q&A (RAG)
User: "¿Qué dice el paper de Smith sobre NLP?"
1. Retrieval (same as Flujo 2):
- Filtro: author = "Smith" AND topic ~ "NLP"
- Top-5 chunks
- Latency: 230ms
2. Build prompt (Python): 10ms
3. LLM generation (GPT-3.5 Turbo):
- Input: 2500 tokens (query + 5 chunks)
- Output: 300 tokens
- Latency: 1200ms (streaming)
4. Return response + sources
Total latency: 1440ms ✅ (< 2s target)
Resumen de arquitectura
Componentes:
- Sentence-BERT (embeddings locales)
- Weaviate (vector DB self-hosted)
- GPT-3.5 Turbo (LLM)
- FastAPI (API)
- Airflow (orchestration)
Flujos:
- Indexación: 34 horas (una vez)
- Búsqueda: 230ms
- Q&A (RAG): 1440ms
Cumplimiento de requisitos:
- ✅ Latencia < 2s
- ✅ Datos privados (embeddings locales)
- ✅ Búsqueda semántica + exacta
- ✅ Q&A con LLM
- ✅ Diversidad (MMR)
Próxima etapa: 04-technical-decisions.md — Justificar decisiones específicas (chunking, top-K, parámetros).