Classificando modos de falha de agentes
Crie uma taxonomia de falhas de agentes: erros de ferramentas, saídas malformadas, ciclos de raciocínio, esgotamento de contexto e indisponibilidade de serviços externos, e defina estratégias de recuperação para cada caso.
Classificando modos de falha de agentes é uma aula grátis de AI Engineering Academy no CoddyKit. Esta é a aula 1 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 de Maneiras Distintas
Os agentes falham de maneira diferente de chamadas simples de LLM. Uma chamada de turno único retorna uma resposta ou gera um erro. Um agente que executa uma tarefa com várias etapas pode falhar a qualquer momento — e a falha pode não ser evidente no resultado final. Compreender a taxonomia dos modos de falha de agentes é o primeiro passo para criar agentes que detectem, diagnostiquem e se recuperem das próprias falhas.
Modo de Falha 1: Tool Errors
Tool errors ocorrem quando o agente chama uma ferramenta com argumentos inválidos, a ferramenta gera uma exceção ou retorna um resultado vazio ou malformado. Exemplos incluem: chamar uma API de pesquisa com uma consulta malformada, consultar um banco de dados com SQL inválido ou invocar um executor de código que excede o tempo limite. Tool errors são os mais fáceis de detectar porque produzem sinais explícitos de exceção que podem ser capturados e tratados.
class ToolError(Exception):
def __init__(self, tool_name: str, args: dict, error: Exception):
self.tool_name = tool_name
self.args = args
self.original_error = error
super().__init__(f'Tool {tool_name} failed: {error}')
def safe_tool_call(tool_func, args: dict) -> str:
try:
result = tool_func(**args)
if not result:
return 'Tool returned empty result. Try a different approach.'
return str(result)
except Exception as e:
raise ToolError(tool_func.__name__, args, e)Modo de Falha 2: Saídas Malformadas
Saídas malformadas ocorrem quando o agente gera um texto que não corresponde ao formato esperado — por exemplo, retorna linguagem natural quando a próxima etapa espera JSON ou chama uma ferramenta com argumentos em uma estrutura incorreta. Isso costuma acontecer quando o agente confunde a etapa atual com uma anterior. Valide o formato de cada saída do agente antes de usá-la e faça uma nova solicitação quando o formato estiver incorreto.
import json
def validate_agent_output(raw_output: str, expected_format: str) -> dict:
if expected_format == 'json':
try:
return json.loads(raw_output)
except json.JSONDecodeError as e:
return {
'valid': False,
'error': f'Expected JSON but got invalid JSON: {e}',
'raw': raw_output[:200]
}
return {'valid': True, 'data': raw_output}Modo de Falha 3: Loops de Raciocínio
Loops de raciocínio ocorrem quando um agente repete indefinidamente a mesma ação ou pensamento sem progredir. O agente pode chamar a mesma consulta de pesquisa 10 vezes seguidas, obtendo sempre o mesmo resultado vazio e sem saber o que tentar em seguida. Detecte loops rastreando as ações recentes e verificando repetições. Quando um loop for detectado, insira uma meta-instrução que diga ao agente para tentar uma abordagem diferente.
from collections import Counter
class LoopDetector:
def __init__(self, window: int = 5, threshold: int = 3):
self.recent_actions = []
self.window = window
self.threshold = threshold
def record(self, action: str) -> bool:
self.recent_actions.append(action)
if len(self.recent_actions) > self.window:
self.recent_actions.pop(0)
counts = Counter(self.recent_actions)
most_common_count = counts.most_common(1)[0][1] if counts else 0
return most_common_count >= self.threshold # True = loop detectedModo de Falha 4: Esgotamento do Contexto
O esgotamento do contexto ocorre quando o histórico acumulado do agente (chamadas de ferramentas, observações e pensamentos) excede a janela de contexto do modelo. O modelo pode truncar o histórico silenciosamente (perdendo informações críticas) ou gerar um erro de limite de tokens. Evite isso rastreando o uso de tokens ao longo das etapas e compactando o histórico (resumindo as etapas antigas) antes que ele atinja o limite.
import tiktoken
CONTEXT_LIMIT = 100_000 # tokens
COMPRESS_AT = 80_000 # trigger compression with headroom
enc = tiktoken.encoding_for_model('gpt-4o')
def total_tokens(messages: list) -> int:
return sum(len(enc.encode(str(m))) for m in messages)
def check_context(messages: list) -> str:
tokens = total_tokens(messages)
if tokens > COMPRESS_AT:
return 'compress'
if tokens > CONTEXT_LIMIT:
return 'critical'
return 'ok'Modo de Falha 5: Indisponibilidade de Serviços Externos
Falhas de serviços externos ocorrem quando o serviço subjacente de uma ferramenta está indisponível, limitado por excesso de solicitações ou retorna erros inesperados. Um agente que não consegue acessar o banco de dados que precisa consultar fica bloqueado. Diferentemente dos loops de raciocínio (falha do agente), as falhas externas são falhas do ambiente. Trate-as com novas tentativas e espera exponencial, além de disponibilizar ferramentas alternativas que possam aproximar o resultado usando diferentes fontes de dados.
import asyncio
async def resilient_tool_call(tool_func, args: dict, max_retries: int = 3) -> str:
for attempt in range(max_retries):
try:
return await tool_func(**args)
except (ConnectionError, TimeoutError) as e:
if attempt == max_retries - 1:
return f'Service unavailable after {max_retries} attempts. Error: {e}'
wait = 2 ** attempt # 1s, 2s, 4s
await asyncio.sleep(wait)
return 'Unexpected error in resilient_tool_call'Modo de Falha 6: Incompreensão do Objetivo
Incompreensão do objetivo ocorre quando o agente interpreta a tarefa incorretamente e persegue um objetivo sutilmente diferente. Essa é a falha mais difícil de detectar, pois o agente pode concluir a tarefa com sucesso — apenas não a tarefa pretendida pelo usuário. Reduza esse risco pedindo ao agente que reformule o objetivo com suas próprias palavras no início e implementando uma etapa final de verificação que confirme se o resultado realmente responde à pergunta original.
async def confirm_goal_understanding(original_task: str) -> str:
resp = await client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'system', 'content': 'Restate the task in your own words. Be specific about what the final deliverable should be.'},
{'role': 'user', 'content': f'Task: {original_task}'}
]
)
return resp.choices[0].message.content
# Use the restatement as the first step of the agent
# to catch misunderstandings before any tools are calledCriando um Sistema de Classificação de Falhas
Crie um classificador estruturado de falhas que rotule cada exceção do agente com seu tipo. Isso permite o encaminhamento automático para a estratégia de recuperação adequada. Armazene os registros de falhas com rótulos de tipo para analisar quais modos de falha são mais comuns e priorizar quais devem ser tratados primeiro. Tool errors e loops normalmente são os mais frequentes e os mais fáceis de corrigir.
from enum import Enum
from dataclasses import dataclass
class FailureType(Enum):
TOOL_ERROR = 'tool_error'
MALFORMED_OUTPUT = 'malformed_output'
REASONING_LOOP = 'reasoning_loop'
CONTEXT_EXHAUSTION = 'context_exhaustion'
EXTERNAL_SERVICE = 'external_service'
GOAL_MISUNDERSTANDING = 'goal_misunderstanding'
MAX_ITERATIONS = 'max_iterations'
UNKNOWN = 'unknown'
@dataclass
class AgentFailure:
failure_type: FailureType
step: int
tool_name: str | None
error_message: str
recoverable: boolMapeando Falhas para Ações de Recuperação
Cada tipo de falha tem uma ação de recuperação apropriada. Tool errors justificam uma nova tentativa com argumentos ajustados. Loops justificam uma instrução de diversidade que diga ao agente para tentar algo novo. O esgotamento do contexto requer compactação. Falhas de serviços externos requerem ferramentas alternativas. A incompreensão do objetivo requer uma solicitação de esclarecimento. Mapeie tudo isso explicitamente em um roteador de recuperação que o ambiente de execução do agente invoque quando ocorrerem falhas.
RECOVERY_ACTIONS = {
FailureType.TOOL_ERROR: 'retry_with_corrected_args',
FailureType.MALFORMED_OUTPUT: 'reformat_output',
FailureType.REASONING_LOOP: 'inject_diversity_prompt',
FailureType.CONTEXT_EXHAUSTION: 'compress_history',
FailureType.EXTERNAL_SERVICE: 'use_fallback_tool',
FailureType.GOAL_MISUNDERSTANDING:'request_clarification',
FailureType.MAX_ITERATIONS: 'escalate_to_human',
FailureType.UNKNOWN: 'escalate_to_human'
}Definindo Limites Máximos de Iteração
Todo agente deve ter um limite máximo de iterações como barreira rígida de segurança. Sem ele, um agente preso em um loop executa indefinidamente, consumindo tokens e dinheiro. Defina o limite com base na complexidade esperada da tarefa: um agente simples de perguntas e respostas pode ser limitado a 5 etapas, enquanto um agente de pesquisa complexo pode permitir 20. Quando o limite for atingido, registre a falha, salve os resultados parciais e encaminhe o caso a uma pessoa ou retorne uma resposta parcial.
MAX_ITERATIONS = 15
async def run_agent(task: str) -> str:
messages = [{'role': 'user', 'content': task}]
loop_detector = LoopDetector()
for iteration in range(MAX_ITERATIONS):
response = await get_agent_action(messages)
if response.is_final:
return response.answer
action_key = f'{response.tool}:{response.args}'
if loop_detector.record(action_key):
messages.append({'role': 'system', 'content': 'You are repeating yourself. Try a completely different approach.'})
continue
result = await execute_tool(response.tool, response.args)
messages.append({'role': 'tool', 'content': result})
return 'Task exceeded maximum iterations. Partial results: ' + get_partial_result(messages)Registrando Falhas para Análise Pós-Incidente
Registre cada falha do agente com contexto suficiente para diagnosticá-la posteriormente: a descrição completa da tarefa, todo o histórico de ações até o ponto da falha, o tipo de falha e a mensagem de erro, a contagem de iterações e o uso de tokens. Armazene essas informações em uma tabela de falhas com um índice em failure_type e task_id. Revise regularmente os registros de falhas para identificar quais tipos de tarefa são mais propensos a modos de falha específicos e priorize as correções de acordo com isso.
import json
from dataclasses import asdict
async def log_agent_failure(task_id: str, failure: AgentFailure, history: list, pool):
async with pool.acquire() as conn:
await conn.execute('''
INSERT INTO agent_failures
(task_id, failure_type, step, tool_name, error_message,
recoverable, action_history, failed_at)
VALUES ($1, $2, $3, $4, $5, $6, $7, NOW())
''',
task_id,
failure.failure_type.value,
failure.step,
failure.tool_name,
failure.error_message,
failure.recoverable,
json.dumps(history)
)Verificação Rápida
Teste sua compreensão sobre a classificação dos modos de falha de agentes.
Recapitulação da Lição
Nesta lição, você aprendeu que: os seis principais modos de falha de agentes incluem tool errors, saídas malformadas, loops de raciocínio, esgotamento do contexto, falhas de serviços externos e incompreensão do objetivo; a detecção de loops por meio do histórico de ações identifica padrões repetitivos antes que eles esgotem o orçamento de iterações; e o mapeamento de tipos de falha para ações de recuperação possibilita a autocorreção automatizada. Em seguida, implementaremos a autocorreção e a criação de instruções reflexivas.
Perguntas Frequentes
A aula “Classificando modos de falha de agentes” é grátis?
Sim — o texto completo de “Classificando modos de falha 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 “Classificando modos de falha de agentes”?
Crie uma taxonomia de falhas de agentes: erros de ferramentas, saídas malformadas, ciclos de raciocínio, esgotamento de contexto e indisponibilidade de serviços externos, e defina estratégias de recu… 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 1 de 4.
Quanto tempo leva a aula “Classificando modos de falha 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
- Classificando modos de falha de agentes
- Autocorreção e criação de prompts reflexivos
- Criação de pontos de verificação e retomada de tarefas
- Escalonamento com participação humana