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.