Veelvoorkomende fouten in agentlussen
Oneindige lussen, dezelfde tool-call herhalen en nooit tot een definitief antwoord komen.
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_answerin 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.
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
- Veelvoorkomende fouten in agentlussen
- Trace-logging voor agentstappen
- Oneindige lussen detecteren en doorbreken
- Technieken voor stapsgewijs debuggen