Ai-detector / README.md
ttech12's picture
Versión de revisión: entrenamiento adversario con DIPPER
fd7bdda verified
|
Raw History Blame Contribute Delete
3.61 kB
---
language: [es, en]
library_name: transformers
pipeline_tag: text-classification
base_model: microsoft/mdeberta-v3-base
tags: [ai-detection, academic-integrity, spanish, english]
---
# Detector de texto con IA — versión **de revisión** (con entrenamiento adversario)
Una de las dos versiones del detector. Esta es la **de revisión**: marca de más a
propósito, para que el autor reescriba los fragmentos señalados hasta que el indicador
baje y el documento quede listo para enviarse a una revista sin ser flageado como IA.
| | **Revisión** (esta) | [Equilibrada](https://huggingface.co/ttech12/Ai-detector-equilibrado) |
|---|---|---|
| IA parafraseada con DIPPER (2 pasadas) | **90.8%** | 5% |
| **Texto humano reformulado con una herramienta** | **40% como IA + 30% gris** | 0% |
| Texto humano pulido con IA | 35% | 62% |
| IA sin parafrasear | 98.9% | 99.8% |
| Claude escribiendo desde cero | 100% | 100% |
**La diferencia de fondo:** esta versión se entrenó también con textos de IA parafraseados
por DIPPER, un modelo hecho para evadir detectores. Con eso aprendió a reconocer *que un
texto pasó por un parafraseador*, no solo que el contenido sea de máquina. Por eso cierra
la vía de evasión y, al mismo tiempo, marca al autor que reformula su propio texto con una
herramienta: las ideas son suyas, pero las palabras no.
**Cuándo usar esta versión:** como señal de revisión sobre un texto propio. Marcar de más
es lo deseable, porque empuja a reescribir con palabras propias.
**Cuándo usar la equilibrada:** cuando el resultado pueda tener consecuencias para alguien.
**Ninguna de las dos sirve como prueba de deshonestidad.** Que un texto salga limpio no
demuestra nada, y que salga marcado tampoco prueba nada por sí solo.
## Uso
```python
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
tok = AutoTokenizer.from_pretrained("ttech12/Ai-detector")
model = AutoModelForSequenceClassification.from_pretrained(
"ttech12/Ai-detector", dtype=torch.float32).eval()
enc = tok(texto, truncation=True, max_length=512, return_tensors="pt")
p_ia = torch.softmax(model(**enc).logits, -1)[0, 1].item()
```
Ensamble completo con Binoculars (Qwen2.5-3B base e instruct), en `calibration.json`:
```
puntuación = 0.866·logit(p_ia) − 2.223·binoculars − 2.173
ia si puntuación > 1.44 (1% de falsos positivos)
gris si puntuación > −9.12 (5%)
```
Con menos de 150 palabras no se emite resultado.
## Entrenamiento
- **Textos humanos anteriores a 2022** (antes de ChatGPT): resúmenes de OpenAlex y
fragmentos de prosa de tesis de acceso abierto, con el idioma verificado.
- **Contraparte de IA:** por cada texto humano, un LLM escribe otro con el mismo título,
idioma y extensión, de modo que el modelo aprende el estilo y no el tema.
- **Ocho generadores:** gpt-oss:20b, qwen3:14b, qwen3:32b, gemma3:12b, llama3.1:8b,
mistral-nemo:12b, Claude y DIPPER (parafraseo adversario).
- 28.238 textos en total. 3 épocas, lote 16, tasa 2e-5, longitud 512. Los pesos se cargan
en float32: el checkpoint original viene en fp16 y con esos pesos AdamW produce NaN.
## Falsos positivos sobre escritura de alumnos reales
| Corpus | n | Marcados como IA |
|---|---|---|
| PERSUADE 2.0 (ensayos escolares, inglés) | 1.200 | 0.2% |
| Tesis en español ajenas al corpus | 973 | 0.1% |
| CATyPI (tesis de computación en español) | 182 | 0.0% |
| Documentos completos de más de 1.200 palabras | 40 | 0% |
Código, corpus y el informe completo:
[Turnit-Ai-in-](https://github.com/Alberto-Campos-de-la-Torre/Turnit-Ai-in-).