0Pricing
AI Engineering Academy · Ders

Çalıştırma Adımları Arasında Durum Yönetimi

Ajanın önceki sonuçlar üzerine yeniden çalıştırmadan ilerleyebilmesi için değişkenleri, veri çerçevelerini ve içe aktarılan kütüphaneleri birden çok kod çalıştırma adımı boyunca kalıcı hâle getirin.

Çalıştırma Adımları Arasında Durum Yönetimi, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

Durumsuzluk Sorunu

Her Docker kapsayıcısı yürütmesi yeni bir Python yorumlayıcısıyla başlar. 1. yinelemede tanımlanan değişkenler 2. yinelemede mevcut olmaz. Bu durumsuzluk, açık bir durum yönetimi stratejisi uygulayıp durumu yinelemeler arasında kalıcı hâle getirip geri yüklemediğiniz sürece aracıyı her yürütme adımında her şeyi baştan hesaplamaya veya yeniden yüklemeye zorlar. Bu olmadan çok adımlı analizler mümkün değildir.

# Iteration 1 - works fine
df = pd.read_csv('data.csv')  # df is in memory
df_cleaned = df.dropna()
print('Rows after cleaning:', len(df_cleaned))

# Iteration 2 - NEW container, df_cleaned is GONE
result = df_cleaned.groupby('category').sum()  # NameError: df_cleaned is not defined
print(result)  # This will fail!

Dosya Tabanlı Durum Kalıcılığı

En basit ve en taşınabilir yaklaşım, durumu dosyalara kaydetmektir. Her kod bloğunun sonunda aracı, DataFrame'leri, sözlükleri veya diğer nesneleri çalışma alanı dizinindeki dosyalara kaydeder. Sonraki yineleme bunları yeniden yükler. Parquet, DataFrame'ler için; JSON, sözlükler için; pickle ise rastgele Python nesneleri için idealdir (ancak güvenilmeyen koddan gelen pickle bir güvenlik riskidir).

import pandas as pd
import json
from pathlib import Path

WORKSPACE = Path('/workspace')

# Iteration 1: process and SAVE
df = pd.read_csv(WORKSPACE / 'raw_data.csv')
df_cleaned = df.dropna().reset_index(drop=True)
df_cleaned.to_parquet(WORKSPACE / 'cleaned.parquet')  # save for next iteration

stats = {'rows': len(df_cleaned), 'columns': list(df_cleaned.columns)}
with open(WORKSPACE / 'stats.json', 'w') as f:
    json.dump(stats, f)

print('Saved cleaned data:', len(df_cleaned), 'rows')

# Iteration 2: LOAD and continue
df_cleaned = pd.read_parquet(WORKSPACE / 'cleaned.parquet')  # restore state
with open(WORKSPACE / 'stats.json') as f:
    stats = json.load(f)
result = df_cleaned.groupby('category')['value'].sum()
print(result)

Aracıya Dosya Tabanlı Durumu Öğretme

Altyapınızda yalnızca dosya tabanlı durumu uygulamanız yeterli değildir; LLM'nin de bu kuralı bilmesi ve tutarlı biçimde kullanması gerekir. Sistem istemine açık talimatlar ekleyin: daha sonra gerekecek bir sonuç hesapladıktan sonra onu her zaman açıklayıcı bir dosya adıyla kaydedin ve her yinelemenin başında, devam etmeden önce önceki adımlarda oluşturulan dosyaları her zaman yükleyin.

STATE_MANAGEMENT_INSTRUCTIONS = '''
State persistence rules:
- You have a persistent workspace at /workspace/
- After computing any result you will need later, SAVE it to /workspace/
  - DataFrames: use .to_parquet('/workspace/name.parquet')
  - Dicts/lists: use json.dump to /workspace/name.json
  - Text: write to /workspace/name.txt
- At the start of each code block, LOAD the files you need from previous steps
- Use clear, descriptive filenames like 'cleaned_data.parquet', not 'tmp1.parquet'
- When listing files, use: import os; print(os.listdir('/workspace/'))
'''

Kalıcı Python Süreçleriyle Çekirdek Tabanlı Durum

Dosya tabanlı duruma bir alternatif, yinelemeler arasında çalışan kalıcı bir Python sürecini (Jupyter çekirdeği gibi) tutmak ve her kod bloğunu exec() ile bu sürece eklemektir. Bir yinelemede tanımlanan değişkenler sonraki yinelemede erişilebilir kalır. Bu yaklaşım daha hızlı ve daha doğaldır; ancak geçici kapsayıcılar yerine her aracı oturumu için kalıcı bir süreç çalıştırmayı gerektirir.

import jupyter_client

class PersistentKernel:
    def __init__(self):
        km, self.kc = jupyter_client.manager.start_new_kernel(kernel_name='python3')
        self.kc.wait_for_ready(timeout=30)
        print('Kernel started')

    def execute(self, code: str, timeout=60) -> tuple[str, str]:
        msg_id = self.kc.execute(code)
        outputs, errors = [], []
        
        while True:
            msg = self.kc.get_iopub_msg(timeout=timeout)
            if msg['msg_type'] == 'stream':
                if msg['content']['name'] == 'stdout':
                    outputs.append(msg['content']['text'])
                else:
                    errors.append(msg['content']['text'])
            if msg['msg_type'] == 'status' and msg['content']['execution_state'] == 'idle':
                break
        
        return ''.join(outputs), ''.join(errors)

    def shutdown(self):
        self.kc.shutdown()

# Variables persist across execute() calls!
kernel = PersistentKernel()
kernel.execute('x = 42')  # x is now defined in kernel
output, _ = kernel.execute('print(x)')  # prints 42 - state persists!
kernel.shutdown()

Durum Nesnesiyle Durumu Yönetme

Aracı düzenleyici katmanı için (korumalı çalıştırma alanının dışında), aracının çalışmasının mevcut durumunu izleyen açık bir durum nesnesi tutun: hangi dosyaların oluşturulduğunu, nelerin hesaplandığını, aracının hangi adımda olduğunu ve nihai hedefin ne olduğunu izleyin. Her yinelemede bu durum nesnesinin özetini LLM'ye iletin; böylece LLM genel görev içindeki konumunu her zaman bilir.

from dataclasses import dataclass, field
from typing import Any

@dataclass
class ExecutionState:
    task: str
    iteration: int = 0
    workspace_files: list[str] = field(default_factory=list)
    computed_values: dict[str, Any] = field(default_factory=dict)
    completed_steps: list[str] = field(default_factory=list)
    last_output: str = ''

    def to_context_summary(self) -> str:
        return f'''Current task: {self.task}
Iteration: {self.iteration}
Completed steps: {', '.join(self.completed_steps) or 'None yet'}
Workspace files: {', '.join(self.workspace_files) or 'None yet'}
Key values: {self.computed_values}
Last output: {self.last_output[:500]}'''

    def after_execution(self, output: str, step_name: str):
        import os
        self.workspace_files = os.listdir('/workspace')
        self.completed_steps.append(step_name)
        self.last_output = output
        self.iteration += 1

Durum Bağlamını İstemlere Eklemek

Bir sonraki kod bloğu için LLM'yi her çağırdığınızda, mevcut durum bağlamını kullanıcı mesajına ekleyin. Bu, LLM'ye hangi dosyaların kullanılabilir olduğu, nelerin hesaplandığı ve daha yapılması gerekenler hakkında doğru bilgi verir. Bu bağlam olmadan LLM, zaten var olan dosyaları yeniden oluşturmaya çalışabilir veya tamamlanmış adımları atlayabilir.

def build_iteration_prompt(task: str, state: ExecutionState, last_observation: str) -> str:
    return f'''ORIGINAL TASK: {task}

CURRENT STATE:
{state.to_context_summary()}

LAST EXECUTION OUTPUT:
{last_observation}

What is the next step? Write Python code to continue. 
Remember:
- Load data from workspace files if needed
- Save any results you will need in future steps
- If the task is complete, say TASK COMPLETE and summarize the result'''

# Use in the main loop
for step_num in range(max_iterations):
    context = build_iteration_prompt(task, state, last_observation)
    response = llm.complete(messages + [{'role': 'user', 'content': context}])
    code = extract_code_block(response)
    if not code:
        break  # done
    output, err = execute_in_sandbox(code)
    state.after_execution(output, step_name=f'step_{step_num}')
    last_observation = format_observation(output, err)

Büyük Ara Verileri Yönetme

Veri analizi aracıları, her yinelemede yeniden yüklenmesi maliyetli olan büyük ara veri kümeleri üretir. Tembel yükleme uygulayın: yalnızca mevcut adım için gereken verileri yükleyin. Sütun seçmeli verimli okumayı destekleyen Parquet gibi sütun tabanlı biçimleri kullanın. Gerçekten büyük veri kümeleri (100 MB ve üzeri) için, her seferinde serileştirilip serileştirmeden çıkarılmaları yerine DataFrame'in yinelemeler arasında bellekte kalması amacıyla kalıcı bir çekirdek tutun.

# Good: load only needed columns
df = pd.read_parquet('/workspace/full_data.parquet', columns=['date', 'revenue', 'region'])

# Bad: load everything even if you only need 2 columns
# df = pd.read_parquet('/workspace/full_data.parquet')  # loads 50 columns you don't need

# Good: filter early before loading full dataset
df = pd.read_parquet('/workspace/full_data.parquet', filters=[('region', '=', 'EMEA')])

# For very large files, tell the LLM about data shape upfront
df_info = {'shape': (1_000_000, 50), 'size_mb': 850, 'columns': [...]}
# Include df_info in state so LLM plans accordingly

Uzun Süren Görevlerde Kontrol Noktaları

Birçok yinelemeye yayılan görevler için kontrol noktası oluşturma uygulayın: görevin bir kesintiden sonra sürdürülebilmesi için aracının tam durumunu (tamamlanan adımlar, çalışma alanı dosyaları, mevcut ilerleme) düzenli aralıklarla kalıcı bir depoya kaydedin. Bu, 30 dakikadan uzun sürebilen ve ağ sorunları, API hataları veya sunucu yeniden başlatmaları nedeniyle kesintiye uğrayabilen uzun veri analizi işleri için özellikle önemlidir.

import json
import time

def checkpoint_state(state: ExecutionState, checkpoint_id: str, db):
    data = {
        'task': state.task,
        'iteration': state.iteration,
        'completed_steps': state.completed_steps,
        'workspace_files': state.workspace_files,
        'timestamp': time.time()
    }
    db.execute(
        'INSERT INTO agent_checkpoints (id, state) VALUES (?, ?) ON CONFLICT(id) DO UPDATE SET state=excluded.state',
        (checkpoint_id, json.dumps(data))
    )
    print(f'Checkpoint saved at iteration {state.iteration}')

def resume_from_checkpoint(checkpoint_id: str, db) -> ExecutionState | None:
    row = db.execute('SELECT state FROM agent_checkpoints WHERE id = ?', (checkpoint_id,)).fetchone()
    if not row:
        return None
    data = json.loads(row[0])
    state = ExecutionState(task=data['task'])
    state.iteration = data['iteration']
    state.completed_steps = data['completed_steps']
    print(f'Resumed from iteration {state.iteration}')
    return state

Tamamlanma Sonrasında Durumu Temizleme

Aracı çalışma alanlarında zamanla dosyalar birikir ve alan kullanımı büyüyebilir. Bir görev tamamlandığında veya başarısız olduğunda çalışan bir temizleme aşaması uygulayın: ara dosyaları (cleaned.parquet, tmp_output.csv) silin ve yalnızca kullanıcının önem verdiği nihai çıktı dosyalarını saklayın. Bulut depolama için, belirli bir saklama süresinden sonra çalışma alanı dosyalarını otomatik olarak silen yaşam döngüsü ilkeleri belirleyin.

import shutil
from pathlib import Path

INTERMEDIATE_PATTERNS = ['*.parquet', 'tmp_*.csv', 'step_*.json', 'debug_*.txt']
FINAL_OUTPUT_PATTERNS = ['report.pdf', 'final_*.csv', 'summary.json']

def cleanup_workspace(workspace_dir: str, keep_final=True):
    workspace = Path(workspace_dir)
    final_outputs = []
    
    if keep_final:
        for pattern in FINAL_OUTPUT_PATTERNS:
            final_outputs.extend(workspace.glob(pattern))
        # Move final outputs to output directory
        output_dir = workspace.parent / 'outputs'
        output_dir.mkdir(exist_ok=True)
        for f in final_outputs:
            shutil.move(str(f), str(output_dir / f.name))
    
    # Delete the workspace
    shutil.rmtree(workspace_dir)
    print(f'Workspace cleaned up. Kept {len(final_outputs)} output files.')
    return [str(f) for f in final_outputs]

Hata Ayıklama İçin Durum Sürümleri

Bir kod aracısı yanlış sonuçlar ürettiğinde, hatanın nerede oluştuğunu bulmak için yürütme geçmişini geriye doğru izlemeniz gerekir. Her yinelemeden sonra çalışma alanının anlık görüntüsünü kaydederek durum sürüm oluşturmasını uygulayın. Bu, aracının yürütmesini yeniden oynatmanıza, ara durumları incelemenize ve hatanın oluştuğu tam yinelemeyi belirlemenize olanak tanır. Alan kazanmak için yalnızca farkı (değişen dosyaları) saklayın.

Bağlam Penceresi ve Harici Durum

Kod aracısı tasarımında, durumu LLM bağlam penceresine (anında ancak sınırlı) koymak ile harici depolamaya (sınırsız ancak açık yönetim gerektirir) koymak arasında temel bir gerilim vardır. En uygun strateji şudur: mevcut adımın verilerini bağlamda tutun, büyük ara sonuçları dosyalarda tutun, görev hedefini ve üst düzey planı bağlamda tutun ve ham verileri her zaman diskte saklayın. LLM görevi yönetir; dosya sistemi verileri yönetir.

Hızlı Kontrol

Bu derste anlatılan kod yürütme adımları arasındaki durum yönetimi konusundaki anlayışınızı sınayın.

Ders Özeti

Bu derste şunları öğrendiniz: Parquet ve JSON kullanan dosya tabanlı durum kalıcılığı, geçici kapsayıcı yürütmeleri arasında durumu paylaşmanın en taşınabilir yoludur; kalıcı çekirdekler, canlı bir Python sürecini yinelemeler boyunca koruyarak yeniden yükleme maliyetini ortadan kaldırır; durum bağlamını isteme ekleme ise LLM'ye her yinelemede kullanılabilir dosyalar ve tamamlanan adımlar hakkında doğru bilgi verir. Sırada eksiksiz bir veri analizi aracısı oluşturacağız.

Sıkça Sorulan Sorular

“Çalıştırma Adımları Arasında Durum Yönetimi” dersi ücretsiz mi?

Evet — “Çalıştırma Adımları Arasında Durum Yönetimi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“Çalıştırma Adımları Arasında Durum Yönetimi” dersinde ne öğreneceğim?

Ajanın önceki sonuçlar üzerine yeniden çalıştırmadan ilerleyebilmesi için değişkenleri, veri çerçevelerini ve içe aktarılan kütüphaneleri birden çok kod çalıştırma adımı boyunca kalıcı hâle getirin. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Çalıştırma Adımları Arasında Durum Yönetimi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Kod Çalıştırma Döngüsü
  2. Docker ve RestrictedPython ile Yalıtımlı Çalıştırma
  3. Çalıştırma Adımları Arasında Durum Yönetimi
  4. Veri Analizi Ajanı Oluşturma
← AI Engineering Academy Sayfasına Dön