Fallos habituales en los bucles de agentes
Bucles infinitos, repetición de la misma llamada a una herramienta y falta de llegada a una respuesta final.
Fallos habituales en los bucles de agentes es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.
El bucle del agente y sus modos de fallo
Un bucle de agente se ejecuta repetidamente: razonar → llamar a una herramienta → observar el resultado → volver a razonar. Este bucle es potente, pero frágil. Varios modos de fallo conocidos pueden atrapar al agente, consumir tokens y no producir ninguna salida útil.
Comprender estos fallos es el primer paso para prevenirlos.
Fallo 1: Bucles infinitos
Un bucle infinito ocurre cuando el agente llama repetidamente a la misma herramienta con los mismos argumentos sin avanzar. Esto puede suceder cuando la herramienta devuelve un resultado poco útil y el agente no logra encontrar una salida mediante el razonamiento.
# Example of an agent in an infinite loop:
# Step 1: reasoning='Need to search for Python docs'
# tool='search_web', args={'query': 'Python documentation'}
# Step 2: reasoning='Search result was unhelpful, try again'
# tool='search_web', args={'query': 'Python documentation'}
# Step 3: reasoning='Search result was unhelpful, try again'
# tool='search_web', args={'query': 'Python documentation'}
# ... repeats until max_iterations or token budget is exhausted
print('Symptom: same tool + same arguments appearing repeatedly in steps')
print('Fix: detect repeated (tool, args) pairs and break the loop')Fallo 2: Estado atascado
Un estado atascado es una versión más sutil de un bucle infinito. El agente sigue razonando y llamando a distintas herramientas, pero no logra converger en una respuesta final. Alterna entre diferentes enfoques sin avanzar.
# Example of a stuck agent:
# Step 1: tool='search_web', args={'query': 'topic A'}
# Step 2: tool='search_web', args={'query': 'topic B'} # different args
# Step 3: tool='search_web', args={'query': 'topic A'} # back to first
# Step 4: tool='read_document', args={'url': '...'}
# Step 5: tool='search_web', args={'query': 'topic A'}
# ... no FINAL_ANSWER ever produced
print('Symptom: agent takes many steps but never calls FINAL_ANSWER')
print('Fix: max_iterations guard + force final answer if limit is near')Fallo 3: Falta de respuesta final
Algunos agentes entran en un bucle sin decidir nunca que la tarea ha terminado. Recopilan información, pero nunca se detienen para sintetizarla y devolverla. Esto desperdicia tokens y tiempo.
# An agent that never concludes:
def run_agent_bad(query: str, max_steps: int = 20) -> str:
for step in range(max_steps):
action = llm_decide_action(query, history)
if action['type'] == 'tool':
result = execute_tool(action)
history.append(result)
# BUG: No check for 'final_answer' type!
# The agent loops until max_steps, returning None
return None # never actually returns an answer
# Fix: explicitly check for final_answer signal
def run_agent_good(query: str, max_steps: int = 20) -> str:
for step in range(max_steps):
action = llm_decide_action(query, history)
if action['type'] == 'final_answer':
return action['answer'] # exit cleanly
execute_tool(action)
return 'Reached step limit without a conclusion.'Fallo 4: Errores de análisis de llamadas a herramientas
Cuando el LLM genera JSON con formato incorrecto para una llamada a una función, el ejecutor de herramientas no puede analizarlo. Un agente mal implementado se bloquea o se salta el paso silenciosamente. Un agente robusto captura los errores de análisis y devuelve el error al LLM.
import json
def safe_parse_tool_call(arguments_str: str) -> dict:
try:
return json.loads(arguments_str)
except json.JSONDecodeError as e:
print(f'Failed to parse tool arguments: {e}')
print(f'Raw: {arguments_str}')
return None
def execute_step(tool_call) -> str:
args = safe_parse_tool_call(tool_call.function.arguments)
if args is None:
# Feed the error back to the LLM in the next step
return f'ERROR: Could not parse tool arguments. Raw: {tool_call.function.arguments}'
return run_tool(tool_call.function.name, args)Fallo 5: La herramienta no devuelve datos útiles
Una herramienta puede ejecutarse correctamente desde el punto de vista técnico (sin producir una excepción), pero devolver datos vacíos o inútiles. El agente debe gestionar este caso y no dar por hecho que cada llamada a una herramienta devuelve información útil.
def run_agent_with_empty_result_handling(query: str) -> str:
for step in range(20):
action = decide_next_action(query, history)
if action['type'] == 'final_answer':
return action['answer']
result = execute_tool(action['tool'], action['args'])
# Detect empty results and provide context
if not result or result.strip() == '':
observation = f'Tool {action["tool"]} returned no data. Try a different approach or different arguments.'
elif 'error' in result.lower():
observation = f'Tool error: {result}. Consider a different tool or query.'
else:
observation = result
history.append({'tool': action['tool'], 'result': observation})
return 'Could not complete task within step limit.'Fallo 6: Nombres de herramientas inventados
A veces, los LLM generan nombres de herramientas que no existen. Valide siempre el nombre de la herramienta con respecto a las herramientas registradas antes de intentar llamarla. Cuando esto ocurra, devuelva un error informativo al agente.
REGISTERED_TOOLS = {
'search_web': search_web_function,
'get_weather': get_weather_function,
'calculate': calculate_function
}
def dispatch_tool(tool_name: str, args: dict) -> str:
if tool_name not in REGISTERED_TOOLS:
available = ', '.join(REGISTERED_TOOLS.keys())
return (
f'ERROR: Unknown tool "{tool_name}". '
f'Available tools: {available}. '
f'Please use one of the available tools.'
)
tool_fn = REGISTERED_TOOLS[tool_name]
return tool_fn(**args)Fallo 7: Agotamiento del presupuesto de tokens
Un agente de larga duración que almacena resultados completos de las herramientas en su contexto puede alcanzar el límite de la ventana de contexto del LLM. Resuma o trunque los resultados grandes de las herramientas antes de añadirlos al historial.
def truncate_tool_result(result: str, max_chars: int = 2000) -> str:
if len(result) <= max_chars:
return result
truncated = result[:max_chars]
return f'{truncated}\n... [result truncated to {max_chars} chars]'
def add_observation_to_history(history: list, tool_name: str, result: str):
safe_result = truncate_tool_result(result, max_chars=2000)
history.append({
'role': 'tool',
'content': safe_result,
'tool_name': tool_name
})
print(f'[Step] Tool={tool_name}, Result length={len(result)} (stored {len(safe_result)})')
if __name__ == '__main__':
demo_history = []
add_observation_to_history(demo_history, 'search_web', 'x' * 3000)
Detección programática del modo de fallo
Escriba una función de diagnóstico que analice el historial de pasos del agente para identificar qué modo de fallo se produjo. Esto resulta fundamental durante la depuración.
def diagnose_agent_failure(steps: list) -> str:
if not steps:
return 'No steps recorded'
# Check for infinite loop: same (tool, args) repeated
seen = {}
for s in steps:
key = (s.get('tool'), str(s.get('args')))
seen[key] = seen.get(key, 0) + 1
repeated = {k: v for k, v in seen.items() if v > 2}
if repeated:
return f'INFINITE_LOOP: repeated actions: {repeated}'
# Check for missing final answer
has_answer = any(s.get('type') == 'final_answer' for s in steps)
if not has_answer and len(steps) >= 15:
return 'STUCK_STATE: many steps taken but no final answer'
# Check for parse errors
errors = [s for s in steps if 'ERROR' in str(s.get('result', ''))]
if len(errors) > 2:
return f'TOOL_ERROR: {len(errors)} tool errors in pipeline'
return 'OK'
if __name__ == '__main__':
demo_steps = [{'tool': 'search_web', 'args': {'q': 'weather'}} for _ in range(3)]
print('Diagnosis:', diagnose_agent_failure(demo_steps))
Implementación de un presupuesto de pasos sencillo
Todo bucle de agente en producción debe tener un límite estricto de pasos. Este es el mecanismo de seguridad más importante: garantiza que el bucle termine independientemente de lo que decida el LLM.
def run_agent_with_budget(query: str, max_steps: int = 15) -> dict:
history = []
for step in range(1, max_steps + 1):
print(f'[Step {step}/{max_steps}]')
action = decide_next_action(query, history)
if action['type'] == 'final_answer':
return {
'status': 'success',
'answer': action['answer'],
'steps_taken': step
}
result = execute_tool(action['tool'], action['args'])
history.append({'step': step, 'tool': action['tool'], 'result': result})
if step == max_steps - 1:
# Warn the agent it must conclude
history.append({'role': 'system',
'content': 'You must provide a FINAL_ANSWER on the next step.'})
return {'status': 'timeout', 'answer': None, 'steps_taken': max_steps}Referencia rápida: Modos de fallo y soluciones
Resumen de los seis modos de fallo de los bucles de agentes y sus soluciones:
- Bucle infinito: detecte pares repetidos de (herramienta, argumentos) y detenga el bucle con información sobre el error
- Estado atascado: use una protección de
max_iterationsy fuerce una respuesta final al acercarse al límite - Falta de respuesta final: compruebe explícitamente si la acción contiene la señal
final_answer - Errores de análisis: encapsule el análisis de JSON en un bloque try/except y devuelva el error al LLM
- Resultados vacíos de la herramienta: detecte las cadenas vacías y proporcione información indicando que no hay datos
- Nombres de herramientas inventados: valídelos con respecto a las herramientas registradas y devuelva un mensaje de error
Comprobación de conocimientos: Fallos del bucle del agente
Compruebe sus conocimientos sobre los modos de fallo habituales de los bucles de agentes.
Resumen: Fallos habituales de los bucles de agentes
Ahora puede identificar y prevenir los principales modos de fallo de los bucles de agentes:
- Los bucles infinitos, los estados atascados y la falta de respuestas finales requieren una protección de máximo de iteraciones
- Los errores de análisis de llamadas a herramientas necesitan un bloque try/except alrededor del análisis de JSON
- Los resultados vacíos de las herramientas requieren detección e información útil para el LLM
- Los nombres de herramientas inventados deben validarse con respecto a la lista de herramientas registradas
- El agotamiento del presupuesto de tokens requiere truncar los resultados
Un bucle de agente robusto anticipa todos estos modos de fallo y los gestiona correctamente.
Preguntas frecuentes
¿La lección «Fallos habituales en los bucles de agentes» es gratis?
Sí — el texto completo de «Fallos habituales en los bucles de agentes» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.
¿Qué aprenderé en «Fallos habituales en los bucles de agentes»?
Bucles infinitos, repetición de la misma llamada a una herramienta y falta de llegada a una respuesta final. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Agents?
No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Fallos habituales en los bucles de agentes»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Agents?
Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Fallos habituales en los bucles de agentes
- Registro de trazas para los pasos del agente
- Detección y ruptura de bucles infinitos
- Técnicas de depuración paso a paso