- Descripción General
- Arquitectura Dual: RAG vs Ventana de Contexto
- Implementaciones Técnicas
- Sistema Inteligente de Clasificación
- Arquitectura y Optimización
- Frontend y Experiencia de Usuario
- Tecnologías y Frameworks
- Instalación y Uso
- Contribución
- Licencia
Este proyecto implementa y compara dos arquitecturas avanzadas de chatbot aplicadas a la consulta de información curricular. El objetivo es analizar las diferencias en rendimiento, precisión y experiencia de usuario entre:
- Generación Aumentada por Recuperación (RAG) con Llama 3.3 y LlamaIndex
- Modelo con Gran Ventana de Contexto usando Gemini Flash
Ambos chatbots proporcionan respuestas detalladas sobre mi experiencia profesional, habilidades y formación, pero utilizan mecanismos fundamentalmente diferentes para acceder y procesar la información. Este proyecto ofrece así un interesante caso de estudio sobre los trade-offs entre diferentes arquitecturas de IA conversacional.
RAG (Retrieval Augmented Generation) es una arquitectura que combina:
-
Recuperación (Retrieval): El sistema busca en tiempo real información relevante en una base de conocimientos (en este caso, mi CV indexado con embeddings vectoriales).
-
Generación Aumentada: El modelo de lenguaje (LLM) utiliza la información recuperada para generar respuestas más precisas y fundamentadas en datos concretos.
RAG funciona como un sistema de dos etapas:
- Primero convierte la pregunta del usuario en una consulta vectorial
- Luego busca los fragmentos más relevantes del CV mediante similitud semántica
- Finalmente, proporciona estos fragmentos como contexto adicional al LLM para generar la respuesta
La ventana de contexto determina cuánta información puede "ver" un modelo en una sola conversación. Modelos como Gemini Flash poseen una ventana de contexto excepcionalmente grande (hasta 1 millón de tokens), lo que permite:
- Cargar documentos completos (como mi CV) directamente en el prompt
- Mantener toda la conversación previa dentro del contexto
- Responder basándose en una comprensión holística del documento sin necesidad de recuperación externa
En este enfoque, el modelo tiene acceso constante a toda la información, similar a como un humano tendría un documento completo frente a él durante toda la conversación.
| Aspecto | Enfoque RAG | Enfoque Gran Ventana |
|---|---|---|
| Precisión | Precisión variable dependiente de la calidad de recuperación y estrategia de chunking | Comprensión completa del documento con visión global |
| Flexibilidad | Puede acceder a grandes volúmenes de información externa | Limitado estrictamente a lo que se cargó en la ventana de contexto |
| Consumo de recursos | Uso eficiente de tokens en el LLM, pero requiere infraestructura para vectorización e indexación | Consumo elevado de tokens en cada consulta independientemente de su complejidad |
| Velocidad | Mayor latencia debido al proceso de búsqueda + generación | Respuesta más directa y rápida al tener toda la información pre-cargada |
| Escalabilidad | Puede escalar prácticamente sin límites en volumen de información | Estrictamente limitado por el tamaño máximo de la ventana de contexto |
| Dependencia de chunking | Altamente dependiente de la estrategia de segmentación; chunks mal diseñados pueden omitir información relevante | No requiere chunking, eliminando este posible problema |
| Adaptabilidad | Permite actualizar la base de conocimientos sin reentrenamiento | Requiere regenerar el prompt completo para actualizar información |
Esta implementación utiliza:
- Modelo base: Llama 3.3 70B de Groq
- Framework RAG: LlamaIndex para indexación y recuperación
- Embeddings: BGE-M3 (BAAI) a través de DeepInfra para crear representaciones vectoriales del CV
- Almacenamiento: Índice vectorial persistente para optimizar rendimiento
- Backend: Flask con arquitectura RESTful
- Manejo de sesiones: Sistema de historial de conversación con contexto persistente
El flujo de funcionamiento:
- La consulta del usuario se vectoriza
- Se recuperan los fragmentos más relevantes del CV
- Se combina la consulta, fragmentos relevantes e historial de conversación
- Se genera una respuesta contextualizada con el modelo Llama 3.3 70B
Esta versión aprovecha la enorme ventana de contexto:
- Modelo principal: Gemini 2.0 Flash (1M tokens de contexto)
- Modelo alternativo: Gemini 2.0 Flash-Lite (para consultas sencillas)
- Prompt Engineering: CV completo incluido en el contexto inicial
- Clasificador: BERT en español para categorizar consultas
- Integración: LiteLLM para gestión de API y solicitudes
- Gestión de memoria: Optimización del historial de conversación
Funcionamiento:
- El CV completo se carga en el contexto del modelo (System Prompt)
- BERT clasifica la consulta por complejidad
- Se selecciona el modelo apropiado (Flash o Flash-Lite)
- Se genera la respuesta con todo el contexto disponible
El sistema BERT implementado en la versión Gemini clasifica las consultas en tres categorías:
-
Consultas simples (0): Preguntas directas sobre información básica del CV
- Ejemplo: "¿Dónde estudió Marcos?"
- Procesadas por: Gemini Flash-Lite (más económico y rápido)
-
Consultas complejas (1): Preguntas que requieren análisis, razonamiento o síntesis
- Ejemplo: "¿Cómo se complementan sus habilidades técnicas y de gestión?"
- Procesadas por: Gemini Flash (más potente y con mayor capacidad de razonamiento)
-
Consultas fuera de ámbito (2): Preguntas no relacionadas con el CV
- Ejemplo: "¿Cómo funciona la fusión nuclear?"
- Resultado: Bloqueadas para evitar uso inadecuado del sistema
Esta clasificación inteligente permite:
- Optimizar costos dirigiendo consultas al modelo más adecuado
- Mejorar tiempos de respuesta para preguntas simples
- Mantener el enfoque del chatbot en su propósito específico
- Prevenir posibles abusos o desvíos del tema principal
El clasificador BERT ha sido entrenado utilizando un cuaderno Jupyter que puede encontrarse dentro de la carpeta "Extra". Este notebook documenta todo el proceso de preparación de datos, entrenamiento y evaluación del modelo de clasificación, permitiendo reproducir o mejorar el clasificador según sea necesario.
Ambas implementaciones comparten elementos arquitectónicos clave:
- Separación backend/frontend: API REST desacoplada de la interfaz de usuario
- Gestión de sesiones: Identificadores únicos para mantener conversaciones coherentes
- Persistencia: Almacenamiento eficiente de índices (en LlamaIndex) y sesiones
- Concurrencia: Control de solicitudes simultáneas para evitar sobrecarga
- Caducidad: Limpieza automática de sesiones inactivas
- Prompt Engineering: Instrucciones detalladas para garantizar respuestas profesionales y precisas
Optimizaciones específicas:
- RAG: Chunking personalizado, caching de embeddings
- Contexto: Gestión eficiente de tokens, historial selectivo, plantillas de prompt optimizadas
Ambas versiones presentan interfaces modernas y responsivas:
- UI Adaptativa: Diseño responsive con Tailwind CSS
- Animaciones: Transiciones suaves para mejorar la experiencia
- Mensajes de Estado: Indicadores durante el procesamiento con etapas descriptivas
- Markdown: Soporte completo para respuestas formateadas con listas, enlaces, etc.
- Historial: Persistencia de conversaciones entre sesiones
- Accesibilidad: Contraste adecuado y estructuras semánticas
- Mobile-first: Optimizado para dispositivos móviles y escritorio
- Llama 3.3 70B: A través de Groq API
- Gemini 2.0 Flash/Flash-Lite: Google AI API
- BGE-M3: Embeddings vía DeepInfra
- BERT: Fine-tuned para clasificación de intenciones
- LlamaIndex: Framework para implementación RAG
- Flask: Backend ligero y eficiente
- Tailwind CSS: Estilizado moderno y responsive
- LiteLLM: Abstracción para APIs de cualquier proveedor de LLM
- Marcado/Renderizado: Marked.js para procesamiento de markdown
- LocalStorage: Persistencia en el lado cliente
- Python 3.10+
- API Keys: Groq, Google AI, DeepInfra
Sigue estos pasos para configurar el backend:
-
Clona el repositorio
Ejecuta en la terminal:git clone https://github.com/warc0s/Chatbot_CV.git cd Chatbot_CV -
Crea un entorno virtual
Ejecuta:python -m venv venvActiva el entorno:
-
En Linux/macOS:
source venv/bin/activate -
En Windows:
venv\Scripts\activate
-
-
Instala las dependencias
Ejecuta:pip install -r requirements.txt -
Configura las variables de entorno
Edita el archivo.enve introduce tus API Keys. -
Inicia el servidor
Ejecuta:python app.py
Una vez iniciado el servidor, el frontend estará disponible en:
http://localhost:5000
Las contribuciones son bienvenidas. Para contribuir:
- Haz un fork del repositorio
- Crea una rama para tu característica (
git checkout -b feature/nueva-caracteristica) - Realiza tus cambios y haz commit (
git commit -am 'Añadir nueva característica') - Sube los cambios (
git push origin feature/nueva-caracteristica) - Abre un Pull Request
Este proyecto está licenciado bajo Apache License 2.0. Consulta el archivo LICENSE para más detalles.
