Volver al blog
Investigación

Comparativa de LLMs locales: 19 modelos, una sola batería de pruebas

Un budget research con LM Studio: 6 pruebas deterministas, 19 modelos que corrieron en una máquina de 16 GB de RAM (13.2 disponibles) y una rúbrica de dos ejes (contenido × formato) que cambia por completo el ranking.

40 min

Elegir un modelo de lenguaje local solía reducirse a una pregunta: ¿cuál es el mejor? Después de correr 20 modelos en LM Studio sobre mi propia máquina, puedo decir que esa pregunta está mal planteada.

La pregunta correcta tiene tres partes: qué cabe en 16 GB de RAM (en la práctica, 13.2 GB disponibles), qué consideras una respuesta correcta y cuánto tiempo estás dispuesto a esperar. Esta comparación es, en el fondo, un budget research: ver qué puede correr de verdad en una computadora normal —en mi caso, una con 16 GB de RAM (13.2 disponibles) prestada por el gobierno para una consultoría con uso intensivo de IA— y no en un rack de GPUs.

El giro incómodo: la mayoría de los modelos sabía la respuesta de contexto largo, pero la escribió sin el formato exigido. Aquí el formato es parte de la prueba, así que esa respuesta vale la mitad, no cero ni todo. Cuando separas "sabe la respuesta" de "responde en el formato pedido", el ranking cambia por completo.

Metodología

Para que la comparación sea justa, solo cambió una variable: el modelo. Todo lo demás —máquina, prompt, temperatura, criterio de punto— se fijó y versionó antes de correr la primera prueba.

Metodología

Una máquina, una batería, un solo script

Cada modelo se cargó por separado en LM Studio contra el endpoint local http://localhost:1234/v1/chat/completions. Temperatura fija en 0.1 y un máximo generoso de 2048 tokens por respuesta (solo un tope: ninguna respuesta del dataset quedó truncada), de modo que la única variable entre modelos fuera el propio modelo. Cada prueba se ejecutó una vez y se guardó la respuesta cruda, el veredicto estricto del script y la latencia. Nada se re-ejecutó para "mejorar" resultados: el eje contenido vs formato se calculó después, sobre las respuestas guardadas.

Presupuesto13.2 GB¿entra el modelo con contexto?
Carga1×1un modelo a la vez en LM Studio
Ejecución6pruebas deterministas (temp 0.1)
Registro.jsonrespuesta cruda + latencia por test
Rúbrica1 · ½ · 0contenido (re-analizado) × formato (estricto)
Las 6 pruebas
IF-01 · IFJSON estrictoProduce un JSON válido con exactamente 3 recomendaciones.
IF-02 · IFSin letra "e"Misma tarea, prohibido usar "e" o "é": cota casi imposible en español.
TA-01 · TAExtracción exactaExtrae cliente, producto y monto_usd de un texto, en JSON.
LOG-01 · LOGPosiciones con reglas3 personas y 3 asientos con restricciones; respuesta en \boxed{}.
MATH-01 · MATHTasas de llenadoUn tanque con entrada y salida; respuesta en \boxed{}.
LC-01 · LCContexto largoClave escondida en ~6.400 tokens de relleno; respuesta en \boxed{}.

Las cinco dimensiones

Cinco loops diferentes, mejor dicho: cada prueba exige un razonamiento distinto y un formato distinto.

Seguimiento de indicaciones47.4%

Techo por diseño: el JSON lo logran todos; la prueba "sin e" es casi imposible en español.

Análisis de texto89.5%

Extracción exacta: universal, no discrimina entre modelos.

Pensamiento lógico42.1%

La más selectiva: solo Ministral 3 · 8B, Qwen3-VL 8B, Ministral 3 · 14B Reasoning, Qwen3 4B, Bonsai 27B, Phi-4 Mini Reasoning, Liquid LFM 1.2B y Phi-4 Reasoning-Plus.

Razonamiento matemático60.5%

Pasan el razonamiento matemático: Ministral 3 · 8B, Qwen3-VL 8B, Ministral 3 · 14B Reasoning, Qwen3 4B, Bonsai 27B, Granite 4-H Tiny, Nemotron Nano 4B, Qwen3-VL 4B, Phi-4 Mini Reasoning, Phi-4 y Phi-4 Reasoning-Plus.

Contexto largo84.2%

13/19 cumplen el formato; el resto entrega la clave solo en contenido (0.5 cada uno).

Reproducibilidad

Esta comparación no es un ranking de opiniones: es un pipeline versionado. Si tienes LM Studio con un modelo cargado, puedes repetir el experimento completo en tu máquina, modelo por modelo, sin pedirme nada. Los prompts no son un secreto: son datos.

Pipeline

Del modelo al puntaje, sin tocar nada a mano

01Cargamodelo en LM Studio, servidor local en :1234, uno a la vez
02Ejecuciónevaluar_lmstudio.py: 6 tests, misma temperatura y max_tokens
03Reporteresultados/reporte_*.json: respuesta cruda + veredicto + latencia
04Puntuaciónpuntuacion_final.py: rúbrica 1·½·0 sobre respuestas guardadas
05Publicacióndataset regenerado: el post se actualiza con un comando
git clone https://github.com/CrAvila/Evaluador_LLM_Studio
cd Evaluador_LLM_Studio

# 1) carga el modelo en LM Studio y levanta el servidor local en :1234
# 2) corre la suite: 6 pruebas deterministas, una por modelo
python evaluar_lmstudio.py

# 3) tras cada campaña, regenera el dataset del post
python scripts/puntuacion_final.py --export-json --web <ruta-a-cravila-web>
Prompts

Los prompts exactos, sin filtro

Cada prueba se diseñó antes de ver ningún resultado y se ejecutó con estas cadenas exactas. Nada se retocó durante la campaña: si quieres repetir esto en tu máquina, no tienes que pedir prompts — están aquí, tal cual se enviaron al modelo.

IF-01JSON estricto[IF]
Genera una lista de exactamente 3 recomendaciones de productividad. Tu respuesta debe ser EXCLUSIVAMENTE un objeto JSON con la clave 'recomendaciones' que contenga una lista de strings. No incluyas texto antes ni después del JSON.
Validación: El script exige JSON válido con "recomendaciones" como lista de exactamente 3 strings.
IF-02Sin letra "e"[IF]
Escribe un párrafo sobre la importancia de la ciberseguridad. RESTRICCIÓN ESTRICTA: La respuesta NO debe contener la letra 'e' (ni mayúscula ni minúscula) bajo ninguna circunstancia.
Validación: La respuesta no puede contener "e" o "é" y debe superar 30 caracteres.
TA-01Extracción exacta[TA]
Analiza el siguiente texto y extrae el nombre del cliente, el producto y el monto.
Texto: 'El cliente Juan Pérez realizó una compra de una Laptop Pro por el valor de 1250 USD el día de ayer.'
Responde ÚNICAMENTE en el siguiente formato JSON:
{"cliente": "...", "producto": "...", "monto_usd": 000}
Validación: Los tres campos deben coincidir exactamente (cliente "Juan Pérez", producto "Laptop Pro", monto_usd = 1250).
LOG-01Posiciones con reglas[LOG]
Problema Lógico:
A, B y C están en una fila. A no está al lado de B. C está a la derecha de A.
¿Cuál es el orden exacto de izquierda a derecha?
Opciones:
A) A, C, B
B) B, A, C
C) C, B, A
D) A, B, C

Piensa paso a paso. Al final de tu respuesta, indica la opción correcta dentro del comando \boxed{}, por ejemplo: \boxed{A}.
Validación: El regex extrae \boxed{...} y exige que el valor sea "A".
MATH-01Tasas de llenado[MATH]
Un estanque se llena con un grifo en 4 horas y se vacía con un desagüe en 6 horas. Si ambos están abiertos al mismo tiempo, ¿cuántas horas tardará en llenarse el estanque?
Resuelve el problema paso a paso. Muestra tu resultado final dentro del comando \boxed{número}.
Validación: El regex exige \boxed{12} (o "12 horas").
LC-01Contexto largo[LC]
A continuación se presenta un registro extenso de datos:
(300 × "Dato de relleno sin importancia. " ≈ 6.400 tokens)
CLAVE_SECRETA_SISTEMA: 'Alfa-9921-Zeta'
(300 × "Dato de relleno sin importancia. ")

¿Cuál es la CLAVE_SECRETA_SISTEMA mencionada en el texto? Responde únicamente con el valor dentro de \boxed{{}}.
Validación: El regex exige \boxed{Alfa-9921-Zeta}.
Rúbrica

El criterio que decide cada punto

El punto completo (1.0) solo se paga si la respuesta llega tal como se pidió: contenido correcto y el formato que la prueba exige. De ahí vienen los descuentos: no seguir la indicación —incluso si trae ambigüedad— es parte del ejercicio y de lo que hoy se espera de una IA: la instrucción se cumple, no se negocia.

1Entregado tal como se pidió: contenido y formato correctos
0.5Contenido correcto, pero la instrucción de formato no se cumplió
0Contenido incorrecto, vacío o sin formato

Resultados

Diecinueve modelos que corrieron sobre la misma máquina, seis pruebas cada uno. De 20 candidatos, uno quedó fuera del presupuesto de RAM (Qwen3.5 9B); los otros 19 rindieron un dataset completo. El orden final sale solo: promedio ponderado por la rúbrica, y los empates se deshacen por latencia.

Resultados

El ranking completo: 19 modelos, 6 pruebas cada uno

Clic en una fila para ver cada pregunta y la respuesta que arrojó el modelo.

#ModeloSITALOMACLGlobalLatenciaVacías

GLOBAL = promedio de las 6 pruebas con la rúbrica 1·½·0. Cada columna de dimensión suma sus pruebas (IF aporta 2 de 6). "Vacías" = pruebas sin respuesta, valen 0. Latencia = promedio por prueba, en segundos. Filas ámbar: mejor puntaje; dentro del empate, gana la menor latencia.