Spaces:
Sleeping
Sleeping
Commit ·
2a5dd49
1
Parent(s): 34511c9
Rewrite docs in Colombian Spanish
Browse filesCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ARCHITECTURE.md +35 -35
- README.md +6 -6
- USAGE.md +13 -13
ARCHITECTURE.md
CHANGED
|
@@ -1,77 +1,77 @@
|
|
| 1 |
-
#
|
| 2 |
|
| 3 |
-
##
|
| 4 |
|
| 5 |
```
|
| 6 |
-
GitHub (
|
| 7 |
│
|
| 8 |
-
└─► Hugging Face Spaces (
|
| 9 |
-
│
|
| 10 |
│
|
| 11 |
-
├─►
|
| 12 |
│ huggingface.co/cmeneses99/sms-classifier
|
| 13 |
│ (model.safetensors, tokenizer, config — ~520MB)
|
| 14 |
│
|
| 15 |
-
└─►
|
| 16 |
https://cmeneses99-sms-classifier-api.hf.space
|
| 17 |
|
| 18 |
-
cron-job.org ──GET /health
|
| 19 |
```
|
| 20 |
|
| 21 |
-
##
|
| 22 |
|
| 23 |
```
|
| 24 |
-
|
| 25 |
│
|
| 26 |
▼
|
| 27 |
FastAPI (routers/)
|
| 28 |
│
|
| 29 |
-
├── pages.py → HTML
|
| 30 |
├── inference.py → POST /classify, POST /classify/batch
|
| 31 |
└── meta.py → GET /health, GET /api/categories
|
| 32 |
│
|
| 33 |
▼
|
| 34 |
services/classifier.py
|
| 35 |
│
|
| 36 |
-
├──
|
| 37 |
│
|
| 38 |
-
└── miss ──► model_loader.py (
|
| 39 |
└── distilbert-base-multilingual-cased (fine-tuned)
|
| 40 |
-
└── top_k=3
|
| 41 |
```
|
| 42 |
|
| 43 |
-
##
|
| 44 |
|
| 45 |
-
|
|
| 46 |
|---|---|
|
| 47 |
-
|
|
| 48 |
-
|
|
| 49 |
-
|
|
| 50 |
-
|
|
| 51 |
-
|
|
| 52 |
-
| Runtime | CPU
|
| 53 |
-
| Cache | LRU,
|
| 54 |
|
| 55 |
-
##
|
| 56 |
|
| 57 |
```
|
| 58 |
app/
|
| 59 |
-
├── main.py # Lifespan +
|
| 60 |
-
├── model_loader.py #
|
| 61 |
-
├── schemas.py # Pydantic v2 request/response
|
| 62 |
-
├── category_meta.py # Labels,
|
| 63 |
-
├── cache.py #
|
| 64 |
├── utils.py # normalize(), read_static()
|
| 65 |
├── routers/
|
| 66 |
-
│ ├── pages.py #
|
| 67 |
-
│ ├── inference.py #
|
| 68 |
-
│ └── meta.py #
|
| 69 |
├── services/
|
| 70 |
-
│ └── classifier.py #
|
| 71 |
└── static/
|
| 72 |
├── home.html
|
| 73 |
-
├── index.html #
|
| 74 |
-
├── batch.html #
|
| 75 |
└── categories.html
|
| 76 |
training/
|
| 77 |
├── config.py
|
|
|
|
| 1 |
+
# Arquitectura
|
| 2 |
|
| 3 |
+
## Despliegue
|
| 4 |
|
| 5 |
```
|
| 6 |
+
GitHub (código fuente)
|
| 7 |
│
|
| 8 |
+
└─► Hugging Face Spaces (runtime Docker)
|
| 9 |
+
│ construye y ejecuta el contenedor FastAPI
|
| 10 |
│
|
| 11 |
+
├─► al iniciar: descarga el modelo desde HF Hub
|
| 12 |
│ huggingface.co/cmeneses99/sms-classifier
|
| 13 |
│ (model.safetensors, tokenizer, config — ~520MB)
|
| 14 |
│
|
| 15 |
+
└─► expone la API en el puerto 7860
|
| 16 |
https://cmeneses99-sms-classifier-api.hf.space
|
| 17 |
|
| 18 |
+
cron-job.org ──GET /health cada 10min──► HF Spaces (keep-alive)
|
| 19 |
```
|
| 20 |
|
| 21 |
+
## Flujo de una solicitud
|
| 22 |
|
| 23 |
```
|
| 24 |
+
Cliente
|
| 25 |
│
|
| 26 |
▼
|
| 27 |
FastAPI (routers/)
|
| 28 |
│
|
| 29 |
+
├── pages.py → respuestas HTML (/, /classify, /classify/batch, /categories)
|
| 30 |
├── inference.py → POST /classify, POST /classify/batch
|
| 31 |
└── meta.py → GET /health, GET /api/categories
|
| 32 |
│
|
| 33 |
▼
|
| 34 |
services/classifier.py
|
| 35 |
│
|
| 36 |
+
├── Cache LRU (cache.py) ──hit──► retorna respuesta en caché
|
| 37 |
│
|
| 38 |
+
└── miss ──► model_loader.py (pipeline de HuggingFace)
|
| 39 |
└── distilbert-base-multilingual-cased (fine-tuned)
|
| 40 |
+
└── top_k=3 predicciones → PredictResponse
|
| 41 |
```
|
| 42 |
|
| 43 |
+
## Modelo
|
| 44 |
|
| 45 |
+
| Detalle | Valor |
|
| 46 |
|---|---|
|
| 47 |
+
| Modelo base | `distilbert-base-multilingual-cased` |
|
| 48 |
+
| Tarea | Clasificación de secuencias |
|
| 49 |
+
| Categorías | 9 |
|
| 50 |
+
| Datos de entrenamiento | 3.150 ejemplos sintéticos (350/categoría, ES + EN) |
|
| 51 |
+
| Entrenamiento | 5 épocas, fine-tuning con HuggingFace Trainer API |
|
| 52 |
+
| Runtime | Solo CPU (build CPU de PyTorch) |
|
| 53 |
+
| Cache | LRU, máx. 512 entradas, thread-safe |
|
| 54 |
|
| 55 |
+
## Estructura del proyecto
|
| 56 |
|
| 57 |
```
|
| 58 |
app/
|
| 59 |
+
├── main.py # Lifespan + registro de routers
|
| 60 |
+
├── model_loader.py # Descarga el modelo desde HF Hub al iniciar
|
| 61 |
+
├── schemas.py # Modelos Pydantic v2 para request/response
|
| 62 |
+
├── category_meta.py # Labels, colores y ejemplos por categoría
|
| 63 |
+
├── cache.py # Cache LRU thread-safe
|
| 64 |
├── utils.py # normalize(), read_static()
|
| 65 |
├── routers/
|
| 66 |
+
│ ├── pages.py # Rutas HTML
|
| 67 |
+
│ ├── inference.py # Endpoints de clasificación
|
| 68 |
+
│ └── meta.py # Endpoints de health y categorías
|
| 69 |
├── services/
|
| 70 |
+
│ └── classifier.py # Lógica de inferencia con integración de caché
|
| 71 |
└── static/
|
| 72 |
├── home.html
|
| 73 |
+
├── index.html # UI clasificador simple
|
| 74 |
+
├── batch.html # UI clasificador por lotes
|
| 75 |
└── categories.html
|
| 76 |
training/
|
| 77 |
├── config.py
|
README.md
CHANGED
|
@@ -66,7 +66,7 @@ training/
|
|
| 66 |
### Requisitos
|
| 67 |
|
| 68 |
- Python 3.11+
|
| 69 |
-
- Modelo entrenado en `./model/` (ver sección de
|
| 70 |
|
| 71 |
```bash
|
| 72 |
# Crear entorno virtual
|
|
@@ -154,15 +154,15 @@ curl -X POST http://localhost:8000/classify/batch \
|
|
| 154 |
}
|
| 155 |
```
|
| 156 |
|
| 157 |
-
##
|
| 158 |
|
| 159 |
-
1.
|
| 160 |
-
2.
|
| 161 |
```bash
|
| 162 |
git remote add hfspace https://USER:TOKEN@huggingface.co/spaces/USER/SPACE-NAME
|
| 163 |
git push hfspace main
|
| 164 |
```
|
| 165 |
3. HF Spaces detecta el `Dockerfile` automáticamente y hace el build
|
| 166 |
-
4. Al
|
| 167 |
|
| 168 |
-
El modelo está
|
|
|
|
| 66 |
### Requisitos
|
| 67 |
|
| 68 |
- Python 3.11+
|
| 69 |
+
- Modelo entrenado en `./model/` (ver sección de entrenamiento)
|
| 70 |
|
| 71 |
```bash
|
| 72 |
# Crear entorno virtual
|
|
|
|
| 154 |
}
|
| 155 |
```
|
| 156 |
|
| 157 |
+
## Despliegue en Hugging Face Spaces
|
| 158 |
|
| 159 |
+
1. Crea un Space en [huggingface.co/new-space](https://huggingface.co/new-space) con SDK: **Docker**
|
| 160 |
+
2. Sube el código al repo del Space:
|
| 161 |
```bash
|
| 162 |
git remote add hfspace https://USER:TOKEN@huggingface.co/spaces/USER/SPACE-NAME
|
| 163 |
git push hfspace main
|
| 164 |
```
|
| 165 |
3. HF Spaces detecta el `Dockerfile` automáticamente y hace el build
|
| 166 |
+
4. Al iniciar, el modelo se descarga desde HF Hub (~520MB, solo la primera vez)
|
| 167 |
|
| 168 |
+
El modelo está en [huggingface.co/cmeneses99/sms-classifier](https://huggingface.co/cmeneses99/sms-classifier).
|
USAGE.md
CHANGED
|
@@ -1,42 +1,42 @@
|
|
| 1 |
-
#
|
| 2 |
|
| 3 |
-
|
| 4 |
|
| 5 |
---
|
| 6 |
|
| 7 |
-
##
|
| 8 |
|
| 9 |
### Home
|
| 10 |
-
|
| 11 |
|
| 12 |
---
|
| 13 |
|
| 14 |
### Clasificar un mensaje
|
| 15 |
-
1.
|
| 16 |
-
2.
|
| 17 |
-
3.
|
| 18 |
4. El resultado muestra la categoría detectada, el nivel de confianza y el top 3 de categorías más probables
|
| 19 |
5. Si el mismo texto ya fue consultado antes, aparece el badge **"caché activo"**
|
| 20 |
|
| 21 |
---
|
| 22 |
|
| 23 |
### Clasificar múltiples mensajes
|
| 24 |
-
1.
|
| 25 |
-
2.
|
| 26 |
3. El contador en tiempo real te muestra cuántos mensajes cargaste (máx. 50)
|
| 27 |
-
4.
|
| 28 |
5. Los resultados aparecen uno por uno con su categoría y confianza
|
| 29 |
-
6. En la barra de resumen inferior
|
| 30 |
|
| 31 |
---
|
| 32 |
|
| 33 |
### Ver categorías disponibles
|
| 34 |
-
1.
|
| 35 |
2. Cada categoría muestra su descripción y un ejemplo en español e inglés
|
| 36 |
|
| 37 |
---
|
| 38 |
|
| 39 |
-
##
|
| 40 |
|
| 41 |
### Clasificar un mensaje
|
| 42 |
|
|
|
|
| 1 |
+
# Guía de uso
|
| 2 |
|
| 3 |
+
URL base: `https://cmeneses99-sms-classifier-api.hf.space`
|
| 4 |
|
| 5 |
---
|
| 6 |
|
| 7 |
+
## Desde el navegador (UI)
|
| 8 |
|
| 9 |
### Home
|
| 10 |
+
Abre `https://cmeneses99-sms-classifier-api.hf.space` — vas a ver una descripción de la API con todos los endpoints disponibles y ejemplos de respuesta. Desde ahí puedes navegar al resto de las vistas con los botones.
|
| 11 |
|
| 12 |
---
|
| 13 |
|
| 14 |
### Clasificar un mensaje
|
| 15 |
+
1. Haz click en **"Clasificador Simple"** desde el home (o navega directo a `/classify`)
|
| 16 |
+
2. Escribe el mensaje en el campo de texto
|
| 17 |
+
3. Haz click en **"Clasificar"** o presiona **Enter**
|
| 18 |
4. El resultado muestra la categoría detectada, el nivel de confianza y el top 3 de categorías más probables
|
| 19 |
5. Si el mismo texto ya fue consultado antes, aparece el badge **"caché activo"**
|
| 20 |
|
| 21 |
---
|
| 22 |
|
| 23 |
### Clasificar múltiples mensajes
|
| 24 |
+
1. Haz click en **"Clasificador por Lotes"** desde el home (o navega directo a `/classify/batch`)
|
| 25 |
+
2. Escribe un mensaje por línea en el área de texto
|
| 26 |
3. El contador en tiempo real te muestra cuántos mensajes cargaste (máx. 50)
|
| 27 |
+
4. Haz click en **"Clasificar todo"**
|
| 28 |
5. Los resultados aparecen uno por uno con su categoría y confianza
|
| 29 |
+
6. En la barra de resumen inferior puedes ver cuántos vinieron desde caché
|
| 30 |
|
| 31 |
---
|
| 32 |
|
| 33 |
### Ver categorías disponibles
|
| 34 |
+
1. Haz click en **"Categorías"** desde el home (o navega directo a `/categories`)
|
| 35 |
2. Cada categoría muestra su descripción y un ejemplo en español e inglés
|
| 36 |
|
| 37 |
---
|
| 38 |
|
| 39 |
+
## Desde la API (curl)
|
| 40 |
|
| 41 |
### Clasificar un mensaje
|
| 42 |
|