Vanliga fel i agentloopar
Oändliga loopar, upprepade verktygsanrop och att aldrig nå ett slutligt svar.
Vanliga fel i agentloopar är en gratis lektion i AI-agenter på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för AI-agenter, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-agenter innehåller totalt 4 lektioner.
Agentloopen och dess feltillstånd
En agentloop körs upprepade gånger: resonera → anropa verktyg → observera resultatet → resonera igen. Den här loopen är kraftfull men skör. Flera välkända feltillstånd kan få en agent att fastna, slösa tokens och inte producera något användbart resultat.
Att förstå de här felen är det första steget mot att skydda sig mot dem.
Fel 1: Oändliga loopar
En oändlig loop uppstår när agenten upprepade gånger anropar samma verktyg med samma argument utan att göra framsteg. Det kan hända när verktyget returnerar ett föga hjälpsamt resultat och agenten inte kan resonera sig ur situationen.
# 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')Fel 2: Fastnat tillstånd
Ett fastnat tillstånd är en mer svårupptäckt variant av en oändlig loop. Agenten fortsätter att resonera och anropa olika verktyg men kan inte komma fram till ett slutligt svar. Den växlar mellan olika angreppssätt utan att göra framsteg.
# 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')Fel 3: Uteblivet slutligt svar
Vissa agenter fortsätter i en loop utan att någonsin avgöra att uppgiften är klar. De samlar in information men slutar aldrig för att sammanställa och returnera den. Det slösar både tokens och tid.
# 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.'Fel 4: Tolkningsfel i verktygsanrop
När LLM:en genererar felaktig JSON för ett funktionsanrop misslyckas verktygsköraren med att tolka den. En dåligt skriven agent kraschar eller hoppar tyst över steget. En robust agent fångar tolkningsfel och skickar tillbaka felet till LLM:en.
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)Fel 5: Verktyget returnerar inga användbara data
Ett verktyg kan tekniskt sett lyckas (utan undantag) men ändå returnera tomma eller oanvändbara data. Agenten måste hantera det här fallet och inte anta att varje verktygsanrop returnerar information som går att använda.
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.'Fel 6: Hallucinerade verktygsnamn
LLM:er genererar ibland verktygsnamn som inte finns. Validera alltid verktygsnamnet mot dina registrerade verktyg innan ni försöker anropa det. Returnera ett informativt fel till agenten när detta händer.
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)Fel 7: Tokenbudgeten tar slut
En långvarig agent som lagrar fullständiga verktygsresultat i sin kontext kan nå gränsen för LLM:ens kontextfönster. Sammanfatta eller trunkera stora verktygsresultat innan ni lägger till dem i historiken.
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)
Identifiera feltillstånd programmatiskt
Skriv en diagnostikfunktion som analyserar agentens steghistorik för att identifiera vilket feltillstånd som inträffade. Det är ovärderligt vid felsökning.
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))
Implementera en enkel stegbegränsning
Varje agentloop i produktion måste ha en fast stegbegränsning. Det här är den viktigaste säkerhetsmekanismen — den garanterar att loopen avslutas oavsett vad LLM:en beslutar.
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}Snabbreferens: Feltillstånd och åtgärder
En sammanfattning av de sex feltillstånden i agentloopen och deras åtgärder:
- Oändlig loop: identifiera upprepade par av (verktyg, argument) och avbryt med felåterkoppling
- Fastnat tillstånd: använd en max_iterations-spärr och tvinga fram ett slutligt svar nära gränsen
- Uteblivet slutligt svar: kontrollera uttryckligen om signalen final_answer finns i åtgärden
- Tolkningsfel: omge JSON-tolkningen med try/except och skicka tillbaka felet till LLM:en
- Tomma verktygsresultat: identifiera tomma strängar och ge återkopplingen ”inga data”
- Hallucinerade verktygsnamn: validera mot listan över registrerade verktyg och returnera ett felmeddelande
Kunskapskontroll: Fel i agentloopen
Testa er förståelse av vanliga feltillstånd i agentloopar.
Repetition: Vanliga fel i agentloopen
Ni kan nu identifiera och skydda er mot de viktigaste feltillstånden i agentloopar:
- Oändliga loopar, fastnade tillstånd och uteblivna slutliga svar kräver alla en spärr för maximalt antal iterationer
- Tolkningsfel i verktygsanrop kräver try/except runt JSON-tolkningen
- Tomma verktygsresultat måste upptäckas och följas av informativ återkoppling till LLM:en
- Hallucinerade verktygsnamn måste valideras mot listan över registrerade verktyg
- En uttömd tokenbudget kräver trunkering av resultat
En robust agentloop förutser alla dessa feltillstånd och hanterar dem på ett smidigt sätt.
Lär dig AI-agenter med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 60
- Lektioner
- 239
Vanliga frågor
Är lektionen ”Vanliga fel i agentloopar” gratis?
Ja – hela texten till ”Vanliga fel i agentloopar” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i AI-agenter, kan Ni uppgradera till CoddyKit PRO. Kursen i AI-agenter innehåller totalt 4 lektioner.
Vad lär jag mig i ”Vanliga fel i agentloopar”?
Oändliga loopar, upprepade verktygsanrop och att aldrig nå ett slutligt svar. Ni övar på AI-agenter med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig AI-agenter?
Du behöver inga förkunskaper. Utbildningen i AI-agenter på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Vanliga fel i agentloopar”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här AI-agenter-lektionen?
Ja. Varje AI-agenter-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Vanliga fel i agentloopar
- Spårningsloggning för agentsteg
- Upptäck och bryt oändliga loopar
- Tekniker för stegvis felsökning