0Pricing
AI Agents · Aula

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

  1. Falhas comuns em ciclos de agentes
  2. Registro de rastreamento das etapas do agente
  3. Detectando e interrompendo ciclos infinitos
  4. Técnicas de depuração passo a passo
← Voltar para AI Agents