Mengelola Status di Berbagai Langkah Eksekusi
Pertahankan variabel, bingkai data, dan pustaka yang diimpor di berbagai langkah eksekusi kode agar agen dapat membangun hasil sebelumnya tanpa menjalankan ulang perhitungan terdahulu.
Mengelola Status di Berbagai Langkah Eksekusi adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Masalah Tanpa Status
Setiap eksekusi kontainer Docker dimulai dengan interpreter Python baru. Variabel yang didefinisikan pada iterasi 1 tidak ada pada iterasi 2. Kondisi tanpa status ini memaksa agen menghitung ulang atau memuat ulang semuanya dari awal pada setiap langkah eksekusi—kecuali Anda menerapkan strategi pengelolaan status yang jelas untuk mempertahankan dan memulihkan status di antara iterasi. Tanpa strategi tersebut, analisis bertahap tidak mungkin dilakukan.
# 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!Persistensi Status Berbasis File
Pendekatan yang paling sederhana dan portabel adalah menyimpan status ke file. Pada akhir setiap blok kode, agen menyimpan DataFrame, kamus, atau objek lain ke file di direktori ruang kerja. Iterasi berikutnya memuatnya kembali. Parquet ideal untuk DataFrame, JSON untuk kamus, dan pickle untuk objek Python arbitrer (meskipun pickle dari kode yang tidak tepercaya merupakan risiko keamanan).
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)Mengajarkan Status Berbasis File kepada Agen
Anda tidak dapat hanya menerapkan status berbasis file di infrastruktur Anda—LLM juga harus mengetahui konvensinya dan menggunakannya secara konsisten. Sertakan instruksi yang jelas dalam perintah sistem: setelah menghitung hasil yang akan diperlukan nanti, selalu simpan hasil tersebut dengan nama file yang deskriptif, dan pada awal setiap iterasi, selalu muat file yang dihasilkan pada langkah-langkah sebelumnya sebelum melanjutkan.
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/'))
'''Status Berbasis Kernel dengan Proses Python Persisten
Alternatif untuk status berbasis file adalah mempertahankan proses Python persisten (seperti kernel Jupyter) yang berjalan di antara iterasi, lalu memasukkan setiap blok kode ke dalamnya dengan exec(). Variabel yang didefinisikan pada satu iterasi tetap dapat diakses pada iterasi berikutnya. Pendekatan ini lebih cepat dan lebih alami, tetapi memerlukan satu proses persisten untuk setiap sesi agen, bukan kontainer sementara.
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()Mengelola Status dengan Objek Status
Untuk lapisan pengatur agen (di luar sandbox), pertahankan objek status yang secara eksplisit melacak status pekerjaan agen saat ini: file apa yang telah dibuat, apa yang telah dihitung, pada langkah mana agen berada, dan apa tujuan akhirnya. Sampaikan ringkasan objek status ini kepada LLM pada setiap iterasi agar LLM selalu mengetahui posisinya dalam keseluruhan tugas.
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 += 1Memasukkan Konteks Status ke dalam Perintah
Setiap kali Anda memanggil LLM untuk blok kode berikutnya, masukkan konteks status saat ini ke dalam pesan pengguna. Dengan demikian, LLM memperoleh informasi yang akurat tentang file yang tersedia, hal yang telah dihitung, dan hal yang masih perlu dilakukan. Tanpa konteks ini, LLM mungkin mencoba membuat ulang file yang sudah ada atau melewati langkah yang sudah selesai.
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)Menangani Data Perantara Berukuran Besar
Agen analisis data sering menghasilkan kumpulan data perantara berukuran besar yang mahal untuk dimuat ulang pada setiap iterasi. Terapkan pemuatan malas: hanya muat data yang diperlukan untuk langkah saat ini. Gunakan format kolumnar seperti Parquet yang mendukung pembacaan efisien dengan memilih kolom. Untuk kumpulan data yang benar-benar besar (100 MB atau lebih), pertahankan kernel persisten agar DataFrame tetap berada di memori di antara iterasi, alih-alih diserialisasi dan dideserialisasi setiap kali.
# 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 accordinglyMembuat Titik Pemeriksaan untuk Tugas yang Berjalan Lama
Untuk tugas yang mencakup banyak iterasi, terapkan pembuatan titik pemeriksaan: simpan status lengkap agen secara berkala (langkah yang telah selesai, file ruang kerja, kemajuan saat ini) ke penyimpanan tahan lama agar tugas dapat dilanjutkan setelah gangguan. Hal ini sangat penting untuk pekerjaan analisis data yang panjang, yang mungkin memerlukan waktu lebih dari 30 menit dan dapat terganggu oleh masalah jaringan, kesalahan API, atau pemulaian ulang server.
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 stateMembersihkan Status Setelah Selesai
Ruang kerja agen mengakumulasi file dan dapat membesar seiring waktu. Selalu terapkan fase pembersihan yang dijalankan saat tugas selesai atau gagal: hapus file perantara (cleaned.parquet, tmp_output.csv) dan pertahankan hanya file keluaran akhir yang dibutuhkan pengguna. Untuk penyimpanan cloud, tetapkan kebijakan siklus hidup yang secara otomatis menghapus file ruang kerja setelah masa penyimpanan tertentu.
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]Pembuatan Versi Status untuk Debugging
Ketika agen kode menghasilkan hasil yang salah, Anda perlu menelusuri kembali riwayat eksekusinya untuk menemukan kesalahannya. Terapkan pembuatan versi status dengan menyimpan cuplikan ruang kerja setelah setiap iterasi. Dengan demikian, Anda dapat memutar ulang eksekusi agen, memeriksa status perantara, dan mengidentifikasi iterasi persis tempat kesalahan terjadi. Simpan hanya perbedaan (file yang berubah) untuk menghemat ruang.
Jendela Konteks vs Status Eksternal
Ada ketegangan mendasar dalam desain agen kode antara menempatkan status di jendela konteks LLM (langsung tersedia tetapi terbatas) dan di penyimpanan eksternal (tidak terbatas tetapi memerlukan pengelolaan eksplisit). Strategi optimalnya adalah: simpan data langkah saat ini dalam konteks, simpan hasil perantara berukuran besar dalam file, simpan tujuan tugas dan rencana tingkat tinggi dalam konteks, serta selalu simpan data mentah di disk. LLM mengelola tugas; sistem file mengelola data.
Pemeriksaan Singkat
Uji pemahaman Anda tentang pengelolaan status di antara langkah-langkah eksekusi kode dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini Anda mempelajari: persistensi status berbasis file menggunakan Parquet dan JSON adalah cara paling portabel untuk berbagi status di antara eksekusi kontainer sementara; kernel persisten menghilangkan waktu tambahan pemuatan ulang dengan mempertahankan proses Python yang aktif di antara iterasi; dan penyisipan konteks status memberi LLM pengetahuan yang akurat tentang file yang tersedia dan langkah yang telah selesai pada setiap iterasi. Selanjutnya kita akan membangun agen analisis data lengkap.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengelola Status di Berbagai Langkah Eksekusi” gratis?
Ya — teks lengkap “Mengelola Status di Berbagai Langkah Eksekusi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengelola Status di Berbagai Langkah Eksekusi”?
Pertahankan variabel, bingkai data, dan pustaka yang diimpor di berbagai langkah eksekusi kode agar agen dapat membangun hasil sebelumnya tanpa menjalankan ulang perhitungan terdahulu. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?
Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Mengelola Status di Berbagai Langkah Eksekusi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Perulangan Eksekusi Kode
- Pengotakan Pasir dengan Docker dan RestrictedPython
- Mengelola Status di Berbagai Langkah Eksekusi
- Membangun Agen Analisis Data