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.
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.
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.
Las cinco dimensiones
Cinco loops diferentes, mejor dicho: cada prueba exige un razonamiento distinto y un formato distinto.
Techo por diseño: el JSON lo logran todos; la prueba "sin e" es casi imposible en español.
Extracción exacta: universal, no discrimina entre modelos.
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.
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.
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.
Del modelo al puntaje, sin tocar nada a mano
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>
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}.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.
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.
El ranking completo: 19 modelos, 6 pruebas cada uno
Clic en una fila para ver cada pregunta y la respuesta que arrojó el modelo.
| # | Modelo | SI | TA | LO | MA | CL | Global | Latencia | Vacías |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Ministral 3 · 8BMistral · 8B | 50 | 100 | 100 | 100 | 100 | 83.3% | 70.8 s | — |
| 2 | Qwen3-VL 8BQwen · 8B | 50 | 100 | 100 | 100 | 100 | 83.3% | 83.1 s | — |
| 3 | Ministral 3 · 14B ReasoningMistral · 14B | 50 | 100 | 100 | 100 | 100 | 83.3% | 117.1 s | — |
| 4 | Qwen3 4BQwen · 4B | 50 | 100 | 100 | 100 | 100 | 83.3% | 129.3 s | — |
| 5 | Bonsai 27BPrism ML · 27B | 50 | 100 | 100 | 100 | 100 | 83.3% | 706.4 s | 1 |
| 6 | Granite 4-H TinyIBM · ~4B | 50 | 100 | 0 | 100 | 100 | 66.7% | 14.5 s | — |
| 7 | Nemotron Nano 4BNVIDIA · 4B | 50 | 100 | 0 | 100 | 100 | 66.7% | 48.5 s | 1 |
| 8 | Qwen3-VL 4BQwen · 4B | 50 | 100 | 0 | 100 | 100 | 66.7% | 60.4 s | — |
| 9 | Phi-4 Mini ReasoningMicrosoft · 3.8B | 50 | 0 | 100 | 100 | 100 | 66.7% | 118.6 s | — |
| 10 | Liquid LFM 1.2BLiquid AI · 1.2B | 50 | 100 | 100 | 0 | 50 | 58.3% | 7 s | — |
| 11 | Phi-4Microsoft · 14B | 50 | 100 | 0 | 100 | 50 | 58.3% | 182.8 s | — |
| 12 | Gemma 4 E2BGoogle · ~3B | 50 | 100 | 0 | 0 | 100 | 50% | 35.4 s | 2 |
| 13 | Gemma 4 E4BGoogle · ~5B | 50 | 100 | 0 | 0 | 100 | 50% | 63.3 s | 2 |
| 14 | GPT-OSS 20BOpenAI · 20B | 50 | 100 | 0 | 50 | 50 | 50% | 114.3 s | — |
| 15 | GLM-4.6V FlashZ.AI · ~9B | 50 | 100 | 0 | 0 | 100 | 50% | 122.5 s | 2 |
| 16 | Gemma 4 12B QATGoogle · 15B | 50 | 100 | 0 | 0 | 100 | 50% | 183.5 s | 2 |
| 17 | Ministral 3BMistral · 3B | 50 | 100 | 0 | 0 | 50 | 41.7% | 33.2 s | — |
| 18 | DeepSeek R1 · Qwen3 8BDeepSeek · 8B | 50 | 100 | 0 | 0 | 50 | 41.7% | 134.2 s | 2 |
| 19 | Phi-4 Reasoning-PlusMicrosoft · 14.7B | 0 | 0 | 100 | 100 | 50 | 41.7% | 626.8 s | — |
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.