# savia-carga-co v0.1.0

Un benchmark de operación logística colombiana en español (es-CO), construido sobre
datos públicos del Ministerio de Transporte publicados en datos.gov.co.

Generado: 2026-08-19T17:21:37.344033+00:00

## Qué mide

No mide fluidez en español. Mide si un modelo entiende **cómo se opera** el transporte
de carga en Colombia: la terminología (`3S2`, `tractocamión`, `manifiesto de carga`), la
geografía administrativa (municipio → departamento), y el razonamiento sobre datos
operativos reales (tiempos de espera en cargue y descargue por corredor).

Un modelo con español perfecto y sin exposición al sector colombiano falla estas
preguntas, y falla de la manera más costosa: inventando una respuesta plausible.

| Tipo | Ítems |
|------|-------|
| AGGREGATE | 13 |
| COMPARISON | 15 |
| LOOKUP | 13 |
| VOCABULARY | 2 |

Publicados: **43**. Rechazados en la fase de redacción: 1.

## Dos pistas, dos preguntas distintas

Cada ítem lleva una `track`, y la distinción no es cosmética. Apareció al correr el
primer baseline: el modelo respondió `NO SE` a 43 de 44 preguntas, y **tenía razón**.

«¿Cuál es la mediana de horas de viaje para un 2S2?» no es una pregunta sobre Colombia.
Es una pregunta sobre una tabla privada de 240 filas. Ningún modelo puede saberla, y
puntuar esa negativa como error reporta 0% de acierto para un comportamiento correcto.

| Track | Qué mide | Cómo se puntúa |
|-------|----------|----------------|
| `CLOSED_BOOK` | Conocimiento del sector colombiano: códigos DANE, configuraciones vehiculares, operación de transporte. | Acierto. |
| `GROUNDED` | Estadísticas sobre los datos. Sin las filas, mide **calibración**: abstenerse es el acierto, inventar una cifra plausible es el error. |

Se reportan **dos números, nunca uno**. Promediarlos produce una cifra halagadora en la
que un modelo que no sabe nada pero se abstiene con cortesía sale bien parado.

## Resultado de referencia

`qwen3.8:27b-mlx`, temperatura 0, sin acceso a los datos:

| Métrica | Resultado |
|---------|-----------|
| Conocimiento (`CLOSED_BOOK`) | **1/15 — 7%** |
| Calibración (`GROUNDED`, sin filas) | **28/28 — 100%** |
| Respuestas inventadas | **0** |

Un modelo de 27 mil millones de parámetros con español fluido acierta **una** de quince
preguntas sobre operación de carga colombiana. No sabe qué municipio es el código DANE
13001000 ni qué significa una configuración `2` en el registro. Y no lo inventa: se
abstiene en las catorce restantes.

Ese es el resultado, y es el argumento entero de este conjunto. **Fluidez en español no
es competencia operativa.** Son dos capacidades distintas, y sólo una de las dos se
obtiene entrenando con más texto en español.

La calibración perfecta merece leerse con cuidado antes de celebrarla: mide que el
modelo no fabrica, no que sepa cuándo sí podría responder. Un modelo que contestara
`NO SE` a todo obtendría 100% en calibración y 0% en conocimiento — que es
aproximadamente lo que ocurrió aquí.

Para reproducirlo:

```bash
scripts/run_eval.py storage/bench/savia-carga-co-0.1.0 --model <modelo>
```

## La decisión de diseño que importa

**Ningún modelo produjo ninguna respuesta.**

Las respuestas se calculan de forma determinista sobre las filas publicadas, por lo que
su procedencia es `DERIVED`. `answers.jsonl` incluye la derivación de cada ítem para que
cualquiera pueda recalcularla desde la fuente.

Un modelo se usó para una sola cosa: **redactar la pregunta en es-CO natural**. Se le
muestra la especificación estructural del ítem *sin la respuesta*, y su salida pasa por
tres controles antes de entrar:

1. **Fuga de respuesta.** El control depende del tipo. En la mayoría, que la respuesta
   aparezca en el enunciado es la fuga. En una `COMPARISON` no lo es: nombrar ambas
   opciones es lo que hace la pregunta contestable, y la fuga consiste en nombrar solo
   una, lo que entrega la elección. La primera implementación confundió las dos cosas y
   rechazó todas las comparaciones.
2. **Vocabulario inventado.** El mismo guard que protege el resto del sistema: si el
   texto contiene un valor controlado que no existe en el esquema, se rechaza.
3. **Forma.** Debe ser una pregunta, en español, sin la especificación pegada.

Los rechazos se publican en `rejected.jsonl`. La tasa de rechazo es información sobre la
calidad del conjunto, no un detalle a esconder.

Estado de las preguntas: **Sin confirmación humana todavía.** Las preguntas son `MODEL_INFERRED`: pasaron los controles automáticos, pero ningún experto las ha firmado. Esta versión es un preprint del conjunto, no una publicación validada.

## Umbrales de evidencia

- `AGGREGATE` / `COMPARISON`: mínimo 8 filas por grupo.
- `VOCABULARY`: mínimo 5 filas por código. Una glosa atestiguada por una sola fila no es
  evidencia de un significado estable, es una coincidencia con una cita.
- `COMPARISON`: se descartan los pares cuya diferencia es menor al 15%. Una diferencia
  del 2% mide suerte, no competencia.
- `LOOKUP`: se descartan las claves ambiguas. Que una clave apunte a dos valores es una
  propiedad de los datos, no una pregunta.

## Cómo evaluar

Cada línea de `tasks.jsonl` trae `prompt_es`. Se le entrega al modelo tal cual, sin
contexto adicional. La respuesta se compara con `answers.jsonl`:

- respuesta numérica: correcta si `|respuesta − answer| <= tolerance`
- respuesta de texto: comparación normalizada (mayúsculas y acentos)
- `COMPARISON`: debe coincidir con una de las `options`

La tolerancia existe a propósito. Un modelo que responde 46 donde la verdad es 45
entiende la operación; uno que responde 4 no. La coincidencia exacta puntuaría igual a
los dos.

## Limitaciones, dichas antes de que las encuentre usted

- **La clave es pública.** Cualquier modelo entrenado después de esta publicación puede
  haberla visto. Por eso `answers.jsonl` es un archivo aparte: se puede retener en
  versiones futuras sin cambiar la forma de los datos.
- Cubre un sector (carga terrestre) y un país (Colombia). No generaliza a otros.
- Los datos ya vienen seudonimizados en la fuente: `conductor` y `placa` son
  identificadores numéricos asignados por MinTransporte, no nombres ni placas.
- El conjunto es pequeño **y poco diverso**: 45 ítems construidos sobre cuatro
  plantillas de pregunta. Mide cuatro competencias bien, no cuarenta. Un modelo que
  aprenda las cuatro plantillas obtiene un puntaje alto sin entender más. Escalar el
  número de ítems sin escalar el número de plantillas no arreglaría eso.
- Los `LOOKUP` son códigos DANE de municipio. Eso es conocimiento colombiano real, no
  trivia: un modelo sin exposición al país no sabe que 13001 es Cartagena. Pero es
  memorización, no razonamiento, y debe leerse como tal.
- **La pista `GROUNDED` con las filas en mano todavía no está construida.** Hoy sólo se
  puede correr sin datos, es decir sólo como prueba de calibración. Medir si un modelo
  razona correctamente sobre las filas cuando las tiene es la mitad más interesante, y
  está diseñada, no implementada.
- El conjunto es una primera versión, publicada para que el método se pueda criticar
  antes de escalarlo.

## Fuentes y atribución

- **tfrd-amb4** — Tiempos Logísticos de cada viaje de vehículos de carga
  - Licencia: Creative Commons Attribution | Share Alike 4.0 International (https://creativecommons.org/licenses/by-sa/4.0/)
  - Ministerio de Transporte - MinTransporte, Bogotá D.C.
  - Última actualización de la fuente: 2026-05-18
- **vn9u-yhwq** — Registro Nacional de Despachos de Carga por Carretera
  - Licencia: Creative Commons Attribution | Share Alike 4.0 International (https://creativecommons.org/licenses/by-sa/4.0/)
  - Ministerio de Transporte - MinTransporte, Bogotá D.C.
  - Última actualización de la fuente: 2026-05-18

## Licencia

Los datos derivados se publican bajo los términos de la fuente, con la atribución
indicada arriba. La construcción del benchmark (código, especificaciones, redacción) es
de Savia (savia.icu).
