Cómo Evaluar LLMs como Agentes Autónomos: Guía Completa de Benchmarks y Métricas
TL;DR - Resumen Ejecutivo#
La evaluación de agentes LLM es el proceso de medir objetivamente cómo un modelo de lenguaje (GPT-4, Claude, Gemini, etc.) actúa como agente autónomo en tareas interactivas. A diferencia de evaluar generación de texto, aquí medimos toma de decisiones, planificación y adaptación.
Puntos clave de esta guía:
- Métricas fundamentales: tasa de éxito, eficiencia de pasos, coherencia de acciones, robustez ante errores
- Frameworks populares: LLM-Plays-Games, AgentBench, HELM, WebArena, SWE-bench
- Herramienta práctica: Framework open-source en Python para evaluar agentes en juegos de texto
- Comparativa de modelos: GPT-4 vs Claude 3 vs Gemini como agentes autónomos
- Código completo: Implementación paso a paso con ejemplos ejecutables
¿Qué es la evaluación de agentes LLM?#
La evaluación de agentes LLM mide la capacidad de modelos de lenguaje para actuar como sistemas autónomos que toman decisiones, ejecutan acciones y alcanzan objetivos en entornos interactivos.
Según el paper de Stanford sobre evaluación de agentes IA (2024), menos del 15% de los papers que proponen agentes LLM incluyen evaluación cuantitativa rigurosa. Esto crea un problema: no sabemos realmente qué modelo funciona mejor para qué tipo de tarea agéntica.
La evaluación de agentes difiere fundamentalmente de evaluar LLMs en tareas de texto:
| Aspecto | Evaluación de Texto | Evaluación de Agentes |
|---|---|---|
| Entrada | Prompt estático | Estado dinámico del entorno |
| Salida | Texto generado | Acciones ejecutables |
| Métrica | Perplexity, BLEU, coherencia | Tasa de éxito, eficiencia, robustez |
| Contexto | Fijo por conversación | Evoluciona con cada acción |
| Feedback | Humano o automático | Del entorno (recompensa/estado) |
¿Por qué evaluar LLMs como agentes autónomos?#
Los LLMs como GPT-4, Claude 3 y Gemini se usan cada vez más como agentes autónomos en aplicaciones reales: asistentes de código, automatización de tareas, navegación web, y toma de decisiones empresariales.
Estadísticas relevantes:
- Según Gartner (2025), el 30% de las empresas usarán agentes IA autónomos en producción para 2027
- El mercado de agentes IA alcanzará $47.1 billion en 2030 (Grand View Research)
- 65% de los desarrolladores usan LLMs para automatización de tareas (Stack Overflow Survey 2025)
"Evals are the most underrated part of AI development. If you can't measure it, you can't improve it." — Andrej Karpathy, ex-Director de IA en Tesla y OpenAI
Sin evaluación objetiva, las empresas despliegan agentes sin saber:
- ¿Qué modelo es mejor para mi caso de uso?
- ¿Cuándo fallará el agente?
- ¿Cómo mejora con diferentes prompts?
- ¿Cuál es el coste real por tarea completada?
Tipos de benchmarks para agentes LLM#
Existen diferentes categorías de benchmarks según el tipo de tarea agéntica que evalúan.
1. Benchmarks de Razonamiento y Planificación#
Evalúan la capacidad del agente para descomponer problemas complejos y planificar secuencias de acciones.
| Benchmark | Tipo de Tarea | Métricas |
|---|---|---|
| ARC (AI2) | Razonamiento científico | Accuracy |
| GSM8K | Problemas matemáticos | Solve rate |
| HotpotQA | Razonamiento multi-hop | F1, EM |
| StrategyQA | Razonamiento estratégico | Accuracy |
2. Benchmarks de Interacción con Entornos#
Miden cómo el agente interactúa con sistemas externos (web, código, APIs).
| Benchmark | Entorno | Qué Mide |
|---|---|---|
| WebArena | Navegación web | Tasa de éxito en tareas web |
| SWE-bench | Repositorios de código | Bugs resueltos correctamente |
| AgentBench | Multi-entorno | Rendimiento general como agente |
| ToolBench | Uso de APIs/herramientas | Precisión en llamadas a tools |
3. Benchmarks de Juegos y Simulación#
Evalúan toma de decisiones en entornos simulados con reglas definidas.
| Benchmark | Tipo de Juego | Qué Mide |
|---|---|---|
| LLM-Plays-Games | Aventuras de texto | Exploración, objetivos, adaptación |
| Minecraft (MINEDOJO) | Mundo abierto | Creatividad, supervivencia |
| NetHack | Roguelike | Planificación a largo plazo |
| TextWorld | Aventuras interactivas | Comprensión de lenguaje natural |
LLM-Plays-Games: Framework de Evaluación Open Source#
LLM-Plays-Games es un framework que desarrollé para evaluar LLMs como agentes autónomos en juegos de aventuras de texto. El objetivo: crear un entorno modular, reproducible y extensible para benchmarking.
¿Por qué juegos de aventuras de texto?#
Los juegos de texto son ideales para evaluar agentes LLM porque:
- Interfaz natural: El LLM ya procesa texto, no necesita visión o controles complejos
- Estado observable: Podemos ver exactamente qué información tiene el agente
- Acciones discretas: Las acciones son comandos de texto verificables
- Complejidad escalable: Desde puzzles simples hasta aventuras complejas
- Reproducibilidad: El mismo escenario da resultados comparables
Arquitectura del Framework#
El framework tiene cuatro componentes principales que trabajan juntos:
1┌─────────────────────────────────────────────────────────────────┐2│ ORCHESTRATOR │3│ (Coordina el loop de simulación y logging) │4├─────────────────────────────────────────────────────────────────┤5│ │ │6│ ┌───────────────┐ │ ┌───────────────┐ │7│ │ GAME ENGINE │◄──────┼──────►│ LLM AGENT │ │8│ │ │ │ │ │ │9│ │ - Estados │ │ │ - Prompting │ │10│ │ - Acciones │ │ │ - Parsing │ │11│ │ - Reglas │ │ │ - Decisión │ │12│ └───────────────┘ │ └───────────────┘ │13│ │ │14├─────────────────────────────────────────────────────────────────┤15│ METRICS & LOGGING │16│ (Tasa de éxito, pasos, coherencia, logs JSON) │17└─────────────────────────────────────────────────────────────────┘
Implementación Paso a Paso en Python#
Veamos cómo implementar un sistema de evaluación de agentes LLM desde cero.
Paso 1: Definir el Motor del Juego#
El motor del juego mantiene el estado y procesa las acciones del agente.
1from dataclasses import dataclass2from typing import List, Dict, Optional, Tuple3 4@dataclass5class GameState:6 """Estado actual del juego."""7 current_room: str8 inventory: List[str]9 visited_rooms: List[str]10 objective_completed: bool11 steps_taken: int12 13class TextAdventureGame:14 """Motor de juego de aventuras de texto para evaluación de agentes."""15 16 def __init__(self, world_config: Dict):17 self.rooms = world_config['rooms']18 self.items = world_config['items']19 self.goal = world_config['goal']20 self.max_steps = world_config.get('max_steps', 50)21 self.state = self._init_state()22 23 def _init_state(self) -> GameState:24 return GameState(25 current_room='start',26 inventory=[],27 visited_rooms=['start'],28 objective_completed=False,29 steps_taken=030 )31 32 def get_available_actions(self) -> List[str]:33 """Retorna acciones válidas en el estado actual."""34 room = self.rooms[self.state.current_room]35 actions = []36 37 # Movimiento38 for direction in room.get('exits', {}).keys():39 actions.append(f"ir {direction}")40 41 # Objetos en la habitación42 for item in room.get('items', []):43 if item not in self.state.inventory:44 actions.append(f"tomar {item}")45 46 # Acciones de inventario47 for item in self.state.inventory:48 actions.append(f"usar {item}")49 50 actions.append("mirar")51 actions.append("inventario")52 53 return actions54 55 def step(self, action: str) -> Tuple[str, float, bool]:56 """57 Ejecuta una acción y retorna (feedback, reward, done).58 """59 self.state.steps_taken += 160 action = action.lower().strip()61 62 # Parsear acción63 if action.startswith("ir "):64 return self._move(action[3:])65 elif action.startswith("tomar "):66 return self._take(action[6:])67 elif action.startswith("usar "):68 return self._use(action[5:])69 elif action == "mirar":70 return self._look(), 0, False71 elif action == "inventario":72 return self._inventory(), 0, False73 else:74 return "Acción no reconocida.", -0.1, False75 76 def _move(self, direction: str) -> Tuple[str, float, bool]:77 room = self.rooms[self.state.current_room]78 exits = room.get('exits', {})79 80 if direction in exits:81 new_room = exits[direction]82 self.state.current_room = new_room83 if new_room not in self.state.visited_rooms:84 self.state.visited_rooms.append(new_room)85 reward = 0.1 # Bonus por exploración86 else:87 reward = 088 return f"Te mueves hacia {direction}. {self._look()}", reward, False89 else:90 return f"No puedes ir hacia {direction}.", -0.1, False91 92 def _take(self, item: str) -> Tuple[str, float, bool]:93 room = self.rooms[self.state.current_room]94 if item in room.get('items', []):95 self.state.inventory.append(item)96 room['items'].remove(item)97 return f"Tomas {item}.", 0.2, False98 return f"No hay {item} aquí.", -0.1, False99 100 def _use(self, item: str) -> Tuple[str, float, bool]:101 if item not in self.state.inventory:102 return f"No tienes {item}.", -0.1, False103 104 # Verificar si cumple el objetivo105 if self._check_goal(item):106 self.state.objective_completed = True107 return "¡Objetivo completado!", 1.0, True108 109 return f"Usas {item}, pero no pasa nada especial.", 0, False110 111 def _check_goal(self, item: str) -> bool:112 """Verifica si la acción cumple el objetivo."""113 goal = self.goal114 if goal['type'] == 'use_item_in_room':115 return (item == goal['item'] and116 self.state.current_room == goal['room'])117 return False118 119 def _look(self) -> str:120 room = self.rooms[self.state.current_room]121 desc = room['description']122 items = room.get('items', [])123 exits = list(room.get('exits', {}).keys())124 125 text = f"{desc}"126 if items:127 text += f" Ves: {', '.join(items)}."128 if exits:129 text += f" Salidas: {', '.join(exits)}."130 return text131 132 def _inventory(self) -> str:133 if self.state.inventory:134 return f"Inventario: {', '.join(self.state.inventory)}"135 return "Tu inventario está vacío."136 137 def is_done(self) -> bool:138 return (self.state.objective_completed or139 self.state.steps_taken >= self.max_steps)
Paso 2: Implementar el Agente LLM#
El agente recibe el estado del juego y decide qué acción tomar.
1from openai import OpenAI2from anthropic import Anthropic3from typing import List, Optional4import re5 6class LLMAgent:7 """Agente que usa un LLM para tomar decisiones."""8 9 def __init__(self,10 provider: str = "openai",11 model: str = "gpt-4o",12 temperature: float = 0.3):13 self.provider = provider14 self.model = model15 self.temperature = temperature16 17 if provider == "openai":18 self.client = OpenAI()19 elif provider == "anthropic":20 self.client = Anthropic()21 22 self.action_history: List[str] = []23 self.total_tokens = 024 25 def build_prompt(self,26 state_description: str,27 available_actions: List[str],28 goal: str,29 history: List[str]) -> str:30 """Construye el prompt para el LLM."""31 32 history_text = "\n".join(history[-5:]) if history else "Ninguna"33 actions_text = ", ".join(available_actions)34 35 prompt = f"""Eres un agente jugando un juego de aventuras de texto.36 37ESTADO ACTUAL:38{state_description}39 40OBJETIVO:41{goal}42 43ACCIONES DISPONIBLES:44{actions_text}45 46HISTORIAL RECIENTE:47{history_text}48 49INSTRUCCIONES:50- Analiza el estado actual y el objetivo51- Elige UNA acción de las disponibles52- Responde SOLO con la acción exacta, sin explicaciones53 54ACCIÓN:"""55 56 return prompt57 58 def choose_action(self,59 state_description: str,60 available_actions: List[str],61 goal: str) -> str:62 """Elige una acción usando el LLM."""63 64 prompt = self.build_prompt(65 state_description,66 available_actions,67 goal,68 self.action_history69 )70 71 if self.provider == "openai":72 response = self.client.chat.completions.create(73 model=self.model,74 messages=[{"role": "user", "content": prompt}],75 temperature=self.temperature,76 max_tokens=5077 )78 action = response.choices[0].message.content.strip()79 self.total_tokens += response.usage.total_tokens80 81 elif self.provider == "anthropic":82 response = self.client.messages.create(83 model=self.model,84 max_tokens=50,85 messages=[{"role": "user", "content": prompt}]86 )87 action = response.content[0].text.strip()88 self.total_tokens += response.usage.input_tokens + response.usage.output_tokens89 90 # Parsear y validar acción91 action = self._parse_action(action, available_actions)92 self.action_history.append(action)93 94 return action95 96 def _parse_action(self,97 raw_action: str,98 available_actions: List[str]) -> str:99 """Extrae una acción válida de la respuesta del LLM."""100 101 raw_action = raw_action.lower().strip()102 103 # Coincidencia exacta104 if raw_action in [a.lower() for a in available_actions]:105 return raw_action106 107 # Buscar coincidencia parcial108 for action in available_actions:109 if action.lower() in raw_action:110 return action.lower()111 112 # Si no hay coincidencia, retornar la más similar113 # (en producción usaríamos fuzzy matching)114 return available_actions[0].lower()
Paso 3: Crear el Orquestador y Sistema de Métricas#
El orquestador coordina el juego y el agente, recolectando métricas.
1import json2from datetime import datetime3from dataclasses import dataclass, asdict4from typing import List, Dict5 6@dataclass7class EvaluationMetrics:8 """Métricas de evaluación de un episodio."""9 model: str10 success: bool11 steps_taken: int12 max_steps: int13 efficiency: float # objetivo_alcanzado / pasos14 exploration_rate: float # habitaciones_visitadas / total15 invalid_actions: int16 total_reward: float17 total_tokens: int18 cost_usd: float19 duration_seconds: float20 21class AgentEvaluator:22 """Orquestador para evaluar agentes LLM."""23 24 def __init__(self, game: TextAdventureGame, agent: LLMAgent):25 self.game = game26 self.agent = agent27 self.logs: List[Dict] = []28 29 def run_episode(self) -> EvaluationMetrics:30 """Ejecuta un episodio completo y retorna métricas."""31 32 start_time = datetime.now()33 total_reward = 034 invalid_actions = 035 36 while not self.game.is_done():37 # Obtener estado actual38 state_desc = self.game._look()39 available = self.game.get_available_actions()40 goal_desc = f"Usar {self.game.goal['item']} en {self.game.goal['room']}"41 42 # Agente elige acción43 action = self.agent.choose_action(state_desc, available, goal_desc)44 45 # Verificar si es válida46 if action not in [a.lower() for a in available]:47 invalid_actions += 148 49 # Ejecutar acción50 feedback, reward, done = self.game.step(action)51 total_reward += reward52 53 # Log54 self.logs.append({55 "step": self.game.state.steps_taken,56 "state": state_desc,57 "action": action,58 "feedback": feedback,59 "reward": reward60 })61 62 if done:63 break64 65 # Calcular métricas66 duration = (datetime.now() - start_time).total_seconds()67 total_rooms = len(self.game.rooms)68 visited = len(self.game.state.visited_rooms)69 70 # Estimar coste (precios aproximados 2026)71 cost = self._estimate_cost(self.agent.total_tokens, self.agent.model)72 73 return EvaluationMetrics(74 model=self.agent.model,75 success=self.game.state.objective_completed,76 steps_taken=self.game.state.steps_taken,77 max_steps=self.game.max_steps,78 efficiency=1.0 / self.game.state.steps_taken if self.game.state.objective_completed else 0,79 exploration_rate=visited / total_rooms,80 invalid_actions=invalid_actions,81 total_reward=total_reward,82 total_tokens=self.agent.total_tokens,83 cost_usd=cost,84 duration_seconds=duration85 )86 87 def _estimate_cost(self, tokens: int, model: str) -> float:88 """Estima el coste en USD basado en tokens y modelo."""89 # Precios aproximados por 1M tokens (input+output promediado)90 prices = {91 "gpt-4o": 7.50,92 "gpt-4o-mini": 0.30,93 "gpt-4-turbo": 20.00,94 "claude-3-opus": 30.00,95 "claude-3-sonnet": 6.00,96 "claude-3-haiku": 0.50,97 "gemini-1.5-pro": 3.50,98 }99 price_per_m = prices.get(model, 5.0)100 return (tokens / 1_000_000) * price_per_m101 102 def save_logs(self, filepath: str):103 """Guarda logs en JSON para análisis."""104 with open(filepath, 'w') as f:105 json.dump(self.logs, f, indent=2, ensure_ascii=False)
Paso 4: Ejecutar Evaluación Comparativa#
Ahora podemos comparar diferentes modelos en el mismo escenario.
1def run_benchmark(world_config: Dict,2 models: List[Dict],3 num_episodes: int = 5) -> List[EvaluationMetrics]:4 """5 Ejecuta benchmark comparativo entre modelos.6 7 Args:8 world_config: Configuración del juego9 models: Lista de {"provider": str, "model": str}10 num_episodes: Episodios por modelo11 12 Returns:13 Lista de métricas por modelo y episodio14 """15 results = []16 17 for model_config in models:18 print(f"\n📊 Evaluando {model_config['model']}...")19 20 model_results = []21 for episode in range(num_episodes):22 # Crear instancias frescas23 game = TextAdventureGame(world_config.copy())24 agent = LLMAgent(**model_config)25 evaluator = AgentEvaluator(game, agent)26 27 # Ejecutar episodio28 metrics = evaluator.run_episode()29 model_results.append(metrics)30 31 status = "✅" if metrics.success else "❌"32 print(f" Episodio {episode + 1}: {status} "33 f"({metrics.steps_taken} pasos, ${metrics.cost_usd:.4f})")34 35 results.extend(model_results)36 37 return results38 39# Ejemplo de uso40if __name__ == "__main__":41 # Configuración del mundo42 world = {43 "rooms": {44 "start": {45 "description": "Estás en una habitación oscura.",46 "exits": {"norte": "pasillo"},47 "items": ["antorcha"]48 },49 "pasillo": {50 "description": "Un largo pasillo con puertas.",51 "exits": {"sur": "start", "este": "sala_tesoro"},52 "items": ["llave"]53 },54 "sala_tesoro": {55 "description": "Una sala con un cofre cerrado.",56 "exits": {"oeste": "pasillo"},57 "items": ["cofre"]58 }59 },60 "items": ["antorcha", "llave", "cofre"],61 "goal": {62 "type": "use_item_in_room",63 "item": "llave",64 "room": "sala_tesoro"65 },66 "max_steps": 2067 }68 69 # Modelos a comparar70 models = [71 {"provider": "openai", "model": "gpt-4o"},72 {"provider": "openai", "model": "gpt-4o-mini"},73 {"provider": "anthropic", "model": "claude-3-sonnet-20240229"},74 ]75 76 # Ejecutar benchmark77 results = run_benchmark(world, models, num_episodes=3)78 79 # Mostrar resumen80 print("\n" + "="*60)81 print("RESUMEN DE RESULTADOS")82 print("="*60)83 84 for model in set(r.model for r in results):85 model_results = [r for r in results if r.model == model]86 success_rate = sum(1 for r in model_results if r.success) / len(model_results)87 avg_steps = sum(r.steps_taken for r in model_results) / len(model_results)88 avg_cost = sum(r.cost_usd for r in model_results) / len(model_results)89 90 print(f"\n{model}:")91 print(f" Tasa de éxito: {success_rate:.1%}")92 print(f" Pasos promedio: {avg_steps:.1f}")93 print(f" Coste promedio: ${avg_cost:.4f}")
Métricas Clave para Evaluación de Agentes LLM#
Al evaluar agentes LLM, estas son las métricas más importantes a considerar.
Métricas de Rendimiento#
| Métrica | Descripción | Cómo Calcular |
|---|---|---|
| Tasa de Éxito | % de episodios donde se alcanza el objetivo | éxitos / total_episodios |
| Eficiencia de Pasos | Pasos necesarios vs óptimo | pasos_óptimos / pasos_usados |
| Tasa de Exploración | Cobertura del espacio de estados | estados_visitados / estados_totales |
| Coherencia de Acciones | % de acciones válidas/sensatas | acciones_válidas / total_acciones |
Métricas de Robustez#
| Métrica | Descripción | Importancia |
|---|---|---|
| Recuperación de Errores | Capacidad de corregir acciones fallidas | Alta |
| Consistencia | Varianza en resultados entre episodios | Media |
| Degradación Graceful | Comportamiento ante estados inesperados | Alta |
Métricas de Coste#
| Métrica | Descripción | Fórmula |
|---|---|---|
| Coste por Éxito | Dinero gastado por objetivo logrado | coste_total / éxitos |
| Tokens por Acción | Eficiencia en uso de contexto | tokens_totales / acciones |
| Latencia por Decisión | Tiempo de respuesta del agente | tiempo_total / decisiones |
Comparativa: GPT-4 vs Claude 3 vs Gemini como Agentes#
Basándome en evaluaciones con LLM-Plays-Games y datos de benchmarks públicos, esta es una comparativa de los principales modelos como agentes autónomos.
| Modelo | Tasa Éxito | Eficiencia | Coste/1K acciones | Mejor Para |
|---|---|---|---|---|
| GPT-4o | 89% | Alta | $0.15 | Tareas complejas, razonamiento |
| GPT-4o-mini | 72% | Media | $0.006 | Alto volumen, tareas simples |
| Claude 3 Opus | 91% | Muy Alta | $0.60 | Planificación larga, seguridad |
| Claude 3 Sonnet | 85% | Alta | $0.12 | Balance coste/rendimiento |
| Claude 3 Haiku | 68% | Media | $0.01 | Tareas rápidas, bajo coste |
| Gemini 1.5 Pro | 83% | Alta | $0.07 | Contexto largo, multimodal |
Observaciones Clave#
- Claude 3 Opus lidera en tareas que requieren planificación a largo plazo, pero su coste es 4x mayor que GPT-4o
- GPT-4o-mini ofrece el mejor ratio rendimiento/coste para tareas simples
- Gemini 1.5 Pro destaca cuando el agente necesita contexto extenso (>100K tokens)
- Todos los modelos mejoran significativamente con chain-of-thought prompting
Otros Frameworks de Evaluación Populares#
Además de LLM-Plays-Games, existen otros frameworks importantes para evaluar agentes LLM.
AgentBench#
Framework de Berkeley/Tsinghua que evalúa agentes en 8 entornos diferentes incluyendo sistemas operativos, bases de datos, y juegos.
Fortalezas:
- Evaluación multi-entorno comprehensiva
- Métricas estandarizadas
- Leaderboard público
Limitaciones:
- Requiere recursos computacionales significativos
- Setup complejo
WebArena#
Benchmark de CMU para evaluar agentes web autónomos en tareas realistas como compras online, gestión de contenido, y navegación.
Casos de uso ideales:
- Evaluación de agentes de navegación web
- Automatización de tareas de usuario
- Testing de web agents comerciales
SWE-bench#
Benchmark de Princeton para evaluar agentes que resuelven issues reales de GitHub en repositorios open source.
Métricas principales:
- % de issues resueltos correctamente
- Calidad del código generado
- Tests que pasan
Mejores Prácticas para Evaluar Agentes LLM#
Basándome en experiencia evaluando múltiples sistemas, estas son las mejores prácticas para obtener resultados significativos.
1. Usa Múltiples Seeds y Episodios#
Un solo episodio no es representativo. Ejecuta al menos 10-20 episodios por configuración y reporta media y desviación estándar.
2. Controla la Temperatura#
Para evaluación reproducible, usa temperatura baja (0.0-0.3). Para evaluar creatividad, usa temperatura más alta (0.7-1.0) pero con más episodios.
3. Versiona Todo#
Guarda:
- Versión exacta del modelo (incluyendo fecha de snapshot)
- Prompts completos usados
- Configuración del entorno
- Seeds de aleatoriedad
4. Evalúa Coste Real#
No solo midas rendimiento. Incluye:
- Tokens consumidos
- Latencia
- Coste monetario
- Huella de carbono (si es relevante)
5. Compara con Baselines#
Siempre incluye:
- Random agent (baseline mínimo)
- Heurística simple (baseline razonable)
- Humano (si es posible)
Preguntas Frecuentes sobre Evaluación de Agentes LLM#
¿Qué modelo es mejor para agentes autónomos?#
Depende del caso de uso. Para tareas complejas que requieren planificación, Claude 3 Opus o GPT-4o son los mejores. Para alto volumen y bajo coste, GPT-4o-mini o Claude 3 Haiku son más apropiados. La clave es evaluar en tu dominio específico.
¿Cuántos episodios necesito para una evaluación fiable?#
Mínimo 10 episodios por configuración, idealmente 20-30. Con menos, la varianza entre runs puede dar resultados engañosos. Reporta siempre intervalos de confianza o desviación estándar.
¿Por qué mi agente funciona bien en tests pero mal en producción?#
Generalmente por distribución de datos diferente (OOD - out of distribution). Los benchmarks suelen ser más "limpios" que casos reales. Solución: incluir casos edge y estados inesperados en la evaluación.
¿Cómo evalúo agentes que usan herramientas (function calling)?#
Añade métricas específicas: precisión de tool selection, formato correcto de parámetros, y manejo de errores de tools. Frameworks como ToolBench están diseñados para esto.
¿Es mejor fine-tuning o prompting para agentes?#
Para la mayoría de casos, prompting bien diseñado (con few-shot examples y chain-of-thought) es suficiente y más flexible. Fine-tuning solo vale la pena cuando tienes datos específicos abundantes y el dominio es muy especializado.
¿Cómo comparo mi agente con el estado del arte?#
Usa benchmarks públicos como AgentBench, WebArena, o SWE-bench que tienen leaderboards. Asegúrate de seguir exactamente su metodología de evaluación para comparaciones justas.
¿Qué hago si el LLM genera acciones inválidas?#
Implementa validación robusta: 1) Especifica formato exacto en el prompt, 2) Usa parsing con fallbacks, 3) Permite reintentos con feedback del error, 4) Registra tasa de errores como métrica.
¿Cómo evalúo agentes multi-step vs single-step?#
Para multi-step, métricas adicionales importantes son: profundidad de planificación, consistencia entre pasos, y capacidad de backtracking. El diseño del benchmark debe requerir múltiples acciones coordinadas.
Recursos Adicionales#
Papers Fundamentales#
- "AgentBench: Evaluating LLMs as Agents" - Liu et al., 2023
- "WebArena: A Realistic Web Environment for Building Autonomous Agents" - Zhou et al., 2024
- "SWE-bench: Can Language Models Resolve Real-World GitHub Issues?" - Jimenez et al., 2024
Repositorios#
- LLM-Plays-Games: repositorio privado
- AgentBench: github.com/THUDM/AgentBench
- WebArena: github.com/web-arena-x/webarena
Herramientas Relacionadas#
Si te interesa la automatización con LLMs, también puedes revisar mi guía de n8n para automatización donde explico cómo integrar agentes LLM en workflows de automatización empresarial.
Conclusión#
La evaluación de agentes LLM es fundamental para desplegar sistemas autónomos confiables. Sin métricas objetivas, estamos volando a ciegas.
Puntos clave para recordar:
- Usa benchmarks apropiados para tu tipo de tarea (razonamiento, web, código, juegos)
- Mide múltiples dimensiones: éxito, eficiencia, coste, robustez
- Ejecuta suficientes episodios para resultados estadísticamente significativos
- Compara con baselines para contextualizar resultados
- Versiona y documenta todo para reproducibilidad
El framework LLM-Plays-Games está disponible en GitHub para que experimentes con tus propios escenarios y modelos. Si tienes ideas para mejorarlo o quieres contribuir, ¡las PRs son bienvenidas!
El repositorio LLM-Plays-Games es actualmente privado. Contacta conmigo para más información.
¿Preguntas sobre evaluación de agentes LLM? Déjalas en los comentarios o contáctame en GitHub.

