AI Engineering Academy · Aula

Como lidar com falhas e loops de agentes

Adicione limites de tempo, um número máximo de iterações e instruções de recuperação de erros para impedir que os agentes entrem em loop indefinidamente ou chamem repetidamente ferramentas com falhas.

Aula 4 de 413 etapas

Como lidar com falhas e loops de agentes é uma aula grátis de AI Engineering Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Engineering Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Engineering Academy inclui 4 aulas no total.

Por que os agentes falham e entram em ciclos

Os agentes podem ficar presos em ciclos de falha por vários motivos: uma ferramenta com defeito retorna um erro do qual o agente não sabe como sair, o modelo gera repetidamente uma sintaxe de ação inválida, uma tarefa é impossível com as ferramentas disponíveis ou o agente continua chamando a mesma ferramenta com pequenas variações, esperando um resultado diferente. Sem proteções, isso consome o orçamento da API e nunca resolve o problema.

Limites máximos de iterações

A proteção mais simples é estabelecer um limite rígido para o número de ciclos de Pensamento/Ação/Observação. O AgentExecutor do LangChain aceita um parâmetro max_iterations. Quando o limite é atingido, o executor interrompe o ciclo e retorna uma mensagem informando que o agente não conseguiu concluir a tarefa.

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
)

Parada antecipada: forçando uma resposta final

Quando o agente atinge o limite de iterações, early_stopping_method='generate' solicita ao modelo uma última resposta com: 'Você atingiu o limite de etapas. Com base no que sabe até agora, forneça sua melhor resposta final.' Isso é melhor do que retornar uma resposta vazia ou falhar, pois oferece algo útil ao usuário.

# 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'
)

Tratando erros de análise de maneira adequada

Quando o modelo produz uma saída que não corresponde ao formato Pensamento/Ação — não inclui a palavra-chave da ação, usa o nome errado da ferramenta ou produz texto livre — o agente gera uma OutputParserException. Defina handle_parsing_errors=True para devolver o erro como uma observação, permitindo que o modelo corrija o próprio comportamento.

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: ...

Detectando e interrompendo ciclos repetitivos

Um padrão comum de ciclo é o agente chamar search('same query') três vezes seguidas, obtendo sempre o mesmo resultado inútil. Implemente a detecção de ciclos acompanhando os pares recentes (ferramenta, entrada). Se a mesma combinação se repetir mais de duas vezes, insira uma observação sugerindo uma abordagem 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.')

Tratamento de erros no nível da ferramenta

Agentes robustos exigem ferramentas robustas. Cada ferramenta deve capturar suas próprias exceções e retornar mensagens de erro estruturadas, em vez de gerar exceções do Python. Inclua o tipo de erro e uma sugestão para o agente, para que ele saiba se deve tentar novamente, mudar de abordagem ou encaminhar o 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.'

Espera progressiva exponencial em falhas de API

Quando as ferramentas chamam APIs externas, falhas temporárias são comuns. Adicione uma lógica de novas tentativas com espera progressiva exponencial dentro da função da ferramenta — tente novamente até três vezes, aumentando o intervalo entre as tentativas. Isso trata limites de requisições e breves interrupções de forma transparente, sem que o agente precise saber das novas tentativas.

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)}'

Limites de tempo no nível do agente

Novas tentativas individuais das ferramentas são úteis, mas você também precisa de um limite de tempo total de execução para toda a execução do agente. Se a tarefa demorar mais do que o seu SLA permite (por exemplo, 30 segundos), interrompa o ciclo e retorne uma resposta de degradação adequada. O parâmetro max_execution_time do LangChain cuida disso no nível do executor.

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.')

Registrando falhas para análise

Toda falha do agente é um dado. Registre o rastreamento completo — a entrada do usuário, todas as etapas intermediárias, o motivo da falha e o número de iterações usadas — em um banco de dados ou plataforma de observabilidade. A análise dos padrões de falha revela quais ferramentas não são confiáveis, quais tipos de pergunta o agente não consegue tratar e quais ciclos ocorrem com mais frequência.

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.'

Inserindo dicas de recuperação na instrução

Quando você detectar um padrão de falha, poderá inserir dinamicamente instruções de recuperação na próxima instrução do agente. Por exemplo, se a ferramenta de pesquisa estiver falhando, adicione uma dica como: 'A ferramenta de pesquisa na web não está confiável no momento. Prefira a ferramenta da base de conhecimento para esta consulta.' Isso direciona o agente para uma solução funcional sem lógica de alternativa codificada diretamente.

Testando cenários de falha

Crie um conjunto explícito de testes para cenários de falha. Teste o que acontece quando: todas as ferramentas retornam erros, o modelo atinge max_iterations, a entrada não contém nenhuma pergunta que possa ser respondida e o modelo chama uma ferramenta inexistente. Seu agente deve sempre retornar uma mensagem sensata e nunca interromper o funcionamento da aplicação, por mais adversa que seja a situação.

Verificação rápida

Teste sua compreensão sobre o tratamento de falhas do agente e a prevenção de ciclos.

Recapitulação da lição

Nesta lição, você aprendeu que: max_iterations e max_execution_time estabelecem limites rígidos para o tempo de execução do agente, handle_parsing_errors devolve erros de formato ao modelo para que ele faça a autocorreção e as ferramentas devem capturar exceções e retornar textos de erro descritivos, em vez de gerá-las. Em seguida, exploraremos o recurso nativo de chamada de funções da OpenAI para a integração estruturada de ferramentas.

Grátis para começar

Aprenda Python com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
30
Aulas
120

Perguntas Frequentes

A aula “Como lidar com falhas e loops de agentes” é grátis?

Sim — o texto completo de “Como lidar com falhas e loops de agentes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Engineering Academy, atualize para CoddyKit PRO. O curso de AI Engineering Academy inclui 4 aulas no total.

O que vou aprender em “Como lidar com falhas e loops de agentes”?

Adicione limites de tempo, um número máximo de iterações e instruções de recuperação de erros para impedir que os agentes entrem em loop indefinidamente ou chamem repetidamente ferramentas com falhas. Você pratica AI Engineering Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar AI Engineering Academy?

Nenhuma experiência prévia é necessária. AI Engineering Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Como lidar com falhas e loops de agentes”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de AI Engineering Academy?

Sim. Cada aula de AI Engineering Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. A estrutura ReAct: pensar, agir, observar
  2. Definindo ferramentas para seu Agent
  3. Criando um Agent ReAct com LangChain
  4. Como lidar com falhas e loops de agentes
← Voltar para AI Engineering Academy