AI-agenter · Lektion

Vanliga fel i agentloopar

Oändliga loopar, upprepade verktygsanrop och att aldrig nå ett slutligt svar.

Lektion 1 av 413 steg

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.

Gratis att börja

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

  1. Vanliga fel i agentloopar
  2. Spårningsloggning för agentsteg
  3. Upptäck och bryt oändliga loopar
  4. Tekniker för stegvis felsökning
← Tillbaka till AI-agenter