0Pricing
AI Engineering Academy · Lección

Gestión de fallos y bucles de los agentes

Añada límites de tiempo, un número máximo de iteraciones y mensajes de recuperación de errores para evitar que los agentes entren en bucles infinitos o llamen repetidamente a herramientas defectuosas.

Gestión de fallos y bucles de los agentes es una lección gratuita de AI Engineering Academy en CoddyKit. Esta es la lección 4 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 Engineering Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Engineering Academy incluye 4 lecciones en total.

Por qué los agentes fallan y entran en ciclos

Los agentes pueden quedar atrapados en ciclos de error por varios motivos: una herramienta averiada devuelve un error del que el agente no sabe salir, el modelo genera repetidamente una sintaxis de acción incorrecta, una tarea es imposible con las herramientas disponibles o el agente sigue llamando a la misma herramienta con ligeras variaciones esperando obtener un resultado diferente. Sin mecanismos de protección, esto consume el presupuesto de la API y nunca resuelve el problema.

Límites máximos de iteraciones

La protección más sencilla consiste en establecer un límite estricto para el número de ciclos Thought/Action/Observation. El AgentExecutor de LangChain acepta un parámetro max_iterations. Cuando se alcanza el límite, el ejecutor detiene el ciclo y devuelve un mensaje que indica que el agente no pudo completar la tarea.

from langchain.agents import AgentExecutor

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=10,             # Hard stop after 10 steps
    max_execution_time=30.0,       # Also stop after 30 wall-clock seconds
    early_stopping_method='generate',  # Ask the model for a partial answer at the limit
    verbose=True
)

Detención temprana: forzar una respuesta final

Cuando el agente alcanza su límite de iteraciones, early_stopping_method='generate' solicita al modelo una última respuesta con: 'Ha alcanzado el límite de pasos. Según lo que sabe hasta ahora, dé su mejor respuesta final'. Esto es mejor que devolver una respuesta vacía o provocar un fallo, ya que proporciona al usuario algo útil.

# The 'generate' early_stopping_method adds this system instruction
# when max_iterations is reached:
#
# 'You have {N} steps remaining but the task is not complete.
#  Give your best final answer based on the information gathered so far.'
#
# Contrast with 'force' which abruptly terminates without generating an answer.

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=7,
    early_stopping_method='generate'
)

Gestión correcta de errores de análisis

Cuando el modelo produce una salida que no coincide con el formato Thought/Action —si falta la palabra clave de acción, usa un nombre de herramienta incorrecto o genera texto libre— el agente lanza una OutputParserException. Establezca handle_parsing_errors=True para devolver el error como una observación, de modo que el modelo pueda corregirse por sí mismo.

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    handle_parsing_errors=True,
    # Custom error message fed back to the model:
    # handle_parsing_errors='Please format your response as Thought/Action/Action Input.'
)

# When a parse error occurs, the executor automatically adds:
# Observation: Could not parse LLM output. Please follow the format:
#   Thought: ...
#   Action: tool_name
#   Action Input: ...

Detección y ruptura de ciclos repetitivos

Un patrón de ciclo habitual es que el agente llame a search('same query') tres veces seguidas y obtenga cada vez el mismo resultado inútil. Implemente la detección de ciclos realizando un seguimiento de los pares recientes (herramienta, entrada). Si la misma combinación se repite más de dos veces, inyecte una observación que sugiera un enfoque diferente.

from collections import Counter

class LoopDetector:
    def __init__(self, max_repeats: int = 2):
        self.max_repeats = max_repeats
        self.call_counts = Counter()

    def check(self, tool_name: str, tool_input: str) -> bool:
        key = f'{tool_name}:{tool_input}'
        self.call_counts[key] += 1
        if self.call_counts[key] > self.max_repeats:
            return True  # Loop detected
        return False

    def get_warning(self) -> str:
        return ('You have called this tool with the same input multiple times. '
                'Try a different approach, different search terms, or a different tool.')

Gestión de errores a nivel de herramienta

Los agentes robustos necesitan herramientas robustas. Cada herramienta debe capturar sus propias excepciones y devolver mensajes de error estructurados en lugar de lanzar excepciones de Python. Incluya el tipo de error y una sugerencia para el agente, de modo que sepa si debe reintentarlo, cambiar de enfoque o escalar el problema.

from langchain_core.tools import tool
import requests

@tool
def get_company_data(company_name: str) -> str:
    '''Retrieve company information from the business database.
    Input: company name as a string.
    '''
    try:
        resp = requests.get(
            f'https://api.example.com/companies/{company_name}',
            timeout=5
        )
        if resp.status_code == 404:
            return f'No company found with name "{company_name}". Try the exact legal name or ticker symbol.'
        if resp.status_code == 429:
            return 'Rate limit exceeded. Wait 60 seconds before trying again.'
        resp.raise_for_status()
        return resp.json().get('summary', 'No summary available.')
    except requests.Timeout:
        return 'The database is not responding. Try searching the web instead.'

Retroceso exponencial ante fallos de la API

Cuando las herramientas llaman a API externas, los fallos transitorios son habituales. Añada una lógica de reintento con retroceso exponencial dentro de la función de la herramienta: reintente hasta 3 veces, aumentando el tiempo de espera entre intentos. Esto gestiona de forma transparente los límites de velocidad y las interrupciones breves sin que el agente tenga que conocer los reintentos.

import time
import requests
from langchain_core.tools import tool

@tool
def reliable_search(query: str) -> str:
    '''Search with automatic retry on failure. Input: search query string.'''
    max_retries = 3
    for attempt in range(max_retries):
        try:
            resp = requests.get(
                'https://api.duckduckgo.com/',
                params={'q': query, 'format': 'json'},
                timeout=10
            )
            resp.raise_for_status()
            data = resp.json()
            return data.get('AbstractText', 'No results found.')
        except requests.RequestException as e:
            if attempt < max_retries - 1:
                wait = 2 ** attempt  # 1s, 2s, 4s
                time.sleep(wait)
            else:
                return f'Search failed after {max_retries} attempts: {str(e)}'

Presupuestos de tiempo de espera a nivel de agente

Los reintentos individuales de las herramientas son útiles, pero también necesita un tiempo de espera total de reloj para toda la ejecución del agente. Si la tarea tarda más de lo permitido por su SLA (por ejemplo, 30 segundos), detenga el ciclo y devuelva una respuesta de degradación controlada. El parámetro max_execution_time de LangChain gestiona esto en el nivel del ejecutor.

import asyncio

async def run_with_timeout(user_input: str, timeout_seconds: float = 30.0) -> str:
    try:
        result = await asyncio.wait_for(
            agent_executor.ainvoke({'input': user_input}),
            timeout=timeout_seconds
        )
        return result['output']
    except asyncio.TimeoutError:
        return ('I am taking longer than expected to answer this question. '
                'Please try again with a simpler question, or check back later.')

Registro de fallos para su análisis

Cada fallo del agente contiene información útil. Registre el seguimiento completo —la entrada del usuario, todos los pasos intermedios, el motivo del fallo y el número de iteraciones utilizadas— en una base de datos o plataforma de observabilidad. Analizar los patrones de fallo revela qué herramientas no son fiables, qué tipos de preguntas no puede gestionar el agente y qué ciclos se producen con mayor frecuencia.

import logging
import json

logger = logging.getLogger('agent')

def run_and_log(user_input: str) -> str:
    try:
        result = agent_executor.invoke(
            {'input': user_input},
            return_intermediate_steps=True
        )
        if not result.get('output'):
            logger.warning('Agent returned empty output', extra={
                'input': user_input,
                'steps': len(result.get('intermediate_steps', []))
            })
        return result['output']
    except Exception as e:
        logger.error('Agent failed with exception', extra={
            'input': user_input,
            'error': str(e),
            'error_type': type(e).__name__
        })
        return 'I encountered an error. Please try rephrasing your question.'

Inyección de sugerencias de recuperación en el prompt

Cuando detecte un patrón de fallo, puede inyectar dinámicamente instrucciones de recuperación en el siguiente prompt del agente. Por ejemplo, si la herramienta de búsqueda ha estado fallando, añada una sugerencia como: 'La herramienta de búsqueda web no es fiable en este momento. Dé prioridad a la herramienta de la base de conocimientos para esta consulta'. Esto orienta al agente hacia una solución funcional sin lógica de respaldo codificada de forma rígida.

Pruebas de escenarios de fallo

Construya un conjunto de pruebas específico para los escenarios de fallo. Pruebe qué sucede cuando: todas las herramientas devuelven errores, el modelo alcanza max_iterations, la entrada no contiene ninguna pregunta que se pueda responder y el modelo llama a una herramienta inexistente. El agente siempre debe devolver un mensaje razonable y nunca bloquear la aplicación, por muy adversa que sea la situación.

Comprobación rápida

Compruebe su comprensión de la gestión de fallos de los agentes y la prevención de ciclos.

Recapitulación de la lección

En esta lección aprendió que: max_iterations y max_execution_time establecen límites estrictos para el tiempo de ejecución del agente, handle_parsing_errors devuelve los errores de formato al modelo para que se corrija por sí mismo y las herramientas deben capturar las excepciones y devolver cadenas de error descriptivas en lugar de lanzarlas. A continuación exploraremos la función nativa de OpenAI para llamar a funciones e integrar herramientas estructuradas.

Preguntas frecuentes

¿La lección «Gestión de fallos y bucles de los agentes» es gratis?

Sí — el texto completo de «Gestión de fallos y bucles de los 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 Engineering Academy, actualiza a CoddyKit PRO. El curso de AI Engineering Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Gestión de fallos y bucles de los agentes»?

Añada límites de tiempo, un número máximo de iteraciones y mensajes de recuperación de errores para evitar que los agentes entren en bucles infinitos o llamen repetidamente a herramientas defectuosas. Practicas AI Engineering Academy 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 Engineering Academy?

No se requiere experiencia previa. AI Engineering Academy 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 4 de 4.

¿Cuánto tiempo toma la lección «Gestión de fallos y bucles de los 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 Engineering Academy?

Sí. Cada lección de AI Engineering Academy 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

  1. El framework ReAct: pensar, actuar y observar
  2. Definición de herramientas para su agente
  3. Creación de un agente ReAct con LangChain
  4. Gestión de fallos y bucles de los agentes
← Volver a AI Engineering Academy