AI-agenten · Les

Veelvoorkomende fouten in agentlussen

Oneindige lussen, dezelfde tool-call herhalen en nooit tot een definitief antwoord komen.

Les 1 van 413 stappen

Veelvoorkomende fouten in agentlussen is een gratis AI-agenten-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject AI-agenten. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus AI-agenten bevat in totaal 4 lessen.

De agentlus en de bijbehorende foutscenario's

Een agentlus wordt herhaald uitgevoerd: redeneren → tool aanroepen → resultaat observeren → opnieuw redeneren. Deze lus is krachtig, maar kwetsbaar. Verschillende bekende foutscenario's kunnen een agent vastzetten, tokens verspillen en geen bruikbare uitvoer opleveren.

Deze fouten begrijpen is de eerste stap om je ertegen te beschermen.

Fout 1: oneindige lussen

Een oneindige lus ontstaat wanneer de agent dezelfde tool herhaaldelijk met dezelfde argumenten aanroept zonder vooruitgang te boeken. Dit kan gebeuren wanneer de tool een onbruikbaar resultaat teruggeeft en de agent er niet redenerend uit kan komen.

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

Fout 2: vastgelopen toestand

Een vastgelopen toestand is een subtielere variant van een oneindige lus. De agent blijft redeneren en verschillende tools aanroepen, maar kan niet tot een definitief antwoord komen. Hij wisselt tussen benaderingen zonder vooruitgang te boeken.

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

Fout 3: ontbrekend definitief antwoord

Sommige agents blijven in een lus draaien zonder ooit te bepalen dat de taak voltooid is. Ze verzamelen informatie, maar stoppen nooit om die samen te voegen en terug te geven. Dit verspilt tokens en tijd.

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

Fout 4: fouten bij het ontleden van toolaanroepen

Wanneer de LLM ongeldige JSON genereert voor een functieaanroep, kan de tooluitvoerder deze niet ontleden. Een slecht geschreven agent crasht of slaat de stap stilzwijgend over. Een robuuste agent vangt ontledingsfouten op en geeft de fout terug aan de 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)

Fout 5: de tool geeft geen bruikbare gegevens terug

Een tool kan technisch gezien slagen (zonder uitzondering), maar lege of onbruikbare gegevens teruggeven. De agent moet met dit geval omgaan en er niet van uitgaan dat elke toolaanroep bruikbare informatie oplevert.

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

Fout 6: verzonnen toolnamen

LLM's genereren soms toolnamen die niet bestaan. Controleer de toolnaam altijd aan de hand van je geregistreerde tools voordat je de tool probeert aan te roepen. Geef de agent een duidelijke foutmelding wanneer dit gebeurt.

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)

Fout 7: tokenbudget uitgeput

Een langlopende agent die volledige toolresultaten in zijn context opslaat, kan de limiet van het contextvenster van de LLM bereiken. Vat grote toolresultaten samen of kort ze in voordat je ze aan de geschiedenis toevoegt.

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)

Het foutscenario programmatisch detecteren

Schrijf een diagnosefunctie die de stapgeschiedenis van de agent analyseert om vast te stellen welk foutscenario zich heeft voorgedaan. Dit is onmisbaar tijdens het opsporen van fouten.

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

Een eenvoudig stappenbudget implementeren

Elke agentlus in productie moet een harde limiet op het aantal stappen hebben. Dit is het belangrijkste veiligheidsmechanisme — het garandeert dat de lus eindigt, ongeacht wat de LLM beslist.

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}

Naslagoverzicht: foutscenario's en oplossingen

Een samenvatting van de zes foutscenario's van agentlussen en hun oplossingen:

  • Oneindige lus: detecteer herhaalde paren van (tool, argumenten); breek de lus af met foutfeedback
  • Vastgelopen toestand: gebruik een bewaking met max_iterations; forceer een definitief antwoord vlak voor de limiet
  • Ontbrekend definitief antwoord: controleer expliciet op het signaal final_answer in de actie
  • Ontledingsfouten: plaats het ontleden van JSON in try/except; geef de fout terug aan de LLM
  • Lege toolresultaten: detecteer lege tekenreeksen; geef feedback dat er geen gegevens zijn
  • Verzonnen toolnamen: controleer ze aan de hand van de geregistreerde tools; geef een foutmelding terug

Kennistoets: fouten in agentlussen

Test je begrip van veelvoorkomende foutscenario's in agentlussen.

Samenvatting: veelvoorkomende fouten in agentlussen

Je kunt nu de belangrijkste foutscenario's in agentlussen herkennen en voorkomen:

  • Oneindige lussen, vastgelopen toestanden en ontbrekende definitieve antwoorden vereisen allemaal een bewaking voor maximumaantal iteraties
  • Fouten bij toolaanroepen vereisen try/except rond het ontleden van JSON
  • Lege toolresultaten moeten worden gedetecteerd en voorzien van duidelijke feedback aan de LLM
  • Verzonnen toolnamen moeten worden gecontroleerd aan de hand van de lijst met geregistreerde tools
  • Een uitgeput tokenbudget vereist het inkorten van resultaten

Een robuuste agentlus houdt rekening met al deze foutscenario's en handelt ze netjes af.

Gratis beginnen

Leer AI-agenten met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
60
Lessen
239

Veelgestelde vragen

Is de les “Veelvoorkomende fouten in agentlussen” gratis?

Ja — de volledige tekst van “Veelvoorkomende fouten in agentlussen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus AI-agenten wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus AI-agenten bevat in totaal 4 lessen.

Wat leer ik in “Veelvoorkomende fouten in agentlussen”?

Oneindige lussen, dezelfde tool-call herhalen en nooit tot een definitief antwoord komen. Je oefent met AI-agenten door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met AI-agenten te beginnen?

Ervaring vooraf is niet nodig. AI-agenten op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.

Hoe lang duurt de les “Veelvoorkomende fouten in agentlussen”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over AI-agenten?

Ja. Elke les over AI-agenten bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Veelvoorkomende fouten in agentlussen
  2. Trace-logging voor agentstappen
  3. Oneindige lussen detecteren en doorbreken
  4. Technieken voor stapsgewijs debuggen
← Terug naar AI-agenten