AI Engineering Academy · Oppitunti

Koodin suorituskehä

Suunnittele kirjoita–suorita–havainnoi-kehä, jossa agentti tuottaa koodia, eristetty suorittaja suorittaa sen, stdout ja stderr tallennetaan ja välitetään havainnoiksi takaisin agentille, joka korjaa virheet.

Oppitunti 1/413 vaihetta

Koodin suorituskehä on ilmainen AI Engineering Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu AI Engineering Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. AI Engineering Academy-kurssilla on yhteensä 4 oppituntia.

Koodiagentit: koodin kirjoittaminen ja suorittaminen

Koodinsuoritusagentti on erityinen tekoälyagentti, joka ratkaisee ongelmia kirjoittamalla koodia, suorittamalla sitä, tarkkailemalla tulosta ja toistamalla prosessia, kunnes tehtävä on valmis. Toisin kuin agentit, jotka käyttävät vain ennalta määritettyjä työkaluja, koodiagentit luovat uusia laskennallisia työkaluja lennossa. Siksi ne ovat erittäin joustavia: koodiagentti voi yrittää mitä tahansa ohjelmoitavissa olevaa tehtävää.

Kirjoita–suorita–havainnoi-silmukka

Koodinsuoritusagentin ydin on kolmivaiheinen silmukka: Write — LLM luo Python-koodia tehtävän nykyisen vaiheen ratkaisemiseksi. Execute — koodi suoritetaan hiekoitetussa ympäristössä, ja stdout/stderr tallennetaan. Observe — suorituksen tuloste syötetään takaisin LLM:lle uutena havaintona, jonka perusteella se päättää, mitä kirjoitetaan seuraavaksi. Silmukka jatkuu, kunnes tehtävä on valmis tai iteraatioiden enimmäismäärä saavutetaan.

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'

Koodilohkojen poimiminen LLM:n tulosteesta

LLM:t ympäröivät luodun koodin yleensä Markdownin fenced code block -lohkoihin: ```python ... ```. Suoritussilmukan on poimittava koodi näistä lohkoista luotettavasti ennen sen suorittamista. Käyttäkää säännöllistä lauseketta tai yksinkertaista jäsennintä fenced code block -lohkojen löytämiseen ja käsitelkää myös erikoistapaukset, kuten sisäkkäiset kenoviivat, useat koodilohkot samassa vastauksessa tai koodi ilman kielimääritettä.

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

stdout:n ja stderr:n tallentaminen

Kun suoritatte agentin luomaa koodia, teidän on tallennettava sekä stdout (tavallinen tuloste) että stderr (virheilmoitukset ja tracebackit), jotta voitte syöttää ne takaisin LLM:lle. Pythonin subprocess-moduuli on yksinkertaisin lähestymistapa: suorittakaa koodi erillisenä prosessina ja tallentakaa molemmat virrat. Asettakaa aikakatkaisu, jotta jumiin jäävä koodi ei estä agentin toimintaa.

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

Virheiden älykäs käsittely

Kun koodi tuottaa virheen, virheilmoite (traceback, poikkeuksen tyyppi ja rivinumero) syötetään LLM:lle havaintona. Tämän jälkeen LLM analysoi virheen ja kirjoittaa korjatun koodin. Jotta LLM voi selvittää virheen tehokkaasti, sisällyttäkää havaintoon täsmällinen virheteksti, virheen aiheuttanut koodirivi ja pyytäkää LLM:ää nimenomaisesti korjaamaan virhe ennen uutta yritystä.

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

Tehtävän valmistumisen tunnistaminen

Koodinsuoritussilmukan on tiedettävä, milloin lopettaa. Yleisiä valmistumisen merkkejä ovat esimerkiksi LLM:n vastaus, joka ei sisällä koodilohkoa (vaan ainoastaan luonnollisen kielen vastauksen), LLM:n kirjoittama erityinen merkki, kuten # TASK_COMPLETE, agentin luoma pyydetty tulostiedosto tai kelpuutusfunktio, joka vahvistaa tuloksen täyttävän onnistumiskriteerit. Toteuttakaa aina iteraatioiden enimmäismäärä varmistukseksi.

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

Tietojen välittäminen iteraatioiden välillä

Yksi koodinsuoritussilmukoiden haasteista on tilan säilyminen iteraatioiden välillä. Kukin koodilohko suoritetaan uudessa Python-prosessissa, joten yhdessä iteraatiossa määritetyt muuttujat eivät ole käytettävissä seuraavassa. Ratkaisuja ovat väliaikaisten tietojen kirjoittaminen tiedostoihin, pysyvän prosessin käyttäminen ja koodin syöttäminen siihen exec()-kutsulla tai tarvittavien muuttujien uudelleenmäärittelyn ohjeistaminen LLM:lle kunkin koodilohkon alussa.

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

System promptin jäsentäminen

Koodinsuoritusagentin system promptin on opetettava LLM:lle, miten silmukkaa käytetään tehokkaasti. Keskeisiä sisällytettäviä asioita ovat suoritettavien Python-koodilohkojen kirjoittaminen, välitulosten tarkistaminen ennen jatkamista, tehtävän valmistumisesta ilmoittaminen, hiekkalaatikossa käytettävissä olevat kirjastot sekä tiedostopolut, joista agentti saa lukea ja joihin se saa kirjoittaa.

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

Tulosteen katkaiseminen ja tokenien hallinta

Agentin luoma koodi voi tuottaa valtavia tulosteita: DataFrame-tulosteita, pitkiä luetteloita ja yksityiskohtaisia lokeja. Koko tulosteen syöttäminen takaisin LLM:lle kuluttaa tokeneita ja voi ylittää konteksti-ikkunan koon. Katkaiskaa suoritustuloste aina ennen sen lisäämistä keskusteluun. Hyvä oletusarvo on 2 000–5 000 merkkiä sekä huomautus siitä, että tuloste katkaistiin, jotta LLM tietää, että tutkittavaa voi olla enemmän.

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

Koodisilmukka käytännössä

Data-analyysiin tarkoitettu todellinen koodinsuoritusagentti voi suorittaa 5–15 iteraatiota esimerkiksi CSV-tiedoston lataamiseksi, sen rakenteen tutkimiseksi, tietojen puhdistamiseksi, tilastojen laskemiseksi, kaavion luomiseksi ja yhteenvetoraportin tuottamiseksi. Jokainen iteraatio rakentuu edellisen päälle, ja LLM mukauttaa lähestymistapaansa suorituksen aikana löydettyjen todellisten data-arvojen ja rakenteiden perusteella. Juuri tämä dynaaminen mukautuminen tekee koodiagenteista niin tehokkaita tutkivissa tehtävissä.

Koodisilmukoiden tietoturvanäkökohdat

LLM:n luoman koodin suorittaminen omassa infrastruktuurissanne on merkittävä tietoturvariski. Älkää koskaan suorittako agentin koodia ilman hiekkalaatikkoa. LLM voi vahingossa tai prompt injection -hyökkäyksen seurauksena luoda koodia, joka poistaa tiedostoja, siirtää tietoja ulkopuolisille, tekee verkkopyyntöjä ulkoisiin palveluihin tai kuluttaa järjestelmän resurssit loppuun. Suorittakaa koodi aina eristetyssä ympäristössä, jossa on tiukat resurssirajoitukset, verkkorajoitukset ja tiedostojärjestelmän rajat.

Pikatesti

Testatkaa tässä oppitunnissa oppimanne koodinsuoritussilmukasta.

Oppitunnin yhteenveto

Tässä oppitunnissa opitte, että kirjoita–suorita–havainnoi-silmukka on koodinsuoritusagenttien keskeinen toimintamalli, suorituksen stdout ja stderr syötetään takaisin havaintoina ohjaamaan LLM:n seuraavaa koodinluontia ja tulosteen katkaiseminen sekä iteraatioiden enimmäismäärät ovat olennaisia turvamekanismeja. Seuraavaksi tutustumme koodinsuorituksen hiekkalaatikointiin Dockerin ja RestrictedPythonin avulla.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Koodin suorituskehä” ilmainen?

Kyllä – oppitunnin ”Koodin suorituskehä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko AI Engineering Academy-kurssin, päivitä CoddyKit PROhon. AI Engineering Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Koodin suorituskehä”?

Suunnittele kirjoita–suorita–havainnoi-kehä, jossa agentti tuottaa koodia, eristetty suorittaja suorittaa sen, stdout ja stderr tallennetaan ja välitetään havainnoiksi takaisin agentille, joka korjaa… Harjoittelet AI Engineering Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni AI Engineering Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin AI Engineering Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Koodin suorituskehä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä AI Engineering Academy-oppitunnilla?

Kyllä. Jokainen AI Engineering Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Koodin suorituskehä
  2. Hiekkalaatikointi Dockerilla ja RestrictedPythonilla
  3. Tilan hallinta suoritusvaiheiden välillä
  4. Data-analyysiagentin rakentaminen
← Takaisin: AI Engineering Academy