- Descripción del Proyecto
- Características
- Arquitectura del Sistema
- Tecnologías Utilizadas
- Estructura del Proyecto
- Instalación
- Ejecución
- Modelo Transformer (Flan-T5)
- Dataset Math-QA
- Preprocesamiento de Texto
- Entrenamiento (Fine-Tuning)
- Evaluación
- API Endpoints
- Capturas de Pantalla
MathBot AI es un chatbot educativo especializado en matemáticas que utiliza modelos Transformer (Flan-T5 de Google) para comprender preguntas matemáticas escritas en lenguaje natural y generar respuestas útiles, coherentes y contextualizadas.
El proyecto demuestra el uso real de técnicas modernas de Procesamiento del Lenguaje Natural (PLN) incluyendo:
- Preprocesamiento de texto
- Tokenización con Transformers
- Generación de embeddings contextuales
- Fine-tuning de modelos preentrenados
- Generación de texto con beam search
- Evaluación con métricas NLP (BLEU, ROUGE)
- 📐 Álgebra: Ecuaciones, factorización, polinomios
- 📏 Geometría: Áreas, perímetros, volúmenes, teoremas
- 📐 Trigonometría: Funciones trigonométricas, identidades
- 📈 Cálculo: Derivadas, integrales, límites
- 📊 Estadística: Media, mediana, desviación estándar
- 🎲 Probabilidad: Eventos, distribuciones, Bayes
- 🔢 Aritmética: Operaciones, porcentajes, MCD/MCM
| Característica | Descripción |
|---|---|
| 🤖 Respuestas inteligentes | Generación de texto con modelo Transformer |
| 💬 Historial de conversación | Mantiene el contexto de la sesión |
| ⏱️ Tiempo de respuesta | Muestra el tiempo de cada respuesta |
| 🎨 Interfaz moderna | Diseño estilo ChatGPT con tema oscuro |
| 📱 Diseño responsive | Funciona en móvil, tablet y escritorio |
| ⌨️ Indicador de escritura | Animación de "escribiendo..." |
| 🔍 Preguntas rápidas | Botones predefinidos por categoría |
| 📊 Métricas del modelo | Panel de información del Transformer |
| Respuestas de respaldo desde dataset |
┌─────────────────────────────────────────────────────┐
│ USUARIO │
│ (Navegador Web) │
└──────────────────────┬──────────────────────────────┘
│ HTTP Request
▼
┌─────────────────────────────────────────────────────┐
│ INTERFAZ WEB (Frontend) │
│ HTML5 + CSS3 + JavaScript + Bootstrap 5 │
│ │
│ ┌──────────┐ ┌─────────────┐ ┌──────────────┐ │
│ │ Sidebar │ │ Chat Area │ │ Input Area │ │
│ │ Categorías│ │ Mensajes │ │ Textarea │ │
│ │ Quick Q │ │ Typing Ind. │ │ Send Button │ │
│ └──────────┘ └─────────────┘ └──────────────┘ │
└──────────────────────┬──────────────────────────────┘
│ API REST (JSON)
▼
┌─────────────────────────────────────────────────────┐
│ FLASK BACKEND │
│ (app.py - Python) │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ Rutas: │ │
│ │ POST /api/chat → Procesar pregunta │ │
│ │ GET /api/history → Historial │ │
│ │ GET /api/model-info → Info del modelo │ │
│ │ POST /api/clear → Limpiar historial │ │
│ └──────────────────────┬───────────────────────┘ │
└─────────────────────────┼───────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ PREPROCESAMIENTO (PLN) │
│ (preprocessing.py) │
│ │
│ 1. Conversión a minúsculas │
│ 2. Eliminación de caracteres especiales │
│ 3. Eliminación de espacios redundantes │
│ 4. Tokenización (NLTK + T5 Tokenizer) │
│ 5. Agregar prefijo de instrucción │
└──────────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ MODELO TRANSFORMER (Flan-T5) │
│ (chatbot.py) │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ google/flan-t5-base │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │ ENCODER │ ──────► │ DECODER │ │ │
│ │ │ │ │ │ │ │
│ │ │ Self- │ │ Cross- │ │ │
│ │ │ Attention│ │ Attention│ │ │
│ │ │ │ │ │ │ │
│ │ │ Multi- │ │ Beam │ │ │
│ │ │ Head │ │ Search │ │ │
│ │ └──────────┘ └──────────┘ │ │
│ │ │ │
│ │ Parámetros: ~248M │ │
│ │ Vocabulario: 32,128 tokens │ │
│ └─────────────────────────────────────────────┘ │
└──────────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ RESPUESTA GENERADA │
│ │
│ - Texto decodificado │
│ - Tiempo de respuesta │
│ - Fuente (model/dataset) │
│ - Almacenado en historial │
└──────────────────────┬──────────────────────────────┘
│ JSON Response
▼
┌─────────────────────────────────────────────────────┐
│ INTERFAZ WEB (Frontend) │
│ Muestra respuesta en burbuja de chat │
└─────────────────────────────────────────────────────┘
| Tecnología | Versión | Uso |
|---|---|---|
| Python | 3.11 | Lenguaje principal |
| Flask | 3.0 | Framework web |
| Flask-CORS | 4.0 | Cross-Origin Resource Sharing |
| Tecnología | Versión | Uso |
|---|---|---|
| Transformers | 4.36 | Modelos preentrenados (Flan-T5) |
| PyTorch | 2.1 | Framework de Deep Learning |
| NLTK | 3.8 | Procesamiento de lenguaje natural |
| SentencePiece | 0.1.99 | Tokenización subword |
| Tecnología | Versión | Uso |
|---|---|---|
| HTML5 | - | Estructura de la interfaz |
| CSS3 | - | Estilos y animaciones |
| JavaScript | ES6+ | Lógica del frontend |
| Bootstrap | 5.3 | Framework CSS responsive |
| Bootstrap Icons | 1.11 | Iconografía |
| Google Fonts | - | Tipografía Inter |
| Tecnología | Versión | Uso |
|---|---|---|
| Matplotlib | 3.8 | Generación de gráficos |
| Pandas | 2.1 | Análisis de datos |
mathbot_ai/
│
├── app.py # Aplicación principal Flask
├── config.py # Configuración centralizada
├── requirements.txt # Dependencias del proyecto
├── README.md # Documentación (este archivo)
│
├── dataset/
│ └── mathqa.json # Dataset de preguntas y respuestas
│
├── model/
│ ├── __init__.py # Inicializador del paquete
│ ├── chatbot.py # Motor del chatbot (Flan-T5)
│ ├── preprocessing.py # Preprocesamiento de texto (PLN)
│ ├── trainer.py # Fine-tuning del modelo
│ └── evaluator.py # Evaluación de rendimiento
│
├── templates/
│ └── index.html # Interfaz web del chatbot
│
├── static/
│ ├── css/
│ │ └── style.css # Estilos CSS personalizados
│ ├── js/
│ │ └── chat.js # JavaScript del chat
│ └── img/ # Imágenes del proyecto
│
├── results/
│ ├── metrics.csv # Métricas de evaluación
│ └── graphs.png # Gráficos de resultados
│
└── docs/ # Documentación adicional
- Python 3.11 o superior
- pip (gestor de paquetes de Python)
- Conexión a internet (para descargar el modelo la primera vez)
cd mathbot_aipython -m venv venv
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activatepip install -r requirements.txtpython -c "import nltk; nltk.download('punkt'); nltk.download('punkt_tab'); nltk.download('stopwords')"python app.pyAbrir el navegador en: http://localhost:5000
Para hacer fine-tuning del modelo con el dataset:
python model/trainer.pyPara evaluar el rendimiento del chatbot:
python model/evaluator.pypython model/preprocessing.pyUn Transformer es una arquitectura de red neuronal introducida en el paper "Attention Is All You Need" (Vaswani et al., 2017). Se basa en mecanismos de atención en lugar de recurrencia (RNN) o convolución (CNN).
Flan-T5 utiliza una arquitectura encoder-decoder:
- Encoder: Procesa la secuencia de entrada (pregunta) y genera representaciones contextuales
- Decoder: Genera la secuencia de salida (respuesta) token por token
El mecanismo de Self-Attention permite a cada token de la secuencia "atender" a todos los demás tokens:
Attention(Q, K, V) = softmax(QK^T / √dk) · V
Donde Q (Query), K (Key) y V (Value) son proyecciones lineales de los embeddings.
Multi-Head Attention ejecuta múltiples mecanismos de atención en paralelo:
MultiHead(Q, K, V) = Concat(head₁, ..., headₕ) · W^O
Cada "cabeza" puede capturar diferentes tipos de relaciones lingüísticas.
| Razón | Descripción |
|---|---|
| Instruction-tuned | Entrenado con instrucciones, ideal para Q&A |
| Open source | Gratuito y sin necesidad de API de pago |
| Eficiente | 248M parámetros, ejecutable en CPU |
| Encoder-decoder | Arquitectura completa para generación |
| Desarrollado y respaldado por Google Research | |
| Multilingüe | Capacidad de entender múltiples idiomas |
| Propiedad | Valor |
|---|---|
| Nombre | Math-QA |
| Fuente | Hugging Face (rvv-karma/Math-QA) |
| Formato | JSON |
| Registros locales | 50 pares pregunta-respuesta |
| Categorías | 7 (álgebra, geometría, trigonometría, cálculo, estadística, probabilidad, aritmética) |
{
"id": 1,
"category": "algebra",
"question": "What is the solution of 2x + 5 = 15?",
"answer": "To solve 2x + 5 = 15, subtract 5: 2x = 10. Divide by 2: x = 5.",
"difficulty": "easy"
}El pipeline de preprocesamiento implementa 7 pasos:
| Paso | Técnica | Ejemplo |
|---|---|---|
| 1 | Conversión a minúsculas | "ALGEBRA" → "algebra" |
| 2 | Eliminar caracteres especiales | "2+2??##" → "2+2" |
| 3 | Eliminar espacios redundantes | "hello world" → "hello world" |
| 4 | Tokenización NLTK | "hello world" → ["hello", "world"] |
| 5 | Construcción de vocabulario | 500+ tokens únicos |
| 6 | Tokens con Transformers | SentencePiece subword tokenization |
| 7 | Embeddings | Vectores de 768 dimensiones |
- Carga: Dataset JSON → lista de pares Q&A
- División: 80% entrenamiento / 20% validación
- Tokenización: Texto → IDs con T5 Tokenizer
- Optimización: AdamW con learning rate 3e-4
- Épocas: 3 épocas con gradient clipping
- Guardado: Mejor modelo según validation loss
| Parámetro | Valor |
|---|---|
| Épocas | 3 |
| Batch Size | 8 |
| Learning Rate | 3e-4 |
| Optimizador | AdamW |
| Max Input Length | 256 tokens |
| Max Output Length | 256 tokens |
| Métrica | Descripción |
|---|---|
| BLEU Score | Precisión de n-gramas (0-1) |
| ROUGE Score | Recall de unigramas (0-1) |
| Exact Match | Coincidencia exacta con referencia |
| Coherencia | Evaluación de estructura y fluidez |
| Utilidad | Relevancia del contenido matemático |
| Tiempo | Velocidad de generación de respuesta |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | / |
Página principal |
| POST | /api/chat |
Enviar pregunta al chatbot |
| GET | /api/history |
Obtener historial |
| POST | /api/clear |
Limpiar historial |
| GET | /api/model-info |
Información del modelo |
| GET | /api/welcome |
Mensaje de bienvenida |
| GET | /api/health |
Estado del servidor |
curl -X POST http://localhost:5000/api/chat \
-H "Content-Type: application/json" \
-d '{"message": "What is the derivative of x^2?"}'Proyecto universitario para la materia de Procesamiento del Lenguaje Natural (PLN).
Este proyecto es de uso académico y educativo.
MathBot AI - Tutor Inteligente de Matemáticas basado en Transformers 🤖📐
Desarrollado con ❤️ usando Python, Flask y Flan-T5