Falhas comuns em ciclos de agentes
Ciclos infinitos, repetição da mesma chamada de ferramenta e impossibilidade de chegar a uma resposta final.
Falhas comuns em ciclos de agentes é uma aula grátis de AI Agents 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 Agents, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Agents inclui 4 aulas no total.
O Ciclo do Agente e Seus Modos de Falha
Um ciclo do agente é executado repetidamente: raciocinar → chamar uma ferramenta → observar o resultado → raciocinar novamente. Esse ciclo é poderoso, mas frágil. Vários modos de falha conhecidos podem prender um agente, desperdiçar tokens e não produzir nenhuma saída útil.
Compreender essas falhas é o primeiro passo para se proteger contra elas.
Falha 1: Ciclos Infinitos
Um ciclo infinito ocorre quando o agente chama repetidamente a mesma ferramenta com os mesmos argumentos, sem progredir. Isso pode acontecer quando a ferramenta retorna um resultado inútil e o agente não consegue encontrar uma saída por meio do raciocínio.
# 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')Falha 2: Estado Travado
Um estado travado é uma versão mais sutil de um ciclo infinito. O agente continua raciocinando e chamando ferramentas diferentes, mas não consegue convergir para uma resposta final. Ele oscila entre abordagens sem progredir.
# 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')Falha 3: Ausência de Resposta Final
Alguns agentes entram em um ciclo sem jamais decidir que a tarefa foi concluída. Eles coletam informações, mas nunca param para sintetizá-las e retorná-las. Isso desperdiça tokens e tempo.
# 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.'Falha 4: Erros de Análise de Chamadas de Ferramentas
Quando o LLM gera JSON malformado para uma chamada de função, o executor de ferramentas não consegue analisá-lo. Um agente mal escrito trava ou ignora a etapa silenciosamente. Um agente robusto captura os erros de análise e devolve o erro ao 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)Falha 5: A Ferramenta Não Retorna Dados Úteis
Uma ferramenta pode ser executada com sucesso do ponto de vista técnico (sem lançar uma exceção), mas retornar dados vazios ou inúteis. O agente deve lidar com esse caso, sem presumir que toda chamada de ferramenta retorna informações úteis para a ação.
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.'Falha 6: Nomes de Ferramentas Inventados
Às vezes, os LLMs geram nomes de ferramentas que não existem. Sempre valide o nome da ferramenta em relação às suas ferramentas registradas antes de tentar chamá-la. Quando isso acontecer, retorne um erro informativo ao 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)Falha 7: Esgotamento do Orçamento de Tokens
Um agente de execução prolongada que armazena resultados completos de ferramentas no contexto pode atingir o limite da janela de contexto do LLM. Resuma ou trunque resultados grandes de ferramentas antes de adicioná-los ao histórico.
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)
Detectando o Modo de Falha por Meio de Código
Escreva uma função de diagnóstico que analise o histórico de etapas do agente para identificar qual modo de falha ocorreu. Isso é inestimável durante a depuração.
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))
Implementando um Orçamento Simples de Etapas
Todo ciclo de agente em produção deve ter um limite rígido de etapas. Esse é o mecanismo de segurança mais importante — ele garante que o ciclo termine independentemente do que o LLM decidir.
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}Referência Rápida: Modos de Falha e Correções
Um resumo dos seis modos de falha dos ciclos de agentes e suas correções:
- Ciclo infinito: detecte pares repetidos (ferramenta, argumentos); interrompa com feedback de erro
- Estado travado: use uma proteção de máximo de iterações; force uma resposta final próximo do limite
- Ausência de resposta final: verifique explicitamente a presença de um sinal de resposta final na ação
- Erros de análise: envolva a análise de JSON em try/except; devolva o erro ao LLM
- Resultados vazios de ferramentas: detecte strings vazias; forneça o feedback “nenhum dado”
- Nomes de ferramentas inventados: valide em relação às ferramentas registradas; retorne uma mensagem de erro
Verificação de Conhecimento: Falhas nos Ciclos de Agentes
Teste sua compreensão dos modos comuns de falha nos ciclos de agentes.
Recapitulação: Falhas Comuns nos Ciclos de Agentes
Agora você consegue identificar e se proteger contra os principais modos de falha nos ciclos de agentes:
- Ciclos infinitos, estados travados e ausência de respostas finais exigem uma proteção de máximo de iterações
- Erros de análise de chamadas de ferramentas exigem try/except ao redor da análise de JSON
- Resultados vazios de ferramentas exigem detecção e feedback informativo ao LLM
- Nomes de ferramentas inventados exigem validação em relação à lista de ferramentas registradas
- O esgotamento do orçamento de tokens exige o truncamento dos resultados
Um ciclo de agente robusto antecipa todos esses modos de falha e lida com eles de maneira adequada.
Perguntas Frequentes
A aula “Falhas comuns em ciclos de agentes” é grátis?
Sim — o texto completo de “Falhas comuns em ciclos 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 Agents, atualize para CoddyKit PRO. O curso de AI Agents inclui 4 aulas no total.
O que vou aprender em “Falhas comuns em ciclos de agentes”?
Ciclos infinitos, repetição da mesma chamada de ferramenta e impossibilidade de chegar a uma resposta final. Você pratica AI Agents 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 Agents?
Nenhuma experiência prévia é necessária. AI Agents 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 “Falhas comuns em ciclos 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 Agents?
Sim. Cada aula de AI Agents 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
- Falhas comuns em ciclos de agentes
- Registro de rastreamento das etapas do agente
- Detectando e interrompendo ciclos infinitos
- Técnicas de depuração passo a passo