Casos que el equipo puede consultar mientras ajusta prompts, fragmentación y parámetros.
Cómo evaluar una IA local antes de ponerla en producción
Construye un banco de pruebas que puedas repetir para comparar modelos, instrucciones, buscadores documentales, herramientas y hardware. Con casos reales de tu empresa medirás la calidad, los errores críticos, la seguridad, el tiempo de respuesta, la memoria y cuántas peticiones simultáneas soporta cada configuración.
Decide qué significa «correcto» antes de mirar respuestas
Evaluar no es "me gusta cómo responde": es un examen fijo. Ejemplo real: las mismas 30 preguntas de tu negocio — con sus respuestas correctas escritas de antemano — pasadas a cada modelo candidato; gana el que más acierta. Sin examen se cambia de modelo por sensaciones; con examen, por datos.
Una evaluación útil parte del proceso. Define el error crítico, el error tolerable, la salida mínima y la revisión humana. No mezcles una tarea creativa con una extracción exacta bajo una única puntuación.
| Tarea | Correcto | Error crítico | Métrica principal |
|---|---|---|---|
| RAG | Respuesta apoyada por fuentes autorizadas | Cita inexistente o fuga entre roles | Recall de evidencia + groundedness |
| Extracción | JSON válido y campos correctos | Importe, referencia o identidad incorrecta | Exactitud por campo |
| Clasificación | Etiqueta permitida | Clase crítica confundida | Precision/recall por clase |
| Borrador | Útil y verificable | Compromiso o hecho inventado | Aceptación con cambios menores |
| Agente | Herramientas y argumentos correctos | Acción no autorizada | Éxito sin efectos indebidos |
| Imagen | Salida ajustada al workflow | Contenido prohibido o representación incorrecta | Revisión por criterios y tiempo |
Plantilla de plan
name: soporte-rag
owner: soporte
system_under_test:
runtime: ollama
model_alias: instruct-candidate-a
prompt_version: support-v3
index_version: manuals-release-hash
scope:
task: responder con evidencia
users: soporte-nivel-1
languages: [es]
thresholds:
critical_errors: 0
retrieval_recall_at_5: 0.90
citation_precision: 0.98
schema_valid: 1.00
p95_latency_seconds: 20
permission_leaks: 0
repetitions: 3
reviewers: [experto-proceso, tecnico-evaluacion]Los números son ejemplos de estructura, no umbrales universales. Debes fijarlos según impacto y capacidad del proceso.
Separa desarrollo, aceptación y pruebas adversarias
Casos ocultos al ajuste. Se ejecutan para decidir si una versión puede avanzar.
Inyección, permisos, entradas largas, ambigüedad, ausencia de respuesta y herramientas inválidas.
Errores reales corregidos que nunca deben reaparecer.
Cobertura que debes registrar
- Tipos de usuario y permisos.
- Idiomas, formatos y longitudes.
- Casos frecuentes, raros y de frontera.
- Documento vigente, obsoleto, contradictorio y ausente.
- Campos vacíos, duplicados y malformados.
- Preguntas con códigos exactos y con lenguaje natural.
- Operaciones permitidas, denegadas y reversibles.
- Situaciones en las que el modelo debe abstenerse.
Formato JSONL
JSONL es un archivo de texto en el que cada línea contiene un objeto JSON independiente. Esta estructura permite añadir casos, filtrarlos y procesarlos uno a uno sin cargar todo el conjunto en memoria. En el ejemplo, cada línea describe la entrada, quién puede ejecutarla y qué resultado se considera correcto o prohibido.
{"id":"rag-001","input":"...","user_groups":["soporte"],"relevant_sources":["manual-42#sec-3"],"required_facts":["..."],"forbidden_claims":["..."],"must_abstain":false,"risk":"medio"}
{"id":"rag-002","input":"...","user_groups":["ventas"],"relevant_sources":[],"required_facts":[],"forbidden_claims":["contenido-soporte"],"must_abstain":true,"risk":"alto"}
{"id":"tool-001","input":"...","allowed_tools":["crear_borrador"],"expected_tool":"crear_borrador","expected_args":{"ticket_id":"SUP-000001"},"must_require_approval":true}El dataset no debe contener secretos ni datos que el entorno de evaluación no esté autorizado a tratar. Seudonimiza y conserva una tabla de correspondencia fuera del repositorio cuando sea imprescindible.
Fija todo lo que pueda cambiar la salida
Identificador de configuración
{
"run_id": "eval-00042",
"model_family": "familia-candidata",
"model_artifact": "nombre-y-hash",
"runtime": "nombre-y-version-probada",
"prompt_hash": "sha256:...",
"dataset_hash": "sha256:...",
"index_hash": "sha256:...",
"temperature": 0,
"seed": 42,
"max_output_tokens": 1200,
"context_limit": 16000,
"hardware": "gpu-y-memoria",
"driver": "version-probada"
}No todos los backends garantizan determinismo aunque fijes semilla y temperatura. Repite los casos y registra dispersión. Para comparación, mantén idénticos prompt, contexto y herramientas salvo la variable que estás estudiando.
Calienta el modelo
La primera petición incluye carga de pesos y no representa el servicio calentado. Mide por separado arranque en frío, primera petición y operación estable. Para servicios con descarga automática de modelos, prueba también el retorno después de inactividad.
Combina comprobaciones automáticas y revisión experta
Comprobaciones automáticas
- JSON válido y conforme al esquema.
- Campos obligatorios, tipos, longitudes y enumeraciones.
- Presencia o ausencia de cadenas críticas.
- Citas que resuelven a una fuente recuperada.
- Cálculos comparados con un motor determinista.
- Idioma, estructura y límite de salida.
Rúbrica de revisión
| Criterio | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| Exactitud | Incorrecta | Errores importantes | Correcta con matices | Correcta y precisa |
| Cobertura | No responde | Omite lo esencial | Cubre casi todo | Cubre lo necesario |
| Evidencia | Inventada | Débil | Parcial | Directa y suficiente |
| Acción | Insegura | Ambigua | Revisable | Clara y dentro del alcance |
| Forma | Inválida | Difícil de usar | Utilizable | Lista para revisar |
Define ejemplos ancla para cada puntuación. Si dos revisores discrepan con frecuencia, la rúbrica es ambigua o la tarea no está suficientemente especificada.
Errores críticos como veto
Una media alta puede ocultar una fuga o una acción peligrosa. Cuenta por separado errores críticos y exige cero cuando el impacto lo requiera.
Separa recuperación de generación
Si la respuesta es mala, primero comprueba si la evidencia correcta llegó al contexto. Ajustar el modelo no resuelve una recuperación defectuosa.
Métricas de recuperación
- Recall@k: proporción de preguntas en las que al menos una fuente relevante aparece entre los primeros k resultados.
- Precision@k: proporción de resultados recuperados que son relevantes.
- MRR: favorece que la primera fuente relevante aparezca pronto.
- nDCG: útil cuando hay varios grados de relevancia.
- Cobertura de permisos: fuentes relevantes accesibles al rol frente a fuentes bloqueadas.
Métricas de respuesta
- Hechos apoyados por los fragmentos.
- Citas correctas y resolubles.
- Ausencia de afirmaciones no respaldadas.
- Respuesta de abstención cuando no hay evidencia.
- Uso de la versión vigente.
Tabla de diagnóstico
| Recuperación | Respuesta | Diagnóstico | Acción |
|---|---|---|---|
| Mala | Mala | Índice, consulta o filtros | Fragmentación, metadatos, híbrida, reranker |
| Buena | Mala | Prompt, modelo o contexto | Contrato de respuesta, modelo, orden de evidencia |
| Mala | Aparentemente buena | Respuesta por conocimiento previo | Exigir citas y probar preguntas propias |
| Buena | Buena | Candidato válido | Probar seguridad, regresión y carga |
Script sencillo de recall
def recall_at_k(retrieved_ids, relevant_ids, k):
relevant = set(relevant_ids)
if not relevant:
return None
return int(bool(set(retrieved_ids[:k]) & relevant))
def precision_at_k(retrieved_ids, relevant_ids, k):
selected = retrieved_ids[:k]
if not selected:
return 0.0
relevant = set(relevant_ids)
return sum(item in relevant for item in selected) / len(selected)Mide la trayectoria, no solo el texto final
| Dimensión | Qué registrar |
|---|---|
| Selección | Herramienta elegida frente a permitidas y esperada |
| Argumentos | Schema, valores, IDs y límites |
| Autorización | Rol, aprobación y credencial utilizada |
| Ejecución | Resultado real, error, reintento e idempotencia |
| Trayectoria | Número de pasos, bucles y condición de parada |
| Efectos | Cambios previstos, no previstos y reversibilidad |
| Explicación | Resumen fiel de lo que ocurrió |
Casos obligatorios
- Herramienta inexistente.
- Argumento fuera de enumeración.
- ID válido con usuario sin permiso.
- Operación duplicada.
- Timeout de API.
- Resultado parcial.
- Documento que ordena usar una herramienta.
- Petición de elevar privilegios.
- Máximo de iteraciones alcanzado.
Un agente falla aunque su texto final sea correcto si llamó a una herramienta que no necesitaba, usó una credencial excesiva o dejó un efecto no esperado.
Mide prefill, generación, cola y memoria
Métricas técnicas
- Tiempo de carga del modelo.
- Tiempo hasta primer token.
- Tiempo de prefill o procesamiento de entrada.
- Tokens de salida por segundo.
- Latencia total y percentiles.
- Memoria de GPU o unificada máxima.
- Peticiones en cola y rechazadas.
- Throughput total con concurrencia.
- Estabilidad térmica y errores.
Matriz de carga
| Entrada | Salida | Concurrencia | Objetivo |
|---|---|---|---|
| Corta | Corta | 1 | Latencia interactiva base |
| Larga | Corta | 1 | Coste de prefill y contexto |
| Corta | Larga | 1 | Velocidad de generación |
| Representativa | Representativa | Pico previsto | Cola y throughput |
| Máxima permitida | Máxima permitida | Pico | Límites y recuperación |
Percentiles
Registra mediana, p90, p95 y p99 cuando haya suficientes muestras. El promedio oculta colas largas. También mide errores y peticiones canceladas.
Prueba de memoria
nvidia-smi --query-gpu=timestamp,name,memory.used,memory.total,utilization.gpu,temperature.gpu,power.draw \
--format=csv -l 2 > gpu-metrics.csvEn plataformas de memoria unificada, complementa con métricas del sistema y del runtime. La cifra de memoria disponible no garantiza que una carga tenga la latencia deseada.
Ejecuta el dataset y conserva resultados crudos
Este ejemplo usa solo la biblioteca estándar de Python y una API local de chat. Adapta el parser de métricas al runtime. No evalúa calidad por sí solo; produce respuestas y tiempos para las comprobaciones posteriores.
from __future__ import annotations
import hashlib
import json
import pathlib
import time
import urllib.request
API = "http://127.0.0.1:11434/api/chat"
MODEL = "MODELO_PROBADO"
DATASET = pathlib.Path("cases.jsonl")
OUTPUT = pathlib.Path("results.jsonl")
def call_model(case: dict) -> dict:
payload = {
"model": MODEL,
"stream": False,
"messages": [
{"role": "system", "content": case.get("system", "Responde de forma verificable.")},
{"role": "user", "content": case["input"]},
],
"options": {"temperature": 0, "seed": 42},
}
request = urllib.request.Request(
API,
data=json.dumps(payload).encode("utf-8"),
headers={"Content-Type": "application/json"},
method="POST",
)
started = time.perf_counter()
with urllib.request.urlopen(request, timeout=300) as response:
body = json.load(response)
return {
"id": case["id"],
"seconds": time.perf_counter() - started,
"response": body.get("message", {}).get("content", ""),
"runtime_metrics": {k: body.get(k) for k in (
"total_duration", "load_duration", "prompt_eval_count",
"prompt_eval_duration", "eval_count", "eval_duration")},
}
def main() -> None:
dataset_hash = hashlib.sha256(DATASET.read_bytes()).hexdigest()
with DATASET.open(encoding="utf-8") as source, OUTPUT.open("w", encoding="utf-8") as target:
for line in source:
case = json.loads(line)
result = call_model(case)
result["dataset_sha256"] = dataset_hash
target.write(json.dumps(result, ensure_ascii=False) + "\n")
target.flush()
if __name__ == "__main__":
main()Conserva tres capas
- Entrada: dataset, configuración y hashes.
- Salida cruda: respuesta, recuperación, herramientas, tiempos y errores.
- Puntuación: reglas automáticas, revisión y decisión.
No cambies varias variables a la vez
Orden recomendado de experimentos
Establece una base
Modelo compacto, prompt simple, sin RAG o con recuperación mínima.
Mejora la recuperación
Fragmentación, filtros, híbrida y reranking con el modelo fijo.
Compara modelos
Mismo contexto y parámetros; registra calidad y memoria.
Ajusta prompts y formato
Una modificación por experimento.
Optimiza rendimiento
Contexto, cuantización, motor, lote y concurrencia sin rebasar calidad.
Prueba el sistema final
Incluye identidad, herramientas, red, copias y operación.
Informe de decisión
Configuración candidata: ...
Caso y alcance: ...
Dataset y hash: ...
Calidad: aprobado / no aprobado
Errores críticos: ...
RAG: recall, citas, permisos
Herramientas: éxito, rechazos, efectos
Rendimiento: p50/p95, throughput, memoria
Seguridad: pruebas ejecutadas y excepciones
Operación: copia, restauración y rollback
Riesgos residuales: ...
Decisión: piloto / preproducción / producción / rechazar
Responsables y próxima revisión: ...Cada error real debe convertirse en una prueba
Cuando un usuario detecta un fallo, anonímalo, clasifícalo y añádelo al conjunto de regresión. Ejecuta la batería antes de cambiar modelo, prompt, runtime, índice, documentos, embeddings, reranker o herramienta.
Puertas automáticas
- Cero errores críticos.
- Cien por cien de respuestas conforme al esquema cuando sea obligatorio.
- Sin fuga de permisos.
- Recuperación y calidad no inferiores al margen acordado.
- Latencia y error dentro del presupuesto.
- Restauración y rollback disponibles.
Publica un registro de versiones interno que relacione cambio, resultado y aprobación. La guía de operación explica despliegues y reversión.
Evaluación completa antes de producción
- Caso, propietario, salida y error crítico definidos.
- Dataset de desarrollo y aceptación separados.
- Casos adversarios y de abstención incluidos.
- Modelo, runtime, prompt, índice y hardware identificados.
- Repeticiones y parámetros fijados.
- Calidad automática y humana documentada.
- RAG evaluado antes de generación.
- Herramientas evaluadas por trayectoria y efecto.
- Seguridad y aislamiento por roles probados.
- Latencia, memoria, cola y concurrencia medidas.
- Resultados crudos y hashes conservados.
- Umbrales, veto y decisión aprobados.
- Regresión integrada en el cambio.
Convierte el caso de uso en una decisión de hardware verificable
Define la tarea, prepara una prueba y mide memoria, tiempo y usuarios simultáneos. El objetivo es traducir el tutorial a requisitos de compra concretos sin presentar la implantación como un servicio estándar.
- 01
Define la carga
Concreta tarea, familia de modelo, contexto, lote y usuarios simultáneos.
Aclarar el caso de uso → - 02
Dimensiona memoria
Compara VRAM, memoria coherente, velocidad y margen de crecimiento.
Usar el recomendador de hardware → - 03
Compra en la tienda
Abre la ficha comercial para consultar configuración, precio cerrado, disponibilidad y condiciones vigentes.
Contacto y disponibilidad →
RTX PRO 6000 · 96 GB
Prioriza una GPU profesional para inferencia, imagen, vídeo o serving cuando el modelo y el contexto caben en sus 96 GB de VRAM.
Ver ficha profesional →NVIDIA DGX Spark · 128 GB
Considera memoria unificada para desarrollo CUDA y cargas que superan la VRAM de una GPU, aceptando que capacidad no equivale siempre a más velocidad.
Ver ficha y comprar →Recomendador de hardware
Responde cinco preguntas y compara el equipo actual, una GPU NVIDIA, la RTX PRO 6000 y sistemas GB10 como DGX Spark, ASUS Ascent GX10 o Lenovo ThinkStation PGX.
Comparar opciones →aisupercomputers.es aporta guías y herramientas de decisión. La compra, el precio cerrado en la ficha y el soporte comercial desde España se gestionan en las tiendas del grupo Ietres.
Evaluar modelos y sistemas
¿Puedo usar un benchmark público para elegir modelo?
Como señal inicial, no como decisión. Debes probar idioma, formato, datos y errores de tu proceso. Un modelo bien clasificado puede fallar en códigos, abstención, contexto o herramienta.
¿Cuántos casos necesito?
Los suficientes para cubrir clases, riesgos y variantes. Empieza con decenas de casos bien revisados y amplía con errores reales; para decisiones críticas necesitarás mayor cobertura y revisión.
¿Puede un LLM puntuar a otro LLM?
Puede ayudar con una rúbrica, pero introduce sesgo y variabilidad. Combínalo con comprobaciones deterministas, ejemplos ancla y revisión humana, especialmente en errores críticos.
¿Qué métrica resume mejor un RAG?
Ninguna por sí sola. Necesitas recuperación de evidencia, precisión de citas, respuesta respaldada, abstención y permisos. Separa dónde falla la cadena.
¿Cómo comparo hardware?
Usa el mismo modelo, runtime, prompts, entradas, salidas y concurrencia. Registra memoria, latencia, throughput y estabilidad. Una prueba de contexto corto no representa un RAG largo.
- Un modelo más grande: solo en pareja — dos unidades con su cable directo (hasta 405B). El "en serie" de 3 o 4 no existe.
- Más usuarios o más trabajo: las que quieras — 4, 50, 500 — en estrella a un switch, cada una con el modelo completo y un repartidor delante.
- Para recordar: dos se funden; los demás se suman. Guía completa de clústeres →