Schéma d’interpréteur de code pour l’analyse de données
Exécution Python en bac à sable : exécutez pandas/matplotlib dans les outils de l’agent.
Schéma d’interpréteur de code pour l’analyse de données est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.
Le modèle de l'interpréteur de code
Le modèle de l'interpréteur de code permet à un agent de générer du code Python pour répondre à des questions d'analyse de données, d'exécuter ce code dans un bac à sable, d'en capturer la sortie et d'interpréter les résultats.
Plutôt que de coder en dur chaque opération d'analyse, l'agent écrit un code personnalisé pour chaque question, ce qui le rend extrêmement flexible pour les tâches liées aux données.
Boucle principale : générer → exécuter → interpréter
Le modèle comporte trois étapes qui peuvent se répéter :
- Générer — Le LLM écrit du code Python pour répondre à la question
- Exécuter — exécutez le code dans un bac à sable et capturez la sortie standard ainsi que les fichiers
- Interpréter — transmettez la sortie au LLM afin qu'il explique les résultats
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'
))Invite de génération de code
L’invite de génération de code doit inclure : le chemin d’accès ou le schéma des données, la question et les contraintes (aucune interface de programmation externe, utilisation de pandas, enregistrement des graphiques dans des fichiers).
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'))Exécution dans un bac à sable par sous-processus
Le bac à sable le plus simple consiste à exécuter le code dans un sous-processus distinct avec un délai d’expiration. Cela assure l’isolation du processus : si le code tombe en panne, il n’arrête pas l’agent.
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'])
Bac à sable cloud E2B
E2B fournit un bac à sable cloud géré pour exécuter du code en toute sécurité, plus sécurisé qu’un sous-processus. Il exécute le code dans un conteneur isolé avec un accès au système de fichiers.
Installez-le avec 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 resultRécupération des fichiers générés
Le code peut générer des graphiques, des exportations CSV ou d’autres fichiers. Récupérez-les dans le système de fichiers du bac à sable, puis transmettez-les à l’agent pour interprétation ou affichage.
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 resultBoucle de récupération après erreur
Le code généré contient souvent des erreurs lors de sa première exécution. Mettez en place une boucle de récupération : renvoyez l’erreur au LLM avec le code original et demandez-lui de le corriger. Limitez le nombre de nouvelles tentatives à 2 ou 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 erroredInterprétation de la sortie du code
La sortie brute du code (nombres, tableaux) doit être reformulée en réponse en langage naturel. Transmettez la sortie standard au LLM et demandez-lui d’expliquer les résultats dans le contexte de la question initiale.
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
))Contraintes de sécurité pour la génération de code
Le code généré ne doit pas effectuer d’appels réseau, accéder à des fichiers sensibles ni exécuter de commandes système. Faites respecter ces règles à la fois dans l’invite et au moyen des restrictions du bac à sable.
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)'))
Injection du schéma des données
Le LLM génère un meilleur code lorsqu’il connaît à l’avance le schéma des données : noms des colonnes, types et lignes d’exemple. Incluez une description du schéma dans l’invite de génération de code.
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()Suivi de l’historique des exécutions
Conservez un journal de toutes les exécutions de code effectuées au cours d’une session. L’agent peut ainsi se référer aux résultats précédents, s’appuyer sur les calculs antérieurs et expliquer ses étapes d’analyse à l’utilisateur.
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)Vérification des connaissances
Quel est le principal avantage du motif de l’interpréteur de code par rapport au fait de coder en dur des opérations spécifiques d’analyse des données sous forme d’outils de l’agent ?
Récapitulatif : motif de l’interpréteur de code pour l’analyse des données
Le motif de l’interpréteur de code consiste à : générer du code Python (avec le contexte du schéma et les contraintes de sécurité) → l’exécuter dans un bac à sable (sous-processus ou E2B) → récupérer la sortie standard et les fichiers → réessayer en cas d’erreur → interpréter les résultats en langage naturel.
Points essentiels : injecter le schéma des données pour améliorer la génération de code, prévalider le code afin de bloquer les importations et les commandes système interdites, utiliser un délai d’expiration pour le sous-processus afin d’empêcher les exécutions incontrôlées et récupérer les graphiques générés sous forme de base64 pour les afficher.
Questions Fréquemment Posées
La leçon « Schéma d’interpréteur de code pour l’analyse de données » est-elle gratuite ?
Oui — le texte complet de « Schéma d’interpréteur de code pour l’analyse de données » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Schéma d’interpréteur de code pour l’analyse de données » ?
Exécution Python en bac à sable : exécutez pandas/matplotlib dans les outils de l’agent. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Agents ?
Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Schéma d’interpréteur de code pour l’analyse de données » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?
Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Schéma d’interpréteur de code pour l’analyse de données
- Outils d’agents pilotés par pandas
- Générer automatiquement des graphiques et visualisations
- Agents de synthèse statistique