Ficha técnica ·
Fonles Decision 1 9B: un modelo de decisiones para el español.
Fonles Studios · Investigación

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"
}
}
}| Pregunta | Respuesta | Probabilidad |
|---|---|---|
| Equipo | Facturación | 0,94 |
| Soporte | 0,04 | |
| Ventas | 0,02 | |
| Reembolso | Sí | 0,81 |
| No | 0,19 | |
| Urgencia | 2 de 3 | la más alta |
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ámetros | Unos 9B, pesos en bf16 |
|---|---|
| Red de lenguaje | 32 capas, dimensión 4.096, híbrida de atención lineal y completa |
| Cabeza de decisión | 4 capas de ancho 1.024 y 16 cabezas de atención, 2 de ellas de enrutamiento |
| Salida | Un puntaje por opción; probabilidades con softmax y temperatura por tipo |
| Idiomas | Español (objetivo principal) e inglés |
| Tipos de pregunta | Sí o no, una opción entre varias, puntaje en una rúbrica |
| Formato | Un solo punto de control, compatible con transformers |
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.
| Fuente | Qué aporta | Licencia u origen |
|---|---|---|
| Casos de decisión de Fonles | Casos en variedades del español y decenas de industrias | Fonles; validados contra su esquema y su respuesta |
| MASSIVE es-ES y en-US (entrenamiento) | Intenciones de asistente traducidas por personas | CC BY 4.0, © Amazon.com (FitzGerald et al., 2022) |
| PAWS-X es y en (entrenamiento) | Detección de paráfrasis con pares adversarios | Licencia 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 original | CC 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ón | CC BY-NC 4.0 (Conneau et al., 2018) |
| Plantillas de Fonles | Facturas, triaje, prioridad, moderación y casos fuera de alcance | Fonles |
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ón | LoRA de rango 256 (α 256, dropout 0,05) sobre toda la red, fusionada en los pesos |
|---|---|
| Épocas | 2, con parada temprana; mejor punto en el paso 1.300 |
| Lote | 8.192 tokens por paso, hasta 64 casos, acumulación de 4 |
| Tasa de aprendizaje | 1 × 10⁻⁴ para la LoRA y 5 × 10⁻⁵ para la cabeza, con 3 % de calentamiento |
| Pérdida | Entropí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 preguntas | Aleatorio en la mitad de los casos |
| Largo máximo | 4.096 tokens por caso |
| Salvaguardas | Evaluación cada 100 pasos; se detiene si PAWS-X, MASSIVE o el inglés caen más de 1 punto |
| Repetición en inglés | 10 % de los lotes |
| Hardware | Una GPU H100 |
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 pregunta | Nombre | Temperatura |
|---|---|---|
| Sí o no | noul | 1,019 |
| Una opción entre varias | choice | 0,900 |
| Puntaje en una rúbrica | score | 0,713 |
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.
| Modelo | Español | PAWS-X | XNLI | MASSIVE | Belebele | SIB-200 | ECE ↓ | Inglés | ES + EN |
|---|---|---|---|---|---|---|---|---|---|
| Fonles Decision 1 9B | 89,6 | 91,3 | 89,4 | 88,3 | 91,8 | 90,2 | 0,006 | 92,3 | 90,9 |
| Perplexity Decider 27B | 89,3 | 89,5 | 90,3 | 86,1 | 94,9 | 82,4 | 0,016 | 91,9 | 90,6 |
| Microsoft-Decision-1 9B | 85,8 | 84,4 | 84,1 | 87,3 | 96,2 | 89,2 | 0,054 | 90,6 | 88,1 |
| Clef 27B | 85,1 | 77,8 | 85,0 | 87,4 | 94,2 | 89,2 | 0,018 | 88,3 | 86,7 |
| Jev 1.13 | 83,2 | 78,7 | 85,7 | 76,3 | 95,3 | 91,2 | 0,034 | 84,1 | 83,6 |
| GPT-6 Luna Decisions | 76,9 | 78,0 | 75,6 | 73,8 | 91,8 | 87,3 | 0,065 | 80,2 | 78,5 |
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.
| Prueba | Partida | Decision 1 | Δ | Δ NLL [IC 95 %] |
|---|---|---|---|---|
| PAWS-X (paráfrasis) | 72,4 | 91,0 | +18,6 | −0,360 [−0,391; −0,328] |
| XNLI (inferencia) | 81,9 | 89,7 | +7,8 | −0,169 [−0,184; −0,154] |
| MASSIVE (intención) | 87,6 | 88,5 | +0,9 | −0,046 [−0,069; −0,024] |
| SIB-200 (tema) | 87,7 | 91,2 | +3,4 | −0,075 [−0,119; −0,031] |
| Belebele (lectura) | 92,3 | 92,3 | +0,0 | +0,030 [−0,004; +0,064] |
| Promedio | 82,6 | 89,8 | +7,3 |
| Prueba | Partida | Decision 1 | Δ | Δ NLL [IC 95 %] |
|---|---|---|---|---|
| PAWS-X (paráfrasis) | 77,3 | 94,8 | +17,4 | −0,340 [−0,364; −0,317] |
| MASSIVE (intención) | 90,0 | 90,0 | +0,0 | −0,020 [−0,035; −0,004] |
| Belebele (lectura) | 94,9 | 94,6 | −0,3 | +0,005 [−0,023; +0,032] |
| Promedio | 86,4 | 92,3 | +5,9 |
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 pregunta | Preguntas | Partida | Decision 1 |
|---|---|---|---|
| Sí o no | 7.172 | 81,2 | 93,7 |
| Una opción entre varias | 10.443 | 84,0 | 88,8 |
| Puntaje en una rúbrica | 1.891 | 77,6 | 90,9 |
| Total | 19.506 | 82,3 | 90,8 |
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 pillowimport 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())))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.
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}
}