0Pricing
AI Engineering Academy · Lezione

Gestire i fallimenti e i loop degli agenti

Aggiunga limiti di timeout, un numero massimo di iterazioni e prompt per il recupero dagli errori, così da impedire agli agenti di entrare in loop indefiniti o di chiamare ripetutamente strumenti non funzionanti.

Gestire i fallimenti e i loop degli agenti è una lezione AI Engineering Academy gratuita su CoddyKit. Questa è la lezione 4 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 Engineering Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Engineering Academy include 4 lezioni in totale.

Perché gli agenti falliscono e entrano in loop

Gli agenti possono rimanere bloccati in cicli di errore per diversi motivi: uno strumento non funzionante restituisce un errore dal quale l'agente non sa come uscire, il modello genera ripetutamente una sintassi di azione non valida, un'attività è impossibile con gli strumenti disponibili oppure l'agente continua a richiamare lo stesso strumento con lievi variazioni, nella speranza di ottenere un risultato diverso. Senza protezioni, questo consuma il budget API senza mai risolvere il problema.

Limiti massimi delle iterazioni

La protezione più semplice consiste nell'impostare un limite rigido al numero di cicli Thought/Action/Observation. AgentExecutor di LangChain accetta un parametro max_iterations. Quando il limite viene raggiunto, l'executor interrompe il ciclo e restituisce un messaggio che indica che l'agente non ha potuto completare l'attività.

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
)

Arresto anticipato: forzare una risposta finale

Quando l'agente raggiunge il limite di iterazioni, early_stopping_method='generate' richiede un'ultima volta al modello: 'Ha raggiunto il limite di passaggi. In base a ciò che sa finora, fornisca la Sua migliore risposta finale.' È preferibile restituire una risposta vuota o provocare un arresto anomalo, perché offre comunque all'utente qualcosa di utile.

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

Gestire correttamente gli errori di analisi

Quando il modello produce un output che non corrisponde al formato Thought/Action, ad esempio omette la parola chiave dell'azione, utilizza il nome errato dello strumento o restituisce testo libero, l'agente genera un'eccezione OutputParserException. Imposti handle_parsing_errors=True per restituire l'errore come osservazione, consentendo al modello di correggersi autonomamente.

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

Rilevare e interrompere i cicli ripetitivi

Un pattern comune consiste nel fatto che l'agente richiama search('same query') tre volte consecutive, ottenendo ogni volta lo stesso risultato inutile. Implementi il rilevamento dei cicli tenendo traccia delle coppie recenti (strumento, input). Se la stessa combinazione si ripete più di due volte, inserisca un'osservazione che suggerisca un approccio diverso.

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

Gestione degli errori a livello di strumento

Gli agenti affidabili richiedono strumenti affidabili. Ogni strumento dovrebbe gestire le proprie eccezioni e restituire messaggi di errore strutturati invece di generare eccezioni Python. Includa il tipo di errore e un suggerimento per l'agente, così saprà se riprovare, cambiare approccio o inoltrare il 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.'

Backoff esponenziale in caso di errori API

Quando gli strumenti chiamano API esterne, gli errori temporanei sono comuni. Aggiunga una logica di retry con backoff esponenziale all'interno della funzione dello strumento: effettui fino a 3 tentativi, aumentando l'attesa tra un tentativo e l'altro. In questo modo gestisce automaticamente i limiti di frequenza e le brevi interruzioni, senza che l'agente debba conoscere i retry.

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

Timeout a livello di agente

I retry dei singoli strumenti sono utili, ma è necessario anche un timeout totale in tempo reale per l'intera esecuzione dell'agente. Se l'attività richiede più tempo di quello consentito dal proprio SLA, ad esempio 30 secondi, interrompa il ciclo e restituisca una risposta di fallback appropriata. Il parametro max_execution_time di LangChain gestisce questo limite a livello di 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.')

Registrare i fallimenti per l'analisi

Ogni fallimento dell'agente è un dato. Registri la traccia completa, inclusi l'input dell'utente, tutti i passaggi intermedi, il motivo del fallimento e il numero di iterazioni utilizzate, in un database o in una piattaforma di osservabilità. L'analisi dei pattern di errore rivela quali strumenti sono inaffidabili, quali tipi di domande l'agente non riesce a gestire e quali cicli si verificano più spesso.

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

Inserire suggerimenti di recupero nel prompt

Quando rileva un pattern di errore, può inserire dinamicamente istruzioni di recupero nel prompt successivo dell'agente. Ad esempio, se lo strumento di ricerca non funziona, aggiunga un suggerimento come: 'Lo strumento di ricerca sul Web è attualmente inaffidabile. Per questa richiesta, preferisca lo strumento della base di conoscenza.' In questo modo orienta l'agente verso una soluzione funzionante senza una logica di fallback codificata.

Testare gli scenari di errore

Crei una suite di test dedicata agli scenari di errore. Verifichi cosa accade quando: tutti gli strumenti restituiscono errori, il modello raggiunge max_iterations, l'input non contiene alcuna domanda a cui sia possibile rispondere e il modello richiama uno strumento inesistente. L'agente dovrebbe sempre restituire un messaggio sensato e non mandare mai in crash l'applicazione, indipendentemente da quanto sia avverso lo scenario.

Verifica rapida

Verifichi la Sua comprensione della gestione dei fallimenti degli agenti e della prevenzione dei cicli.

Riepilogo della lezione

In questa lezione ha imparato che: max_iterations e max_execution_time impostano limiti rigidi alla durata dell'agente, handle_parsing_errors restituisce gli errori di formato al modello affinché possa correggersi autonomamente e gli strumenti dovrebbero intercettare le eccezioni e restituire stringhe di errore descrittive invece di generarle. Ora esploreremo la funzionalità nativa di function calling di OpenAI per l'integrazione strutturata degli strumenti.

Domande Frequenti

La lezione «Gestire i fallimenti e i loop degli agenti» è gratuita?

Sì — il testo completo di «Gestire i fallimenti e i loop 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 Engineering Academy, passa a CoddyKit PRO. Il corso AI Engineering Academy include 4 lezioni in totale.

Cosa imparerò in «Gestire i fallimenti e i loop degli agenti»?

Aggiunga limiti di timeout, un numero massimo di iterazioni e prompt per il recupero dagli errori, così da impedire agli agenti di entrare in loop indefiniti o di chiamare ripetutamente strumenti non… Eserciti AI Engineering Academy 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 Engineering Academy?

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

Quanto tempo richiede la lezione «Gestire i fallimenti e i loop 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 Engineering Academy?

Sì. Ogni lezione AI Engineering Academy 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. Il framework ReAct: pensare, agire, osservare
  2. Definire gli strumenti per il proprio agente
  3. Creare un agente ReAct con LangChain
  4. Gestire i fallimenti e i loop degli agenti
← Torna a AI Engineering Academy