Sistema completo para clasificar textos en español como IA (1) vs Humano (0) y compararlos de forma homogénea, incluyendo entrenamiento, evaluación y exposición vía API REST.
Modelos incluidos:
- BiLSTM (embeddings aleatorios) — entrenado desde cero (baseline).
- Word2Vec + BiLSTM — embeddings estáticos entrenados en un corpus + BiLSTM.
- BERT fine-tuned (dccuchile/bert-base-spanish-wwm-cased) — fine-tuning supervisado con chunking/stride y agregación por documento.
- Estructura del repositorio
- Requisitos
- Datos
- Entrenamiento
- Evaluación y comparación
- API REST
- Artefactos esperados
- Troubleshooting
.
├─ data/
├─ logic/
│ ├─ models/
│ ├─ training/
│ └─ artifacts/
│ ├─ bilstm_rand/
│ ├─ bilstm_w2v/
│ └─ bert/
├─ tests/
├─ api.py
├─ requirements.txt
└─ README.md
- Python 3.10+ recomendado (3.11/3.12 también funciona).
- Entorno virtual (
venv). - PyTorch con CUDA (opcional pero recomendado si tienes GPU).
Instalación (Windows PowerShell):
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -U pip
pip install -r requirements.txtGPU: si
torch.cuda.is_available()te daFalse, normalmente es porque instalaste una build CPU. Instala PyTorch CUDA desde la web oficial de PyTorch para tu versión de CUDA.
Los CSV deben tener al menos:
text(string)generated(0 = humano, 1 = IA)
Rutas típicas:
data/train.csvdata/val.csvdata/test_es.csv
Importante: ejecuta los comandos desde la raíz del proyecto.
Salida recomendada:
logic/artifacts/bilstm_rand
desde de logic/training/:
python -u logic/training/train.py --train_path data/train.csv --val_path data/val.csv --out_dir logic/artifacts/bilstm_randArtefactos:
logic/artifacts/bilstm_rand/
model.pt
vocab.json
config.json
Salida recomendada:
logic/artifacts/bilstm_w2v
python -u logic/training/train_w2v.py --train_path data/train.csv --out_dir logic/artifacts/bilstm_w2v/embeddingsEsperado:
logic/artifacts/bilstm_w2v/embeddings/
bilstm_w2v.model
bilstm_w2v.model.syn1neg.npy
bilstm_w2v.model.wv.vectors.npy
python -u train.py `
--train_path data/train.csv `
--val_path data/val.csv `
--w2v_path logic/artifacts/bilstm_w2v/embeddings/bilstm_w2v.model `
--out_dir logic/artifacts/bilstm_w2vArtefactos:
logic/artifacts/bilstm_w2v/
model.pt
vocab.json
config.json
embeddings/ (si lo conservas)
Aquí NO hay model.pt. Se guarda en formato HuggingFace con model.safetensors + tokenizer + config.json.
Salida recomendada:
logic/artifacts/bert
Comando típico:
python -u logic/training/train_bert.py `
--train_csv data/train.csv `
--val_csv data/val.csv `
--test_csv data/test_es.csv `
--out_dir logic/artifacts/bert `
--max_length 384 `
--stride 128 `
--agg median `
--epochs 3 `
--batch_size 8 `
--grad_accum 2 `
--lr 2e-5Artefactos mínimos:
logic/artifacts/bert/
config.json
model.safetensors
tokenizer_config.json / special_tokens_map.json / vocab.txt / tokenizer.json (según tokenizer)
test_metrics.json (si evalúas en test)
calibrator.joblib (si tu pipeline calibra; opcional)
python -u tests/eval_test.py `
--test_path data/test_es.csv `
--bilstm_rand_dir logic/artifacts/bilstm_rand `
--bilstm_w2v_dir logic/artifacts/bilstm_w2v `
--bert_dir logic/artifacts/bertGenera:
logic/artifacts/<modelo>/test_metrics.jsonmetrics/all_models_metrics.json
Arranque:
python -u api.pyEndpoints:
GET /healthGET /modelsPOST /predict(body:{ "text": "...", "model": "bert|bilstm_rand|bilstm_w2v" })POST /predict/<model_name>
PowerShell (UTF-8):
$payload = @{ text="Texto largo en español para evaluar..." ; model="bert" } | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:8001/predict" -Method POST -ContentType "application/json; charset=utf-8" -Body ([Text.Encoding]::UTF8.GetBytes($payload))curl:
curl -X POST http://localhost:8001/predict -H "Content-Type: application/json" -d '{"text":"Texto largo en español para evaluar...","model":"bert"}'- BiLSTM:
model.pt,vocab.json,config.json - BERT fine-tuned:
model.safetensors+ tokenizer files +config.json
ModuleNotFoundError: logic: ejecuta desde la raíz y/o exportaPYTHONPATH.- PowerShell + acentos: envía el body como bytes UTF-8.
PermissionError: evita rutas con OneDrive bloqueando y comprueba permisos.- GPU no detectada: instala PyTorch CUDA.