AI Engineering Academy · leksjon

Kodekjøringssløyfen

Utform sløyfen skriv-kjør-observer, der agenten genererer kode, en sandkasset kjører den, stdout og stderr fanges opp og sendes tilbake som observasjoner, og agenten retter feilene.

Leksjon 1 av 413 trinn

Kodekjøringssløyfen er en gratis leksjon i AI Engineering Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI Engineering Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI Engineering Academy inneholder totalt 4 leksjoner.

Kodeagenter: skrive og kjøre kode

En kodekjøringsagent er en spesialisert type AI-agent som løser problemer ved å skrive kode, kjøre den, observere resultatet og gjenta prosessen til oppgaven er fullført. I motsetning til agenter som bare bruker forhåndsdefinerte verktøy, oppretter kodeagenter nye beregningsverktøy underveis. Dette gjør dem svært fleksible: enhver oppgave som kan programmeres, kan forsøkes løst av en kodeagent.

Løkken for skriving, kjøring og observasjon

Kjernen i en kodekjøringsagent er en løkke med tre trinn: Write — LLM-en genererer Python-kode for å løse det aktuelle trinnet i oppgaven. Execute — koden kjøres i et sandkassemiljø, og stdout/stderr fanges opp. Observe — resultatet fra kjøringen sendes tilbake til LLM-en som en ny observasjon, som den bruker til å avgjøre hva som skal skrives videre. Løkken fortsetter til oppgaven er fullført eller en grense for antall iterasjoner er nådd.

def code_execution_loop(task: str, max_iterations=10):
    messages = [
        {'role': 'system', 'content': 'You are a Python coding agent. Write code to solve tasks step by step.'},
        {'role': 'user', 'content': task}
    ]
    
    for i in range(max_iterations):
        # WRITE: LLM generates code
        response = llm.complete(messages)
        code = extract_code_block(response)
        
        if not code:
            return response  # LLM gave a final answer without code
        
        # EXECUTE: run the code
        output, error = execute_safely(code)
        
        # OBSERVE: feed output back
        observation = f'Output:\n{output}' if not error else f'Error:\n{error}'
        messages.append({'role': 'assistant', 'content': response})
        messages.append({'role': 'user', 'content': observation})
    
    return 'Max iterations reached'

Hente ut kodeblokker fra LLM-resultatet

LLM-er pakker vanligvis generert kode inn i markdown-gjerderte kodeblokker: ```python ... ```. Kjøringsløkken må hente ut koden fra disse blokkene på en pålitelig måte før den kjører den. Bruk et regulært uttrykk eller en enkel parser for å finne gjerdeblokkene, og håndter spesialtilfeller som nestede backticks, flere kodeblokker i samme svar eller kode uten språkspesifikasjon.

import re

def extract_code_block(response: str) -> str | None:
    # Match ```python ... ``` or ``` ... ```
    pattern = r'```(?:python)?\n(.*?)```'
    matches = re.findall(pattern, response, re.DOTALL)
    if not matches:
        return None
    # Return the LAST code block (often the most complete version)
    return matches[-1].strip()

# Test
sample_response = '''I will calculate the sum:\n\n```python\nnumbers = [1, 2, 3, 4, 5]\nprint(sum(numbers))\n```'''
code = extract_code_block(sample_response)
print(repr(code))  # 'numbers = [1, 2, 3, 4, 5]\nprint(sum(numbers))'

Fange opp stdout og stderr

Når De kjører kode generert av en agent, må De fange opp både stdout (vanlig utdata) og stderr (feilmeldinger og sporingsinformasjon) for å sende dem tilbake til LLM-en. Det enkleste er å bruke Pythons subprocess-modul: Kjør koden som en separat prosess og fang opp begge strømmene. Angi en tidsavbruddsgrense for å hindre at kode som henger, blokkerer agenten.

import subprocess
import tempfile
import os

def execute_code(code: str, timeout_seconds=30) -> tuple[str, str]:
    # Write code to a temp file
    with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
        f.write(code)
        tmp_path = f.name
    
    try:
        result = subprocess.run(
            ['python', tmp_path],
            capture_output=True,
            text=True,
            timeout=timeout_seconds
        )
        stdout = result.stdout[:5000]  # cap output length
        stderr = result.stderr[:2000]  # cap error length
        return stdout, stderr
    except subprocess.TimeoutExpired:
        return '', f'TimeoutError: code exceeded {timeout_seconds}s limit'
    finally:
        os.unlink(tmp_path)  # always clean up temp file

Håndtere feil på en intelligent måte

Når kode gir en feil, sendes feilmeldingen (sporingsinformasjon, unntakstype og linjenummer) tilbake til LLM-en som en observasjon. LLM-en analyserer deretter feilen og skriver korrigert kode. For å hjelpe LLM-en med effektiv feilsøking bør De ta med den nøyaktige feilteksten i observasjonen, inkludere kodelinjen som forårsaket feilen og uttrykkelig be LLM-en om å rette den før De prøver på nytt.

def format_error_observation(code: str, error: str) -> str:
    lines = code.split('\n')
    
    # Extract line number from traceback if available
    line_match = re.search(r'line (\d+)', error)
    error_context = ''
    if line_match:
        line_num = int(line_match.group(1))
        if 1 <= line_num <= len(lines):
            error_context = f'\nFailing line: {lines[line_num - 1].strip()}'
    
    return f'''Execution failed with error:{error_context}\n\n{error}\n\nPlease analyze the error and write corrected code.'''

# Usage in loop
output, err = execute_code(code)
if err:
    observation = format_error_observation(code, err)
else:
    observation = f'Output:\n{output}\n\nContinue with the next step or provide the final answer.'

Oppdage når oppgaven er fullført

Kjøringsløkken må vite når den skal stoppe. Vanlige signaler på fullføring er at LLM-en returnerer et svar uten kodeblokk (bare et svar på naturlig språk), at LLM-en skriver en spesiell markør som # TASK_COMPLETE, at koden oppretter en utdatafil som agenten ble bedt om å lage, eller at en valideringsfunksjon bekrefter at resultatet oppfyller suksesskriteriene. Implementer alltid en grense for antall iterasjoner som reserve.

COMPLETION_MARKERS = ['TASK COMPLETE', 'FINAL ANSWER:', 'DONE:']

def is_task_complete(response: str, code: str | None, output: str, success_fn=None) -> bool:
    # Check for explicit completion markers
    for marker in COMPLETION_MARKERS:
        if marker in response.upper():
            return True
    
    # No code generated - LLM is done
    if code is None:
        return True
    
    # Custom success function (e.g., check output file exists)
    if success_fn and success_fn(output):
        return True
    
    return False

# Example success function
def report_was_generated(output: str) -> bool:
    import os
    return os.path.exists('analysis_report.pdf')

Overføre data mellom iterasjoner

En utfordring i kodekjøringsløkker er bevaring av tilstand mellom iterasjoner. Hver kodeblokk kjøres i en ny Python-prosess, så variabler som er definert i én iterasjon, er ikke tilgjengelige i den neste. Mulige løsninger er å skrive mellomliggende data til filer, bruke en vedvarende prosess med kode injisert via exec() eller uttrykkelig instruere LLM-en om å definere nødvendige variabler på nytt i begynnelsen av hver kodeblokk.

# Strategy 1: Save to files between iterations
# Iteration 1: LLM writes
'''
import pandas as pd
df = pd.read_csv('data.csv')
df_cleaned = df.dropna()
df_cleaned.to_parquet('cleaned.parquet')  # save for next iteration
print('Cleaned rows:', len(df_cleaned))
'''

# Iteration 2: LLM reads previous output
'''
import pandas as pd
df = pd.read_parquet('cleaned.parquet')  # reload from file
result = df.groupby('category').sum()
result.to_csv('result.csv')
print(result.head())
'''

Strukturere systemledeteksten

Systemledeteksten for en kodekjøringsagent må lære LLM-en hvordan løkken skal brukes effektivt. Viktige elementer er hvordan den skal skrive kjørbare Python-kodeblokker, hvordan den skal kontrollere mellomliggende resultater før den fortsetter, hvordan den skal signalisere at oppgaven er fullført, hvilke biblioteker som er tilgjengelige i sandkassen, og hvilke filbaner agenten har lov til å lese fra og skrive til.

CODE_AGENT_SYSTEM_PROMPT = '''
You are a Python code execution agent. Solve tasks by writing and running code.

Rules:
1. Write ALL code inside ```python ... ``` blocks.
2. Write small, testable code blocks - do not try to do everything in one block.
3. When you see execution output, analyze it and decide whether to continue or fix errors.
4. Available libraries: pandas, numpy, matplotlib, requests, json, os, pathlib.
5. You can read/write files only in /workspace/ directory.
6. When the task is fully complete, say TASK COMPLETE and summarize the result.
7. If you are stuck after 3 attempts at the same error, say ESCALATE and explain the problem.
'''

Avkorting av utdata og tokenhåndtering

Kode generert av agenter kan produsere enorme mengder utdata: utskrifter av DataFrame-er, lange lister og detaljerte logger. Hvis hele utdataene sendes tilbake til LLM-en, sløses det med tokens, og kontekstvinduet kan bli overskredet. Avkort alltid utdataene fra kjøringen før De legger dem til i samtalen. Et godt utgangspunkt er 2000–5000 tegn, samt en merknad om at utdataene ble avkortet, slik at LLM-en vet at det kan finnes mer informasjon å undersøke.

MAX_OUTPUT_CHARS = 3000

def format_observation(stdout: str, stderr: str) -> str:
    if stderr:
        # Errors take priority - show full error
        return f'Error:\n{stderr[:MAX_OUTPUT_CHARS]}'
    
    if len(stdout) > MAX_OUTPUT_CHARS:
        truncated = stdout[:MAX_OUTPUT_CHARS]
        remaining = len(stdout) - MAX_OUTPUT_CHARS
        return f'{truncated}\n... [output truncated, {remaining} more characters]'
    
    return f'Output:\n{stdout}' if stdout else 'Code executed successfully (no output)'

Kodeløkken i praksis

En reell kodekjøringsagent for dataanalyse kan kjøre 5–15 iterasjoner for å laste inn en CSV-fil, undersøke strukturen, rense dataene, beregne statistikk, generere et diagram og produsere en sammendragsrapport. Hver iterasjon bygger på den forrige, mens LLM-en tilpasser fremgangsmåten basert på faktiske dataverdier og datastrukturer som oppdages under kjøringen. Denne dynamiske tilpasningen er det som gjør kodeagenter så kraftige for utforskende oppgaver.

Sikkerhetshensyn i kodeløkker

Det innebærer en betydelig sikkerhetsrisiko å kjøre LLM-generert kode på infrastrukturen Deres. Kjør aldri agentkode uten sandk سandboxing. LLM-en kan utilsiktet (eller på grunn av prompt injection) generere kode som sletter filer, eksfiltrerer data, sender nettverksforespørsler til eksterne tjenester eller bruker opp systemressurser. Kjør alltid koden i et isolert miljø med strenge ressursgrenser, nettverksbegrensninger og avgrensninger for filsystemet.

Kort kontroll

Test forståelsen Deres av løkken for kodekjøring fra denne leksjonen.

Oppsummering av leksjonen

I denne leksjonen lærte De at løkken for skriving, kjøring og observasjon er det grunnleggende mønsteret for kodekjøringsagenter, at stdout og stderr fra kjøringen sendes tilbake som observasjoner som styrer LLM-ens neste kodegenerering, og at avkorting av utdata og grenser for antall iterasjoner er viktige sikkerhetsmekanismer. Neste gang utforsker vi sandkassekjøring av kode med Docker og RestrictedPython.

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «Kodekjøringssløyfen» gratis?

Ja – hele teksten i «Kodekjøringssløyfen» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av AI Engineering Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i AI Engineering Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Kodekjøringssløyfen»?

Utform sløyfen skriv-kjør-observer, der agenten genererer kode, en sandkasset kjører den, stdout og stderr fanges opp og sendes tilbake som observasjoner, og agenten retter feilene. Du øver på AI Engineering Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med AI Engineering Academy?

Ingen tidligere erfaring er nødvendig. AI Engineering Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Kodekjøringssløyfen»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne AI Engineering Academy-leksjonen?

Ja. Alle AI Engineering Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Kodekjøringssløyfen
  2. Sandkassing med Docker og RestrictedPython
  3. Tilstandsbehandling på tvers av kjøringstrinn
  4. Bygge en dataanalyseagent
← Tilbake til AI Engineering Academy