Ficha técnica ·

Fonles Decision 1 9B: un modelo de decisiones para el español.

Fonles Studios · Investigación

Un prisma de vidrio convierte un rayo de luz en tres barras de luz de distinto largo, en azul, violeta y durazno.

Resumen

Fonles Decision 1 9B es un modelo de decisiones para el español con 9.000 millones de parámetros. Recibe un caso y un conjunto de preguntas tipadas y devuelve una probabilidad calibrada para cada opción en una sola pasada, sin generar texto. Con 89,6 % de precisión es el primero en español entre los siete modelos de decisiones evaluados, por delante de modelos tres veces más grandes, y tiene el menor error de calibración del grupo (ECE 0,006).

Precisión en español
89,6 %
Error de calibración
0,006
Parámetros
9B
Pasadas por caso
1

1 Introducción

Buena parte de lo que una empresa le pide a la IA no es escribir, es decidir. A qué equipo va un ticket, qué quiere el cliente, si un mensaje rompe una política, qué tan urgente es un caso, si un agente de IA puede ejecutar la acción que propone. Hoy esas decisiones se resuelven casi siempre con un modelo generativo al que se le pide que conteste en un formato fijo. Funciona, pero cuesta: hay que generar texto, leerlo, validar que el formato salió bien y, al final, la respuesta no dice cuánta seguridad hay detrás.

El español agrega su propio problema. Se escribe distinto en México, en Argentina, en Colombia o en España, con voseo, modismos, abreviaturas y faltas. La mayoría de los modelos se evalúan con un español neutro y limpio que casi nadie escribe en un chat de soporte.

Fonles Decision 1 9B ataca los dos problemas a la vez. Es un modelo de decisiones: no genera texto, asigna una probabilidad a cada opción posible. Lo entrenamos con español como lo escribe la gente, de toda Latinoamérica, el Caribe, España y Estados Unidos. Responde decenas de preguntas sobre el mismo caso en una sola pasada, y sus probabilidades están calibradas: cuando dice 90 %, acierta cerca de nueve de cada diez veces.

2 Cómo funciona

Cada consulta tiene dos partes. El caso (state) es el texto o el JSON sobre el que hay que decidir: un mensaje, un ticket, una conversación, un formulario. Las preguntas (questions) dicen qué hay que decidir, y cada una tiene un tipo:

  • Sí o no (noul): por ejemplo, si el cliente pide un reembolso.
  • Una opción entre varias (choice): por ejemplo, qué equipo atiende el caso. Cada opción lleva su propio criterio en lenguaje natural.
  • Puntaje en una rúbrica (score): por ejemplo, la urgencia de 0 a 3. El modelo sabe que 2 está más cerca de 3 que de 0.

El modelo lee el caso una vez y devuelve, para cada pregunta, una distribución de probabilidad sobre sus opciones. Como no hay texto generado, no hay nada que interpretar ni formato que pueda salir mal, y el costo casi no crece al sumar preguntas: todas comparten la misma pasada.

{
  "state": "Che, me cobraron dos veces la cuota de este mes y nadie me responde.",
  "questions": {
    "equipo": {
      "type": "choice",
      "instructions": "¿Qué equipo debe atender el caso?",
      "criteria": {
        "facturacion": "Cobros, pagos y reembolsos",
        "soporte": "Fallas técnicas del servicio",
        "ventas": "Planes nuevos y cambios de plan"
      }
    },
    "reembolso": {
      "type": "noul",
      "instructions": "¿El cliente pide que le devuelvan dinero?"
    },
    "urgencia": {
      "type": "score",
      "instructions": "Urgencia del caso, de 0 a 3"
    }
  }
}
Figura 1. Un caso con tres preguntas de distinto tipo.
PreguntaRespuestaProbabilidad
EquipoFacturación0,94
Soporte0,04
Ventas0,02
ReembolsoSí0,81
No0,19
Urgencia2 de 3la más alta
Figura 2. Ejemplo de respuesta para el caso de la figura 1.

Las probabilidades están hechas para ponerles umbrales. Una regla típica: si la opción más probable pasa de 0,9, se actúa sola; entre 0,6 y 0,9, se actúa y se revisa después; por debajo, el caso pasa a una persona.

3 Arquitectura

Fonles Decision 1 9B tiene dos piezas. La primera es una red de lenguaje de unos 9.000 millones de parámetros, con una arquitectura híbrida que alterna capas de atención lineal con capas de atención completa, lo que le permite leer casos largos sin que el costo se dispare. La segunda es una cabeza de esquema conjunto: una red pequeña que mira, a la vez, el caso y todas las preguntas, y produce un puntaje por cada opción.

ParámetrosUnos 9B, pesos en bf16
Red de lenguaje32 capas, dimensión 4.096, híbrida de atención lineal y completa
Cabeza de decisión4 capas de ancho 1.024 y 16 cabezas de atención, 2 de ellas de enrutamiento
SalidaUn puntaje por opción; probabilidades con softmax y temperatura por tipo
IdiomasEspañol (objetivo principal) e inglés
Tipos de preguntaSí o no, una opción entre varias, puntaje en una rúbrica
FormatoUn solo punto de control, compatible con transformers
Tabla 1. Ficha del modelo.

4 Datos

4.1 Casos de decisión en español

Construimos un conjunto de decenas de millones de tokens de casos de decisión en español. Cada caso se diseñó a partir de parámetros fijados de antemano: país, industria, canal, registro, dificultad, forma de la pregunta y respuesta correcta. Así la respuesta se conoce antes de que exista el texto, y el modelo no aprende de etiquetas adivinadas.

Los casos cubren Latinoamérica, el Caribe, España y Estados Unidos, y decenas de industrias: banca, administración de salud, legal, comercio electrónico, logística, telecomunicaciones, gobierno, seguros, recursos humanos y moderación.

4.2 Control de calidad

  • Cada ejemplo se validó contra su esquema y su respuesta esperada.
  • Los casos casi idénticos se agruparon para que ninguno pesara de más.
  • Se quitó toda pregunta que un clasificador de solo texto pudiera contestar sin leer el caso. Así el modelo tiene que leer, no adivinar por la forma de la pregunta.
  • Todo el entrenamiento se filtró contra las pruebas, por coincidencia exacta y por casi duplicados (Jaccard de 5 palabras igual o mayor a 0,6).

4.3 Datos etiquetados por personas

Los casos se mezclaron con datos etiquetados por personas: MASSIVE es-ES, PAWS-X es, XNLI-es y BANKING77, este último traducido a variedades regionales del español. Un 10 % de repetición en inglés evita que el modelo pierda lo que ya sabía en ese idioma.

FuenteQué aportaLicencia u origen
Casos de decisión de FonlesCasos en variedades del español y decenas de industriasFonles; validados contra su esquema y su respuesta
MASSIVE es-ES y en-US (entrenamiento)Intenciones de asistente traducidas por personasCC BY 4.0, © Amazon.com (FitzGerald et al., 2022)
PAWS-X es y en (entrenamiento)Detección de paráfrasis con pares adversariosLicencia de PAWS-X (Yang et al., 2019)
BANKING77 (entrenamiento)Intenciones bancarias. El lado en español se tradujo a variedades regionales; el inglés es el originalCC BY 4.0, PolyAI (Casanueva et al., 2020). Material adaptado
XNLI es (solo entrenamiento)Inferencia textual. No se usaron sus particiones de prueba ni de validaciónCC BY-NC 4.0 (Conneau et al., 2018)
Plantillas de FonlesFacturas, triaje, prioridad, moderación y casos fuera de alcanceFonles
Tabla 2. Datos de entrenamiento. Cada fuente conserva su licencia y su atribución.

5 Entrenamiento

La cabeza de decisión se entrenó junto con una adaptación LoRA de rango 256 sobre toda la red de lenguaje. Al terminar, la LoRA se fusionó con los pesos, así que el modelo publicado es un solo punto de control.

La pérdida combina cuatro términos. La entropía cruzada con suavizado enseña a elegir la opción correcta. El término de Brier castiga la seguridad mal puesta, lo que ayuda a la calibración. El crédito ordinal da puntos parciales en las preguntas de puntaje cuando la respuesta queda cerca. Y una penalización KL mantiene al modelo cerca de sus pesos de partida, para que no olvide lo que ya sabía. El orden de las preguntas se mezcla al azar para que el modelo no dependa de él.

Cada 100 pasos se evaluó por fuente. Si PAWS-X, MASSIVE o el inglés caían más de un punto, el entrenamiento se detenía. El modelo solo se publicó porque superó a su punto de partida en la prueba reservada en español sin una caída significativa en ninguna fuente etiquetada por personas.

AdaptaciónLoRA de rango 256 (α 256, dropout 0,05) sobre toda la red, fusionada en los pesos
Épocas2, con parada temprana; mejor punto en el paso 1.300
Lote8.192 tokens por paso, hasta 64 casos, acumulación de 4
Tasa de aprendizaje1 × 10⁻⁴ para la LoRA y 5 × 10⁻⁵ para la cabeza, con 3 % de calentamiento
PérdidaEntropía cruzada con suavizado 0,01, término de Brier (0,25), crédito ordinal (0,25) y KL hacia los pesos de partida (0,2)
Orden de preguntasAleatorio en la mitad de los casos
Largo máximo4.096 tokens por caso
SalvaguardasEvaluación cada 100 pasos; se detiene si PAWS-X, MASSIVE o el inglés caen más de 1 punto
Repetición en inglés10 % de los lotes
HardwareUna GPU H100
Tabla 3. Configuración de entrenamiento.

6 Calibración

Una probabilidad sirve solo si se puede creer. Después del entrenamiento ajustamos una temperatura por tipo de pregunta con datos de desarrollo en español. La probabilidad final es el softmax de los puntajes divididos por la temperatura de su tipo.

Tipo de preguntaNombreTemperatura
Sí o nonoul1,019
Una opción entre variaschoice0,900
Puntaje en una rúbricascore0,713
Tabla 4. Temperaturas publicadas en calibration.json.

El resultado: un error de calibración esperado (ECE) de 0,006 en el conjunto de comparación en español, el más bajo de los siete modelos evaluados, y de 0,003 en el conjunto reservado completo de 19.506 preguntas.

7 Evaluación

7.1 Frente a otros modelos de decisiones

Comparamos Fonles Decision 1 9B con seis modelos de decisiones. Todos vieron las mismas preguntas y se puntuaron con el mismo código. Ninguna de esas preguntas se usó para entrenar ni para elegir el punto de control. En español fueron 6.299 preguntas etiquetadas por personas de PAWS-X, XNLI, MASSIVE, Belebele y SIB-200; en inglés, 5.874 de MASSIVE en-US, PAWS-X en y Belebele eng. Los demás modelos se consultaron a través de OpenRouter Decisions el 10 y el 11 de octubre de 2026.

ModeloEspañolPAWS-XXNLIMASSIVEBelebeleSIB-200ECE ↓InglésES + EN
Fonles Decision 1 9B89,691,389,488,391,890,20,00692,390,9
Perplexity Decider 27B89,389,590,386,194,982,40,01691,990,6
Microsoft-Decision-1 9B85,884,484,187,396,289,20,05490,688,1
Clef 27B85,177,885,087,494,289,20,01888,386,7
Jev 1.1383,278,785,776,395,391,20,03484,183,6
GPT-6 Luna Decisions76,978,075,673,891,887,30,06580,278,5
Tabla 5. Precisión en % y error de calibración esperado en el conjunto en español. En negrita, el mejor de cada columna.

Fonles Decision 1 9B queda primero en español con un modelo de 9B, por delante de modelos de 27B, y es el mejor calibrado del grupo. También queda primero en la suma de español e inglés. Donde más se despega es en PAWS-X, la prueba de paráfrasis con pares adversarios, en la que dos frases casi iguales pueden decir cosas opuestas.

7.2 Lo que aportó el entrenamiento

Para medir qué ganó el modelo con nuestro entrenamiento, lo comparamos con sus pesos de partida sobre las mismas preguntas reservadas. En español, con 12.599 preguntas etiquetadas por personas, la precisión pasó de 82,6 % a 89,8 %: 7,3 puntos más. En inglés también mejoró, de 86,4 % a 92,3 %, así que el trabajo en español no se pagó con el inglés.

PruebaPartidaDecision 1ΔΔ NLL [IC 95 %]
PAWS-X (paráfrasis)72,491,0+18,6−0,360 [−0,391; −0,328]
XNLI (inferencia)81,989,7+7,8−0,169 [−0,184; −0,154]
MASSIVE (intención)87,688,5+0,9−0,046 [−0,069; −0,024]
SIB-200 (tema)87,791,2+3,4−0,075 [−0,119; −0,031]
Belebele (lectura)92,392,3+0,0+0,030 [−0,004; +0,064]
Promedio82,689,8+7,3
Tabla 6. Español, preguntas reservadas etiquetadas por personas. Precisión en %.
PruebaPartidaDecision 1ΔΔ NLL [IC 95 %]
PAWS-X (paráfrasis)77,394,8+17,4−0,340 [−0,364; −0,317]
MASSIVE (intención)90,090,0+0,0−0,020 [−0,035; −0,004]
Belebele (lectura)94,994,6−0,3+0,005 [−0,023; +0,032]
Promedio86,492,3+5,9
Tabla 7. Inglés, 5.874 preguntas. Precisión en %.

La columna de NLL mide la calidad de las probabilidades, no solo del acierto: un valor negativo significa que el modelo asigna más probabilidad a la respuesta correcta. Los intervalos son de 95 %, pareados sobre las mismas preguntas y agrupados por caso. En español mejoró de forma significativa en todas las pruebas salvo Belebele, donde quedó igual.

7.3 Por tipo de pregunta

Sobre el conjunto reservado completo en español, 19.506 preguntas que suman las pruebas públicas y casos de decisión de Fonles que nunca se usaron para entrenar, la precisión pasó de 82,3 % a 90,8 %. En los casos de Fonles por sí solos, de 81,9 % a 92,5 %. La mayor ganancia está en las preguntas de puntaje, que pasaron de 77,6 % a 90,9 %.

Tipo de preguntaPreguntasPartidaDecision 1
Sí o no7.17281,293,7
Una opción entre varias10.44384,088,8
Puntaje en una rúbrica1.89177,690,9
Total19.50682,390,8
Tabla 8. Conjunto reservado completo en español. Precisión en %.

8 Cómo usarlo

Probado con torch 2.11 y transformers 5.10.2. accelerate y torchvision son necesarios aunque solo se use texto.

pip install torch==2.11.0 torchvision==0.26.0 transformers==5.10.2 accelerate==1.15.0 pillow
import json, sys
import torch
from huggingface_hub import snapshot_download

path = snapshot_download("fonles-studios/fonles-decision-1")  # fije revision= en producción
sys.path.insert(0, path)
from joint_schema_model import collate_records, encode_record, load_release_model

model, processor = load_release_model(path, device="cuda")
temperature = json.load(open(f"{path}/calibration.json"))["temperature"]

record = {
    "state": "Che, me cobraron dos veces la cuota de este mes y nadie me responde.",
    "questions": {
        "equipo": {"type": "choice", "instructions": "¿Qué equipo debe atender el caso?",
                   "criteria": {"facturacion": "Cobros, pagos y reembolsos",
                                "soporte": "Fallas técnicas del servicio",
                                "ventas": "Planes nuevos y cambios de plan"}},
        "reembolso": {"type": "noul", "instructions": "¿El cliente pide que le devuelvan dinero?"},
    },
}
encoded = encode_record(processor.tokenizer, record, processor=processor)
batch = collate_records([encoded], processor.tokenizer.pad_token_id, torch.device("cuda"))
with torch.inference_mode():
    logits = model(batch)[0]
for q, q_logits in zip(encoded.questions, logits):
    t = temperature[record["questions"][q.question_id]["type"]]
    print(q.question_id, dict(zip(q.option_ids, (q_logits.float() / t).softmax(-1).tolist())))
Figura 3. Cargar el modelo y obtener probabilidades calibradas.

Puede hacer muchas preguntas sobre el mismo caso en una sola llamada; todas comparten la misma pasada. El archivo joint_schema_model.py viene con el repositorio y se ejecuta al importarlo, así que en producción conviene fijar revision= en el commit que usted revisó.

9 Usos y limitaciones

Para qué sirve

  • Enrutar tickets y conversaciones al equipo correcto.
  • Clasificar intenciones en chats, correos y formularios.
  • Hacer triaje y priorizar casos por urgencia.
  • Moderar contenido y revisar políticas o requisitos.
  • Verificar si un texto se desprende de otro, al estilo de la inferencia textual.
  • Poner guardarraíles a agentes de IA antes de que ejecuten una acción.
  • Puntuar respuestas contra una rúbrica.

Para qué no

No está hecho para generar texto libre, ni para tomar decisiones de alto impacto sobre personas, como crédito, salud, empleo o temas legales, sin revisión humana.

Limitaciones conocidas

  • Su punto más débil es la comprensión lectora en inglés (Belebele).
  • Se evaluó solo con texto, en español y en inglés.
  • Parte de los datos de entrenamiento es traducción automática, y una pequeña parte de las etiquetas puede tener errores.
  • La calibración se ajustó con datos en español. Fuera de ese dominio, las probabilidades pueden quedar más o menos seguras de lo debido.

10 Licencia

Los pesos se publican con licencia CC BY-NC 4.0: libres para investigación, evaluación y otros usos no comerciales, citando a Fonles. Para usarlo en producción, en un producto o servicio pagado, o detrás de una API, hace falta una licencia de Fonles. También podemos ajustarlo a su dominio o darle un endpoint privado.

Hablemos de una licencia comercial →

11 Cómo citarlo

@misc{fonles2026decision1,
  title        = {Fonles Decision 1 9B},
  author       = {Fonles},
  year         = {2026},
  howpublished = {\url{https://huggingface.co/fonles-studios/fonles-decision-1}},
  note         = {https://fonles.com}
}