0Pricing
AI Agents · درس

نمط Code Interpreter لتحليل البيانات

تنفيذ Python في بيئة معزولة: تشغيل pandas/matplotlib ضمن أدوات الوكيل

نمط Code Interpreter لتحليل البيانات درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.

نمط Code Interpreter

يتيح نمط Code Interpreter للوكيل إنشاء شيفرة Python للإجابة عن أسئلة تحليل البيانات، وتنفيذ تلك الشيفرة في بيئة معزولة، والتقاط المخرجات، ثم تفسير النتائج.

بدلًا من كتابة كل عملية تحليل بشكل ثابت، ينشئ الوكيل شيفرة مخصصة لكل سؤال، مما يمنحه مرونة كبيرة في مهام البيانات.

الحلقة الأساسية: الإنشاء ← التنفيذ ← التفسير

يتكون هذا النمط من ثلاث خطوات يمكن تكرارها:

  1. الإنشاء — يكتب LLM شيفرة Python للإجابة عن السؤال
  2. التنفيذ — يشغّل الشيفرة في بيئة معزولة، ويلتقط stdout والملفات
  3. التفسير — يمرّر المخرجات مرة أخرى إلى LLM لشرح النتائج
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'
))

مطالبة توليد التعليمات البرمجية

يجب أن تتضمن مطالبة توليد التعليمات البرمجية: مسار البيانات أو مخططها، والسؤال، والقيود (عدم استخدام واجهات API خارجية، واستخدام pandas، وحفظ المخططات في ملفات).

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

تنفيذ التعليمات البرمجية في عملية فرعية معزولة

أبسط بيئة معزولة هي تشغيل التعليمات البرمجية في عملية فرعية منفصلة مع تحديد مهلة زمنية. يوفّر ذلك عزلًا للعملية؛ فإذا تعطّلت التعليمات البرمجية، فلن يتسبب ذلك في تعطيل الوكيل.

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

بيئة E2B السحابية المعزولة

توفر E2B بيئة سحابية مُدارة ومعزولة لتنفيذ التعليمات البرمجية بأمان، وهي أكثر أمانًا من العملية الفرعية. وتُشغّل التعليمات البرمجية داخل حاوية معزولة مع إمكانية الوصول إلى نظام الملفات.

ثبّتها باستخدام 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 result

التقاط الملفات المُنشأة

قد تُنشئ التعليمات البرمجية مخططات أو ملفات CSV أو ملفات أخرى. التقط هذه الملفات من نظام ملفات البيئة المعزولة وأرسلها إلى الوكيل ليفسّرها أو يعرضها.

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 result

حلقة استعادة الأخطاء

غالبًا ما تحتوي التعليمات البرمجية المُنشأة على أخطاء عند تشغيلها للمرة الأولى. طبّق حلقة استعادة: أرسل الخطأ إلى LLM مع التعليمات البرمجية الأصلية، واطلب منه إصلاحه. حدّد عدد المحاولات من 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 errored

تفسير مخرجات التعليمات البرمجية

تحتاج مخرجات التعليمات البرمجية الخام (الأرقام والجداول) إلى تحويلها مرة أخرى إلى إجابة بلغة طبيعية. أرسل stdout إلى LLM واطلب منه شرح النتائج في سياق السؤال الأصلي.

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

قيود الأمان في توليد التعليمات البرمجية

يجب ألا تُجري التعليمات البرمجية المُنشأة اتصالات بالشبكة، أو تصل إلى ملفات حساسة، أو تنفّذ أوامر النظام. طبّق هذه القيود في المطالبة أيضًا، إلى جانب قيود البيئة المعزولة.

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

إدراج مخطط البيانات

يُنشئ LLM تعليمات برمجية أفضل عندما يعرف مخطط البيانات مسبقًا، بما في ذلك أسماء الأعمدة وأنواعها وصفوف نموذجية. أدرج وصف المخطط في مطالبة توليد التعليمات البرمجية.

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

تتبّع سجل التنفيذ

احتفظ بسجل لجميع عمليات تنفيذ التعليمات البرمجية في الجلسة. يتيح ذلك للوكيل الرجوع إلى النتائج السابقة، والبناء على العمليات الحسابية السابقة، وشرح خطوات تحليله للمستخدم.

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)

اختبار المعرفة

ما الميزة الرئيسية لاستخدام نمط مفسّر التعليمات البرمجية بدلًا من ترميز عمليات تحليل بيانات محددة مسبقًا كأدوات للوكيل؟

مراجعة: نمط مفسّر التعليمات البرمجية لتحليل البيانات

يتضمن نمط مفسّر التعليمات البرمجية: توليد تعليمات Python البرمجية (مع سياق المخطط وقيود الأمان) ← تنفيذها في بيئة معزولة (عملية فرعية أو E2B) ← التقاط stdout والملفات ← إعادة المحاولة عند حدوث أخطاء ← تفسير النتائج بلغة طبيعية.

تشمل الاعتبارات الرئيسية: إدراج مخطط البيانات لتحسين توليد التعليمات البرمجية، والتحقق المسبق من التعليمات البرمجية لمنع عمليات الاستيراد وأوامر shell المحظورة، واستخدام مهلة زمنية للعملية الفرعية لمنع التنفيذ الذي لا ينتهي، والتقاط المخططات المُنشأة بصيغة base64 لعرضها.

الأسئلة الشائعة

هل درس «نمط Code Interpreter لتحليل البيانات» مجاني؟

نعم — نص درس «نمط Code Interpreter لتحليل البيانات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.

ماذا ستتعلم في «نمط Code Interpreter لتحليل البيانات»؟

تنفيذ Python في بيئة معزولة: تشغيل pandas/matplotlib ضمن أدوات الوكيل تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟

لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «نمط Code Interpreter لتحليل البيانات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟

نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نمط Code Interpreter لتحليل البيانات
  2. أدوات وكلاء البيانات المعتمدة على Pandas
  3. إنشاء المخططات والتصورات آليًا
  4. وكلاء الملخصات الإحصائية
← العودة إلى AI Agents