Spaces:
Running
Running
| title: Chatbot RAG PLS | |
| emoji: 🤖 | |
| colorFrom: blue | |
| colorTo: green | |
| sdk: docker | |
| pinned: false | |
| # 🤖 Prepa en Línea SEP - Asistente Educativo RAG | |
| Asistente virtual con tecnología RAG (Retrieval-Augmented Generation) para estudiantes de Prepa en Línea SEP. Chatbot educativo que responde dudas sobre Convocatoria, Normativa, Protocolos y Guías del programa. | |
|  | |
|  | |
|  | |
|  | |
| ## 🎯 Características Principales | |
| - **RAG con Groq API**: Sistema de Retrieval-Augmented Generation usando LLaMA 3.3 70B Versatile vía Groq API | |
| - **Sin GPU necesaria**: Todo via APIs externas (Groq, embeddings); ejecución en CPU | |
| - **Búsqueda Vectorial**: FAISS con embeddings multilingües optimizados para español | |
| - **Soporte Multi-formato**: Procesa PDF, Word (docx), Excel (xlsx) y TXT | |
| - **Re-ranking y Query Expansion**: Calidad preservada con menos chunks (top_k=5) | |
| - **Interfaz Web**: Dashboard responsive tipo chat | |
| ## 🛠️ Tecnologías | |
| | Categoría | Tecnología | | |
| |----------|------------| | |
| | **Framework API** | FastAPI + Uvicorn | | |
| | **LLM** | Groq API — LLaMA 3.3 70B Versatile | | |
| | **Embeddings** | intfloat/multilingual-e5-small (local, 384 dims) | | |
| | **Vector Store** | FAISS (cpu, FlatL2, top_k=5 optimizado) | | |
| | **Re-ranking** | Activado con query expansion | | |
| | **Procesamiento Documentos** | PyMuPDF (PDF), python-docx (Word), openpyxl (Excel) | | |
| | **Frontend** | HTML/CSS/JS Vanilla (responsive) | | |
| | **Despliegue** | Docker · Hugging Face Spaces | | |
| | **Orquestación** | Ninguna (sin Celery/Redis, respuestas directas) | | |
| | **Evaluación Automática** | Desactivada por defecto (ahorro de tokens) | | |
| ## ⚡ Optimización de Tokens (Groq API) | |
| ### Problema Identificado | |
| Consumo excesivo de **~4,500 tokens por consulta** que agotaba el límite gratuito de 100K tokens en menos de **25 interacciones**. | |
| ### Soluciones Implementadas | |
| | Optimización | Antes | Después | Reducción | | |
| |-------------|-------|---------|-----------| | |
| | **Chunks de contexto** | 10 chunks | 5 chunks | 50% menos tokens | | |
| | **Prompt del sistema** | ~250 tokens | ~60 tokens | **76% menos** | | |
| | **TOP_K_RESULTS** | 10 | 5 | 50% menos chunks | | |
| ### Resultados Clave | |
| | Métrica | Antes | Después | Mejora | | |
| |---------|-------|---------|--------| | |
| | **Tokens por consulta** | ~4,500 | ~1,500 | **67% menos** | | |
| | **Consultas diarias posibles** | 20-22 | 60-65 | **+200%** | | |
| | **Margen de seguridad** | 0% | 70% | ✅ | | |
| ### Mecanismos que Preservan la Calidad | |
| - **Re-ranking activado**: los 5 chunks finales son los más relevantes | |
| - **Filtrado por metadata**: elimina chunks no relacionados al contexto | |
| - **Query expansion**: expande la consulta para mejor recall sin añadir tokens al LLM | |
| ### Configuración Final Optimizada | |
| ```python | |
| # optimized_retriever.py | |
| self.config = { | |
| "top_k_initial": 10, | |
| "top_k_final": 5, | |
| "min_similarity": 0.2, | |
| "use_reranking": True, | |
| "use_query_expansion": True, | |
| "use_multi_query": True, | |
| } | |
| ``` | |
| ### Prompt Optimizado | |
| ```python | |
| # gemma_generator.py → GroqWrapper | |
| system_msg = "Eres asistente de [CLIENTE]. Respuestas claras en español." | |
| user_prompt = f"Contexto oficial: {context}\n\nPregunta: {question}\n\nRespuesta:" | |
| ``` | |
| > ⚠️ El sistema está optimizado para consumir **~1,500 tokens por consulta**, permitiendo **~65 interacciones diarias** en la capa gratuita de Groq API. El margen de seguridad es del **70%**. | |
| ## 📊 Dashboard de Métricas Avanzadas | |
| ### Problemas resueltos | |
| | Problema | Solución | | |
| |----------|----------| | |
| | Confianza del 98.6% pero respuestas inútiles | **Tasa de Éxito Real**: detecta respuestas como "no encontré información" | | |
| | No se veía distribución horaria de consumo | **Gráfico ASCII por hora**: muestra picos de consumo de tokens | | |
| ### Métricas implementadas | |
| **1. Tasa de Éxito Real (Calidad de respuestas)** | |
| - Detecta patrones de respuestas no útiles: "no encontré información", "tuve un problema", "intenta de nuevo" | |
| - Diferencia entre confianza del sistema vs utilidad real | |
| **2. Consumo de tokens por hora** | |
| - Gráfico ASCII mostrando consumo en últimas 24 horas | |
| - Identifica horas pico (ejemplo: 04:00 AM con 2,777 tokens) | |
| ### Ejemplo del dashboard | |
| ``` | |
| ┌──────────────────────────────────────────────────────────────────┐ | |
| │ 📊 Tasa de Éxito: 94% │ | |
| │ útiles: 135 | no útiles: 8 │ | |
| │ ████████████████████████████████████████░░░░░░░░ 94% │ | |
| └──────────────────────────────────────────────────────────────────┘ | |
| ┌──────────────────────────────────────────────────────────────────┐ | |
| │ 📈 Consumo de Tokens por Hora │ | |
| │ │ | |
| │ 04:00 │ ████████████████████ 2777 tokens │ | |
| │ 20:00 │ ████████████████ 2345 tokens │ | |
| │ 23:00 │ ████████ 1234 tokens │ | |
| │ │ | |
| │ 🔵 Pico máximo: 2777 tokens/hora | 📊 Promedio: 1850 tokens/hora │ | |
| └──────────────────────────────────────────────────────────────────┘ | |
| ``` | |
| ### Beneficios | |
| - **Antes**: "El sistema tiene 98.6% de confianza" (métrica engañosa) | |
| - **Ahora**: "94% de respuestas RAG son útiles, 6% son 'no encontré información'" | |
| - Permite identificar consultas problemáticas y horas de mayor carga | |
| ### Acceso | |
| El dashboard está disponible en: `/user-dashboard` | |
| ## 🔄 CI/CD Pipeline | |
| ### ¿Qué es y por qué lo necesitamos? | |
| CI/CD automatiza pruebas y despliegues. Cada cambio en el código se valida automáticamente antes de llegar a producción. | |
| | Beneficio | Antes | Después | | |
| |-----------|-------|---------| | |
| | Detección de errores | En producción (usuarios afectados) | Antes del despliegue (2-3 minutos) | | |
| | Tiempo de recuperación | 15-30 minutos manual | 0 minutos (no se despliega código roto) | | |
| | Confianza en despliegues | Baja | Alta (pruebas automáticas) | | |
| | Despliegue a HF Spaces | Manual con git push --force | Automático al hacer push a main | | |
| ### Arquitectura del Pipeline | |
| ``` | |
| git push → GitHub Actions → Pruebas automáticas → ¿OK? → Despliegue a HF Spaces | |
| ↓ | |
| [Fallo] → Notificar (pendiente) | |
| ``` | |
| ### Pruebas implementadas | |
| | Prueba | Qué verifica | Tiempo | | |
| |--------|--------------|--------| | |
| | Conexión Groq | API key válida, modelo responde | 2 seg | | |
| | Importación API | Sin errores de sintaxis o imports | 1 seg | | |
| | GroqWrapper | Inicialización correcta | 1 seg | | |
| | RAGSystem | Carga de índices FAISS (108 vectores) | 2 seg | | |
| **Tiempo total del pipeline: ~1 min 38 seg** | |
| ### Flujo de trabajo | |
| ```yaml | |
| name: CI/CD - Test & Deploy | |
| on: | |
| push: | |
| branches: [main] | |
| jobs: | |
| test: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - Checkout código | |
| - Setup Python 3.11 | |
| - Instalar dependencias | |
| - Verificar archivos críticos | |
| - Test conexión Groq (real) | |
| - Test importación API | |
| - Test RAG system | |
| deploy: | |
| needs: test | |
| if: success() | |
| - Despliegue automático a Hugging Face Spaces | |
| ``` | |
| ### Variables de entorno requeridas (GitHub Secrets) | |
| | Secret | Propósito | | |
| |--------|-----------| | |
| | `GROQ_API_KEY` | Autenticación con Groq para pruebas reales | | |
| | `HF_TOKEN` | Autenticación para desplegar a Hugging Face Spaces | | |
| ### Resultados obtenidos | |
| - ✅ **Tasa de éxito de pruebas**: 100% | |
| - ✅ **Tiempo de detección de errores**: 2 minutos | |
| - ✅ **Impacto en usuarios por errores**: 0 (nunca se despliega código roto) | |
| - ✅ **Despliegues automáticos**: Funcionando | |
| ### Compatibilidad con otros destinos | |
| El pipeline es portable. Para migrar a VPS, AWS o Docker Hub solo se necesita agregar un step adicional: | |
| ```yaml | |
| # Ejemplo: despliegue a VPS con Docker | |
| - name: Deploy to VPS | |
| uses: appleboy/ssh-action@v1.0.0 | |
| with: | |
| host: ${{ secrets.VPS_HOST }} | |
| script: docker-compose up -d | |
| ``` | |
| ### Próximas mejoras | |
| | Prioridad | Acción | Impacto | | |
| |-----------|--------|---------| | |
| | 1 | Cache de pip en workflow | Reduce tiempo 90s → 30s | | |
| | 2 | Notificaciones a Telegram/Slack | Visibilidad inmediata de fallos | | |
| | 3 | Pruebas unitarias por módulo | Mayor cobertura | | |
| | 4 | Smoke test post-despliegue | Verifica que HF reconstruyó bien | | |
| ## 📁 Estructura del Proyecto | |
| ``` | |
| Chatbot-RAG-Fuente-Base/ | |
| ├── api/ | |
| │ ├── main.py # FastAPI + diagnóstico FAISS | |
| │ └── endpoints.py # Endpoints /upload, /search | |
| ├── rag/ | |
| │ ├── core.py # RAGSystem principal | |
| │ ├── gemma_generator.py # Generador → GroqWrapper | |
| │ ├── generator.py # Generator legacy (TinyLlama, no usado) | |
| │ ├── optimized_retriever.py # Retrieval con expansión de queries | |
| │ ├── retriever.py # VectorStoreFAISS | |
| │ └── embeddings.py # EmbeddingModel (e5-small) | |
| ├── models/ | |
| │ ├── groq_wrapper.py # Groq API wrapper (LLaMA 3.3 70B) | |
| │ ├── gemini_wrapper.py # Gemini API wrapper (alternativa) | |
| │ ├── ollama_wrapper.py # Legacy (no usado) | |
| │ └── tinyllama_wrapper.py # Legacy (no usado) | |
| ├── evaluation/ | |
| │ ├── automated_evaluator.py # Tests automáticos | |
| │ ├── generate_dashboard.py # Visualización de resultados | |
| │ └── test_set.json # 20 preguntas de evaluación | |
| ├── scripts/ | |
| │ └── load_chunks_to_rag.py # Carga de documentos al vector store | |
| ├── config/ | |
| │ └── settings.py # Configuración centralizada | |
| ├── static/ | |
| │ └── index.html # Frontend web responsive | |
| ├── data/ | |
| │ └── vector_store/ # Índice FAISS + metadatos | |
| ├── Dockerfile # Imagen Docker para HF Spaces | |
| └── requirements.txt # Dependencias Python | |
| ``` | |
| ## 🚀 Instalación Local | |
| ```bash | |
| # 1. Clonar repositorio | |
| git clone https://github.com/tu-usuario/Chatbot-RAG-Fuente-Base.git | |
| cd Chatbot-RAG-Fuente-Base | |
| # 2. Crear entorno virtual | |
| python -m venv venv | |
| source venv/bin/activate # Linux/Mac | |
| # venv\Scripts\activate # Windows | |
| # 3. Instalar dependencias | |
| pip install -r requirements.txt | |
| # 4. Configurar variables de entorno (crear archivo .env) | |
| # Obtén tu API Key en https://console.groq.com/keys | |
| echo "GROQ_API_KEY=tu_api_key_aqui" > .env | |
| # 5. Cargar documentos al vector store | |
| python scripts/load_chunks_to_rag.py | |
| # 6. Iniciar API | |
| uvicorn api.main:app --reload | |
| ``` | |
| ## 📖 Uso de la API | |
| ### Endpoint Principal | |
| ```bash | |
| curl -X POST "http://localhost:8000/chat" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"message": "¿El módulo propedéutico es obligatorio?"}' | |
| ``` | |
| ### Respuesta | |
| ```json | |
| { | |
| "response": "Sí, el módulo propedéutico es obligatorio.", | |
| "sources": ["bases_convocatoria_g85.pdf"], | |
| "is_rag_response": true, | |
| "confidence": 0.85 | |
| } | |
| ``` | |
| ### Documentación API | |
| - Swagger UI: http://localhost:8000/api/docs | |
| - ReDoc: http://localhost:8000/api/redoc | |
| ## 🧪 Validación del Sistema | |
| 4 preguntas críticas para verificar que el RAG funciona correctamente: | |
| | Pregunta | Respuesta Esperada | | |
| |----------|-------------------| | |
| | ¿El módulo propedéutico es obligatorio? | Sí | | |
| | ¿Qué significa escribir en mayúsculas? | Gritar | | |
| | ¿Cuánto dura la prepa? | 2 años 6 meses | | |
| | ¿La prepa es gratuita? | Sí, completamente gratis | | |
| ```bash | |
| # Probar validación | |
| curl -X POST "http://localhost:8000/chat" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"message": "¿El módulo propedéutico es obligatorio?"}' | |
| ``` | |
| ## 🌐 Despliegue | |
| ### Hugging Face Spaces (Docker) | |
| El proyecto incluye un `Dockerfile` listo para usar. El Space debe configurarse con **sdk: docker** (ya incluido en la cabecera YAML). | |
| 1. Configurar `GROQ_API_KEY` en los **Secrets** del Space | |
| 2. El hardware **CPU (8 vCPU, 32GB RAM)** es suficiente (no requiere GPU) | |
| 3. Hacer push al repositorio de Hugging Face | |
| ## 📊 Métricas del Sistema | |
| | Métrica | Valor | | |
| |--------|-------| | |
| | **Chunks Indexados** | 108 | | |
| | **Dimensión Embedding** | 384 | | |
| | **Tokens por Consulta** | ~1,500 (optimizado) | | |
| | **Consultas Diarias (free tier)** | ~65 | | |
| | **Tiempo de Respuesta** | < 2s | | |
| ## 👨💻 Habilidades Demostradas | |
| - **Machine Learning**: RAG, embeddings, vector search | |
| - **Deep Learning**: LLMs (LLaMA 3.3 vía Groq API), prompt engineering | |
| - **APIs**: FastAPI, RESTful design | |
| - **DevOps**: Docker, Hugging Face Spaces | |
| - **Logging**: Diagnóstico avanzado, monitoreo, métricas de latencia | |
| - **Testing**: Evaluación automática con 20 casos de prueba | |
| - **Database**: FAISS, vector stores, NumPy | |
| ## 📝 Licencia | |
| MIT License - feel free to use for learning and personal projects. | |