0Pricing
AI Agents · Lezione

Errori comuni nei cicli degli agenti

Cicli infiniti, ripetizione della stessa chiamata a uno strumento e mancato raggiungimento della risposta finale

Errori comuni nei cicli degli agenti è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.

Il ciclo dell'agente e le relative modalità di errore

Un ciclo dell'agente viene eseguito ripetutamente: ragionare → chiamare uno strumento → osservare il risultato → ragionare di nuovo. Questo ciclo è potente, ma fragile. Diverse modalità di errore note possono intrappolare un agente, consumare token e non produrre alcun output utile.

Comprendere questi errori è il primo passo per prevenirli.

Errore 1: cicli infiniti

Un ciclo infinito si verifica quando l'agente chiama ripetutamente lo stesso strumento con gli stessi argomenti senza fare progressi. Può accadere quando lo strumento restituisce un risultato non utile e l'agente non riesce a trovare una soluzione attraverso il ragionamento.

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

Errore 2: stato bloccato

Uno stato bloccato è una versione più sottile di un ciclo infinito. L'agente continua a ragionare e a chiamare strumenti diversi, ma non riesce ad arrivare a una risposta finale. Oscilla tra approcci diversi senza fare progressi.

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

Errore 3: risposta finale mancante

Alcuni agenti continuano il ciclo senza mai stabilire che l'attività è completa. Raccolgono informazioni, ma non si fermano mai per sintetizzarle e restituirle. Questo spreca token 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.'

Errore 4: errori nell'analisi delle chiamate agli strumenti

Quando l'LLM genera JSON non valido per una chiamata di funzione, l'esecutore dello strumento non riesce ad analizzarlo. Un agente scritto male va in crash o salta il passaggio senza segnalarlo. Un agente robusto intercetta gli errori di analisi e restituisce l'errore all'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)

Errore 5: lo strumento non restituisce dati utili

Uno strumento può avere esito positivo dal punto di vista tecnico (senza eccezioni), ma restituire dati vuoti o inutili. L'agente deve gestire questo caso e non presumere che ogni chiamata allo strumento restituisca informazioni utilizzabili.

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

Errore 6: nomi di strumenti allucinati

A volte gli LLM generano nomi di strumenti inesistenti. Verifichi sempre il nome dello strumento rispetto a quelli registrati prima di tentare di chiamarlo. Quando accade, restituisca all'agente un errore informativo.

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)

Errore 7: esaurimento del budget di token

Un agente di lunga durata che conserva nel proprio contesto i risultati completi degli strumenti può raggiungere il limite della finestra di contesto dell'LLM. Riassuma o tronchi i risultati voluminosi degli strumenti prima di aggiungerli alla cronologia.

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)

Rilevare programmaticamente la modalità di errore

Scriva una funzione diagnostica che analizzi la cronologia dei passaggi dell'agente per identificare la modalità di errore che si è verificata. È estremamente utile durante il debugging.

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

Implementare un semplice budget di passaggi

Ogni ciclo di un agente in produzione deve avere un limite rigido per il numero di passaggi. Questo è il meccanismo di sicurezza più importante: garantisce la terminazione del ciclo indipendentemente dalle decisioni dell'LLM.

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}

Riferimento rapido: modalità di errore e correzioni

Riepilogo delle sei modalità di errore del ciclo dell'agente e delle relative correzioni:

  • Ciclo infinito: rilevi le coppie (strumento, argomenti) ripetute; interrompa il ciclo restituendo un errore
  • Stato bloccato: utilizzi una protezione max_iterations; forzi la risposta finale quando il limite è vicino
  • Risposta finale mancante: controlli esplicitamente la presenza del segnale final_answer nell'azione
  • Errori di analisi: racchiuda l'analisi JSON in try/except; restituisca l'errore all'LLM
  • Risultati vuoti degli strumenti: rilevi le stringhe vuote; fornisca un feedback «nessun dato»
  • Nomi di strumenti allucinati: verifichi i nomi rispetto agli strumenti registrati; restituisca un messaggio di errore

Verifica delle conoscenze: errori del ciclo dell'agente

Verifichi la Sua comprensione delle modalità di errore comuni nei cicli degli agenti.

Riepilogo: errori comuni del ciclo dell'agente

Ora è in grado di identificare e prevenire le principali modalità di errore del ciclo dell'agente:

  • I cicli infiniti, gli stati bloccati e le risposte finali mancanti richiedono tutti una protezione per il numero massimo di iterazioni
  • Gli errori nell'analisi delle chiamate agli strumenti richiedono un blocco try/except intorno all'analisi JSON
  • I risultati vuoti degli strumenti richiedono il rilevamento e un feedback informativo all'LLM
  • I nomi di strumenti allucinati richiedono una verifica rispetto all'elenco degli strumenti registrati
  • L'esaurimento del budget di token richiede il troncamento dei risultati

Un ciclo dell'agente robusto prevede tutte queste modalità di errore e le gestisce in modo appropriato.

Domande Frequenti

La lezione «Errori comuni nei cicli degli agenti» è gratuita?

Sì — il testo completo di «Errori comuni nei cicli degli agenti» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.

Cosa imparerò in «Errori comuni nei cicli degli agenti»?

Cicli infiniti, ripetizione della stessa chiamata a uno strumento e mancato raggiungimento della risposta finale Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Agents?

Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Errori comuni nei cicli degli agenti»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Agents?

Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Errori comuni nei cicli degli agenti
  2. Trace logging per i passaggi degli agenti
  3. Rilevamento e interruzione dei cicli infiniti
  4. Tecniche di debugging passo passo
← Torna a AI Agents