Patrón de intérprete de código para análisis de datos
Ejecución de Python en un entorno aislado: ejecute pandas/matplotlib en las herramientas del agente.
Patrón de intérprete de código para análisis de datos es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.
El patrón del intérprete de código
El patrón del intérprete de código permite que un agente genere código Python para responder preguntas de análisis de datos, ejecute ese código en un sandbox, capture la salida e interprete los resultados.
En lugar de codificar de antemano cada operación de análisis, el agente escribe código personalizado para cada pregunta, lo que le proporciona una flexibilidad ilimitada para las tareas de datos.
Bucle principal: generar → ejecutar → interpretar
El patrón consta de tres pasos que pueden repetirse:
- Generar — el LLM escribe código Python para responder a la pregunta
- Ejecutar — ejecute el código en un sandbox y capture stdout y los archivos
- Interpretar — vuelva a proporcionar la salida al LLM para que explique los resultados
def code_interpreter_agent(question, data_path):
# Step 1: Generate code
code = generate_analysis_code(question, data_path)
print('Generated code:', code[:200])
# Step 2: Execute in sandbox
result = execute_in_sandbox(code)
if result['error']:
# Try to fix the error
fixed_code = fix_code(code, result['error'])
result = execute_in_sandbox(fixed_code)
# Step 3: Interpret output
return interpret_output(question, result)
print(code_interpreter_agent(
'What is the average order value by customer segment?',
'data/orders.csv'
))Prompt de generación de código
El prompt de generación de código debe incluir: la ruta o el esquema de los datos, la pregunta y las restricciones (sin API externas, usar pandas y guardar los gráficos en archivos).
CODE_GEN_PROMPT = """You are a Python data analyst. Write Python code to answer the question.
Data available at: {data_path}
Question: {question}
Write ONLY Python code (no markdown, no explanation):"""
def llm_call(prompt):
return "```python\nprint('df.describe() results')\n```"
def generate_analysis_code(question, data_path):
response = llm_call(CODE_GEN_PROMPT.format(question=question, data_path=data_path))
code = response.strip()
if code.startswith('```'):
code = code.split('```')[1]
if code.startswith('python'):
code = code[6:]
return code.strip()
print(generate_analysis_code('What is the average price?', 'data.csv'))Ejecución en un sandbox mediante un subproceso
El sandbox más sencillo consiste en ejecutar el código en un subproceso independiente con un tiempo de espera. Esto proporciona aislamiento de procesos: si el código falla, no hace que el agente se detenga.
import subprocess
import tempfile
import os
def execute_in_sandbox(code, timeout=30):
# Write code to temp file
with tempfile.NamedTemporaryFile(suffix='.py', mode='w', delete=False) as f:
f.write(code)
script_path = f.name
try:
result = subprocess.run(
['python3', script_path],
capture_output=True,
text=True,
timeout=timeout,
env={**os.environ, 'MPLBACKEND': 'Agg'} # non-interactive matplotlib
)
return {
'stdout': result.stdout,
'stderr': result.stderr,
'returncode': result.returncode,
'error': result.stderr if result.returncode != 0 else None
}
except subprocess.TimeoutExpired:
return {'stdout': '', 'stderr': 'Timeout', 'returncode': -1, 'error': 'Code timed out'}
finally:
os.unlink(script_path)
if __name__ == '__main__':
result = execute_in_sandbox('print(2 + 2)')
print('Sandbox stdout:', result['stdout'].strip())
print('Return code :', result['returncode'])
Sandbox en la nube de E2B
E2B proporciona un sandbox en la nube administrado para ejecutar código de forma segura, más seguro que un subproceso. Ejecuta el código en un contenedor aislado con acceso al sistema de archivos.
Instálelo con pip install e2b-code-interpreter.
from e2b_code_interpreter import Sandbox
import os
def execute_with_e2b(code, data_bytes=None):
with Sandbox(api_key=os.getenv('E2B_API_KEY')) as sandbox:
# Upload data file if provided
if data_bytes:
sandbox.files.write('/home/user/data.csv', data_bytes)
# Execute code
execution = sandbox.run_code(code)
result = {
'stdout': '\n'.join(execution.logs.stdout),
'stderr': '\n'.join(execution.logs.stderr),
'error': None
}
# Check for errors
if execution.error:
result['error'] = str(execution.error)
# Download any generated files
result['files'] = []
for output in execution.results:
if hasattr(output, 'png'):
result['files'].append({
'type': 'image/png',
'data': output.png # base64 encoded
})
return resultCaptura de archivos generados
El código puede generar gráficos, exportaciones CSV u otros archivos. Recupere estos archivos del sistema de archivos del sandbox y devuélvalos al agente para que los interprete o los muestre.
import os
import glob
import base64
OUTPUT_DIR = '/tmp/chart_output'
def execute_and_capture(code, timeout=30):
# Create output dir
os.makedirs(OUTPUT_DIR, exist_ok=True)
result = execute_in_sandbox(code, timeout=timeout)
# Capture any generated image files
generated_files = []
for filepath in glob.glob(os.path.join(OUTPUT_DIR, '*.png')):
with open(filepath, 'rb') as f:
encoded = base64.b64encode(f.read()).decode('utf-8')
generated_files.append({
'filename': os.path.basename(filepath),
'type': 'image/png',
'base64': encoded
})
os.unlink(filepath) # clean up
result['generated_files'] = generated_files
print(f'Captured {len(generated_files)} file(s) from sandbox')
return resultBucle de recuperación ante errores
El código generado suele contener errores en la primera ejecución. Implemente un bucle de recuperación: envíe el error al LLM junto con el código original y pídale que lo corrija. Limite los reintentos a 2-3.
FIX_PROMPT = '''The following Python code raised an error. Fix it.
Original code:
{code}
Error:
{error}
Return ONLY the fixed Python code (no explanation, no markdown):'''
def fix_code(code, error):
return llm_call(FIX_PROMPT.format(code=code, error=error)).strip()
def execute_with_retry(code, max_retries=2):
for attempt in range(max_retries + 1):
result = execute_and_capture(code)
if not result['error']:
return result
print(f'Attempt {attempt + 1} failed: {result["error"][:100]}')
if attempt < max_retries:
code = fix_code(code, result['error'])
return result # return last result even if erroredInterpretación de la salida del código
La salida sin procesar del código (números y tablas) debe convertirse en una respuesta en lenguaje natural. Pase stdout al LLM y pídale que explique los resultados en el contexto de la pregunta original.
INTERPRET_PROMPT = '''A Python script was executed to answer a data analysis question.
Explain the results in clear, non-technical language.
Original question: {question}
Code output (stdout):
{output}
Provide a clear, concise answer that directly addresses the question.
Highlight the most important numbers or findings.
Answer:'''
def interpret_output(question, execution_result):
stdout = execution_result.get('stdout', '').strip()
error = execution_result.get('error')
if error and not stdout:
return f'The analysis failed with error: {error}'
if not stdout:
return 'The code ran successfully but produced no output.'
return llm_call(INTERPRET_PROMPT.format(
question=question,
output=stdout[:3000] # truncate very long outputs
))Restricciones de seguridad en la generación de código
El código generado no debe realizar llamadas de red, acceder a archivos confidenciales ni ejecutar comandos del sistema. Haga cumplir estas restricciones tanto en el prompt como mediante las restricciones del sandbox.
BLOCKED_IMPORTS = ['requests', 'httpx', 'urllib', 'socket', 'subprocess', 'os.system']
def pre_validate_code(code):
errors = []
for blocked in BLOCKED_IMPORTS:
if f'import {blocked}' in code or f'from {blocked}' in code:
errors.append(f'Blocked import: {blocked}')
# Block shell execution
import re
if re.search(r'os\.system|subprocess\.run|subprocess\.call|eval\(|exec\(', code):
errors.append('Blocked: shell execution or eval/exec')
# Block reading outside allowed paths
if re.search(r'open\([^)]*\.\./|open\([^)]*\/etc\/', code):
errors.append('Blocked: unauthorized file access')
if errors:
raise ValueError('Security check failed:\n' + '\n'.join(errors))
return True
if __name__ == '__main__':
try:
pre_validate_code('import requests\nrequests.get("http://x")')
except ValueError as e:
print('Rejected:', e)
print('Safe code passed:', pre_validate_code('print(1 + 1)'))
Inyección del esquema de datos
El LLM genera código de mayor calidad cuando conoce de antemano el esquema de los datos: nombres de columnas, tipos y filas de ejemplo. Incluya una descripción del esquema en el prompt de generación de código.
import pandas as pd
def get_data_schema(data_path):
df = pd.read_csv(data_path, nrows=5)
schema_lines = []
for col in df.columns:
dtype = str(df[col].dtype)
sample = df[col].dropna().iloc[0] if len(df[col].dropna()) > 0 else 'N/A'
schema_lines.append(f' - {col} ({dtype}): sample={sample!r}')
schema_text = '\n'.join(schema_lines)
return f'CSV columns:\n{schema_text}\nTotal rows: {len(pd.read_csv(data_path))}'
ENHANCED_PROMPT = CODE_GEN_PROMPT + '\n\nData schema:\n{schema}'
def generate_analysis_code_with_schema(question, data_path):
schema = get_data_schema(data_path)
response = llm_call(ENHANCED_PROMPT.format(
question=question, data_path=data_path, schema=schema
))
return response.strip()Seguimiento del historial de ejecución
Conserve un registro de todas las ejecuciones de código de una sesión. Esto permite que el agente consulte resultados anteriores, se base en cálculos previos y explique al usuario sus pasos de análisis.
from datetime import datetime
execution_history = []
def record_execution(question, code, result):
execution_history.append({
'timestamp': datetime.now().isoformat(),
'question': question,
'code_lines': len(code.splitlines()),
'stdout_preview': result.get('stdout', '')[:200],
'success': result.get('error') is None,
'generated_files': len(result.get('generated_files', []))
})
def get_session_summary():
total = len(execution_history)
successful = sum(1 for e in execution_history if e['success'])
return {
'total_executions': total,
'successful': successful,
'failed': total - successful,
'success_rate': f'{successful/max(total,1)*100:.0f}%',
'questions_answered': [e['question'][:60] for e in execution_history]
}
# Usage in agent loop
def code_interpreter_agent_tracked(question, data_path):
code = generate_analysis_code_with_schema(question, data_path)
result = execute_with_retry(code)
record_execution(question, code, result)
return interpret_output(question, result)Comprobación de conocimientos
¿Cuál es la principal ventaja de utilizar el patrón de intérprete de código en lugar de programar directamente operaciones específicas de análisis de datos como herramientas del agente?
Recapitulación: patrón de intérprete de código para análisis de datos
El patrón de intérprete de código consiste en: generar código Python (con el contexto del esquema y restricciones de seguridad) → ejecutarlo en un sandbox (subproceso o E2B) → capturar stdout y los archivos → reintentar si hay errores → interpretar los resultados en lenguaje natural.
Consideraciones clave: incorporar el esquema de los datos para mejorar la generación de código, validar previamente el código para bloquear importaciones y comandos de shell, usar un tiempo de espera del subproceso para evitar ejecuciones descontroladas y capturar los gráficos generados como base64 para mostrarlos.
Preguntas frecuentes
¿La lección «Patrón de intérprete de código para análisis de datos» es gratis?
Sí — el texto completo de «Patrón de intérprete de código para análisis de datos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.
¿Qué aprenderé en «Patrón de intérprete de código para análisis de datos»?
Ejecución de Python en un entorno aislado: ejecute pandas/matplotlib en las herramientas del agente. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Agents?
No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Patrón de intérprete de código para análisis de datos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Agents?
Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Patrón de intérprete de código para análisis de datos
- Herramientas de agentes basadas en Pandas
- Generación automatizada de gráficos y visualizaciones
- Agentes de resúmenes estadísticos