tde-es-en-lite-spec
Variante especializada (CC BY-NC 4.0, solo uso no comercial): ajustada además con los splits de entrenamiento de AG News y GoEmotions, así que en esas dos tareas NO es zero-shot (en el resto sí). Para zero-shot puro: tde-es-en-lite-plus (CC BY-NC) o tde-es-en-lite-v2 (MIT).
Motor de decisiones tipadas (choice / score / noul) sobre un encoder bidireccional
int8 de ~42,5 M de parámetros (43 MB), recortado a español e inglés. No genera
texto: elige entre opciones que le das, puntúa una rúbrica o estima si una proposición se
desprende de un texto, y devuelve probabilidades, con la opción de abstenerse. Corre en CPU,
1 hilo, sin GPU y sin Python en runtime, con el binario nativo tde (Rust).
Código fuente (Apache-2.0) incluido en src/; repositorio de desarrollo: typed-decision-engine.
Recursos (medidos: i9-9880H, macOS Intel, 1 hilo, sin GPU)
| este modelo | Laya (421 M) | Laya-multilingual (322 M) | |
|---|---|---|---|
| parámetros | ~42,5 M | 421 M | 322 M |
| pesos en disco | 43 MB | 223 MB (medido) | 644 MB |
| RAM (RSS) | ~90 MB | n/d | n/d |
| latencia por consulta (CPU) | ~15 ms | ~280 ms | ~237 ms |
| GPU | no | sí para 33 ms (publicado) | sí para 33 ms (publicado) |
Resultados
Precisión sin ejemplos por opción (zero-shot salvo lo que se indica abajo), respuesta forzada, 150 casos por tarea (±4 puntos).
El motor propio se mide con el binario desplegable (tde open-eval); Laya con su paquete
Python en CPU, sin calibrar. La columna «respondidas» usa la abstención por defecto.
| tarea | n | motor propio 0 ej. | Laya 0 ej. | respondidas (cobertura) 0 ej. |
|---|---|---|---|---|
| NLI inglés sí/no (MNLI) | 150 | 0.83 | 0.78 | 0.87 (76%) |
| NLI español sí/no (XNLI) | 150 | 0.74 | 0.65 | 0.77 (83%) |
| afirmación verdadera, 3 opciones | 150 | 0.77 | 0.69 | 0.80 (95%) |
| intención MASSIVE en (60) | 150 | 0.68 | 0.42 | 0.78 (82%) |
| intención MASSIVE es (60) | 150 | 0.61 | 0.32 | 0.67 (76%) |
| intención CLINC150 (150) | 118 | 0.67 | no soportado | 0.74 (86%) |
| escenario MASSIVE en (18) | 150 | 0.72 | 0.57 | 0.77 (85%) |
| escenario MASSIVE es (18) | 150 | 0.59 | 0.42 | 0.65 (83%) |
| emoción GoEmotions (28) | 150 | 0.63 | 0.38 | 0.67 (85%) |
| tema AG News (4) | 150 | 0.94 | 0.96 | 0.95 (98%) |
AG News y GoEmotions se entrenaron con sus splits de entrenamiento (medidos en los de prueba): ahí no es zero-shot. Contra Laya (inglés) gana en 9 de 10 (pierde AG News: 0,94 vs 0,96 en 150 casos; 0,897 vs 0,918 en 600 casos más fiables). Contra Laya-multilingual (322 M) gana en 6 de 10 (intenciones y escenarios de MASSIVE, MNLI de 3 opciones, GoEmotions 0,63 vs 0,35), empata en MNLI (0,83) y XNLI-es (0,74) y pierde en CLINC (0,67 vs 0,69) y AG News (0,897 vs 0,910 en 600 casos). Las cabezas de schema (90 tickets) rinden menos que en plus: 0,844 frente a 0,922.
Texto de desarrollo de software (100 casos, 5 tareas; bench/uso_real/)
Peticiones, commits, logs, issues y enrutado de un agente de código, escritos por el autor.
Acierto forzado medio: 0,42 sin ejemplos y 0,72 con 3 ejemplos por opción
(clase mayoritaria 0,27). Solo con etiquetas no es fiable en este dominio; con ejemplos sirve
como primer filtro con escalamiento al LLM (abstain).
Cabezas por schema (90 tickets de soporte, es/en)
Acierto 0,844, de las respondidas 0,997, cobertura 0,847
(tde eval; incluye los 67 casos de entrenamiento, escritos por el autor).
Qué incluye
- Backbone
intfloat/multilingual-e5-small(MIT), vocabulario recortado de 250.002 a 54.358 tokens, int8. Ajustado (contrastivo texto↔etiqueta, anclado al modelo base) con 17 datasets: los 15 deplusmás los splits de ENTRENAMIENTO de AG News y GoEmotions. El backbone NO se ajustó con MASSIVE, CLINC ni NLI (zero-shot ahí); AG News y GoEmotions sí (los splits de prueba nunca). La cabezaclaim(universal.bin) se entrenó con MultiNLI (train): MNLI no es zero-shot paraclaim; XNLI-es no entró. - Tokenizador propio en Rust (4933/4933 idéntico a la referencia de Hugging Face).
- Modo abierto (
tde ask): sin schema.choice/score= coseno (escala 80) contra el prototipo de cada opción (etiqueta, o etiqueta + ejemplos).claim= cabeza NLI (universal.bin); las afirmaciones «el texto habla de X» se resuelven con un z-score de coseno. - Reglas deterministas: negación (se descartan cláusulas negadas y nunca se elige una opción negada), aritmética y edades entre fechas; lo que no resuelven, se abstiene.
- Autoaprendizaje sin reentrenar:
tde feedback --task T --answer a "texto"guarda una corrección;tde ask --task Tla usa como ejemplo. Costo ~0 ms; el modelo no cambia, así que no olvida. - Modo schema (
tde decide): preguntas fijas con cabezas por pregunta (heads.bin); ejemplo enschemas/.
Instalación
El repositorio de Hugging Face es autocontenido (no necesita GitHub): trae los pesos, el binario tde
para macOS Intel, el código fuente (src/, para compilar en otras plataformas con Rust 1.82+) y install.sh.
hf download jul879n/tde-es-en-lite-spec --local-dir tde-es-en-lite-spec
cd tde-es-en-lite-spec && bash install.sh # baja ONNX Runtime 1.20.1 (SHA-256 verificado) y deja listo el binario
./tde ask --question "¿De qué trata?" --options 'deportes|política|tecnología' \
"El equipo ganó la final con un gol en el último minuto"
bash install.sh --link además deja tde disponible en cualquier carpeta (~/.local/bin). ./tde es un envoltorio que ya apunta a estos pesos. Otros subcomandos: tde ask --claim '...' <texto>,
tde decide support '<texto>', tde feedback ..., tde bench. Solo se verificó en macOS Intel; en
Linux, Windows y Apple Silicon install.sh compila desde src/ (sin verificar en esas plataformas).
Usarlo desde una app web o un script
./tde serve levanta un servidor HTTP local (127.0.0.1:8787, JSON, sin dependencias):
./tde serve --allow-origin http://localhost:3000 # origen de tu app web; sin esta opción solo aceptan curl/servidores
const r = await fetch("http://127.0.0.1:8787/v1/ask", {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ state: "Me cobraron dos veces", options: ["reembolso", "cancelar", "soporte"],
task: "mi-tarea" /* opcional: usa los ejemplos guardados con /v1/feedback */ }),
});
const { choice, confidence, abstain } = await r.json(); // abstain=true: escala a un LLM o a una persona
Rutas: POST /v1/ask (choice, score o claim), POST /v1/feedback (autoaprendizaje), POST /v1/embeddings
(formato OpenAI), POST /v1/systemone (juez noul/choice/score, el protocolo de OMP), GET /health.
Seguridad: solo escucha en localhost, rechaza Host no local y navegadores de otro origen; no tiene
autenticación, no lo expongas a la red. Hay una página de ejemplo en examples/server.html.
Varios agentes a la vez, con sesiones aisladas
./tde serve --workers 4 carga 4 copias del modelo (mismos pesos, una sesión de ONNX Runtime de 1 hilo cada una) y atiende 4 consultas
en paralelo. Cada agente manda su identificador en la cabecera X-TDE-Session y obtiene su propia memoria (correcciones y cabezas por
tarea), aislada de las demás; no hay tope fijo de agentes o sesiones (--max-sessions, --max-conns). Una sesión prefiere siempre la
misma copia y usa otra libre si está ocupada.
| copias | consultas por segundo (16 agentes a la vez) | latencia p50 / p95 | RAM del servidor |
|---|---|---|---|
| 1 | 84 | 189 / 214 ms | 91 MB |
| 4 | 268 | 44 / 93 ms | 308 MB |
| 8 | 390 | 33 / 60 ms | 598 MB |
curl -s localhost:8787/v1/feedback -H 'X-TDE-Session: agente-7' -d '{"task":"rutas","state":"deshaz el último commit","answer":"comando"}'
curl -s localhost:8787/v1/ask -H 'X-TDE-Session: agente-7' -d '{"task":"rutas","state":"revierte el merge","options":["comando","editar","buscar"]}'
curl -s -X DELETE localhost:8787/v1/sessions/agente-7 # borra la memoria de esa sesión
Autoaprendizaje: con ≥ 30 correcciones de una tarea (≥ 3 por opción) el servidor entrena sola una cabeza de ~1,5 KB por opción (se reentrena cada 10 más); medido en 5 tareas de desarrollo, con 8 a 14 ejemplos por opción sube el acierto de 0,72 (ejemplos como prototipos) a 0,85-0,88, sin costo en inferencia. Probado: 30 agentes en paralelo con reglas contrarias, 30/30 sesiones aisladas.
En el navegador, sin servidor (WebAssembly)
El repositorio incluye tokenizer.json (formato Hugging Face, podado) y web/tde.js (~100 líneas, copia el archivo a tu
app): el modelo corre en el cliente con onnxruntime-web, sin servidor y sin enviar el texto a ningún lado.
import { loadTde } from "./tde.js";
const tde = await loadTde("https://huggingface.co/jul879n/tde-es-en-lite-spec/resolve/main"); // ~43 MB la primera vez
const r = await tde.ask("El equipo ganó la final", ["deportes", "política", "tecnología"]);
// r = { top, choice (null si duda), confidence, abstain, probs }. tde.feedback(tarea, texto, opción) guarda correcciones
// en localStorage y ask(..., { task }) las usa como ejemplos.
Probado: mismas probabilidades que el binario (coseno de embeddings 1,00000), en Chrome ~1 s de carga y 240 ms la primera
consulta. Para ver la demo: python3 -m http.server 8000 dentro de la carpeta descargada y abre http://localhost:8000/web/.
No incluye las reglas de negación/aritmética ni la cabeza NLI de claim: usa el binario o tde serve para eso.
Limitaciones
- No genera texto; solo elige, puntúa o estima. Solo español e inglés (otros alfabetos: se abstiene).
- Zero-shot medio en tareas nuevas; mejora mucho con ejemplos por opción (0,42 → 0,72 en texto de desarrollo). Pierde frente a Laya en temas (AG News) y emociones (GoEmotions) y frente a Laya-multilingual en CLINC y NLI; gana en intenciones y escenarios de MASSIVE. Laya no publica sus datos de entrenamiento, así que su zero-shot en AG News no es verificable.
claimcon afirmaciones fuera de MNLI puede dar un veredicto falso con confianza alta; no sabe hechos.- Errores con confianza alta existen aunque haya abstención; escalar siempre los casos dudosos.
- Comparaciones hechas por el autor, 150 casos por tarea, un solo equipo; una sola plataforma verificada (macOS Intel; las demás solo compilan).
Licencias y atribuciones
- Pesos: CC BY-NC 4.0 (
LICENSE): uso no comercial, con atribución. Motivo: datasets de ajuste con licencia no permisiva,other/unknown, no declarada o de uso no comercial (AG News). Baseintfloat/multilingual-e5-small: MIT (Microsoft Corporation). Código del repositorio: Apache-2.0.
Detalle de datos y licencias en LICENSE. No es asesoría legal.
Model tree for jul879n/tde-es-en-lite-spec
Base model
intfloat/multilingual-e5-small