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
metadata
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
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

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-.