تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

کار با Pickle در پایتون: از ذخیره و بازخوانی اشیاء پایتونی تا بازگردانی داده‌ها


۵ دی ۱۴۰۴

ماژول Pickle در پایتون ابزاری قدرتمند برای ذخیره و بازسازی داده‌ها است. با استفاده از Pickle، تقریبا می‌توان هر نوع شی پایتونی از توابع و کلاس‌ها تا ساختارهای پیچیده و تو در تو را به فرمت باینری تبدیل کرد و دوباره بازگرداند. این ویژگی، Pickle را به ابزاری ارزشمند برای مدیریت وضعیت برنامه‌ها، پایپلاین‌های داده و مدل‌های یادگیری ماشین تبدیل کرده است.

با این حال، باید توجه داشت که Pickle هنگام بازسازی داده‌ها قادر است کد پایتون اجرا کند، بنابراین استفاده از آن با داده‌ای ناشناس خطرناک است. در این مقاله؛ هم روش‌های استفاده ساده و هم تکنیک‌های پیشرفته برای امنیت و بهینه‌سازی عملکرد بررسی می‌شوند و جایگزین‌های مدرن برای کاربردهای مختلف معرفی می‌گردند.

در ادامه خواهید خواند:

  • نکات کلیدی
  • Pickle در پایتون چیست؟
  • ذخیره داده‌ها با Pickle Dump در پایتون
  • بازیابی داده‌ها با Pickle Load در پایتون
  • آشنایی با پروتکل‌های Pickle در پایتون
  • اصول و نکات امنیتی
  • امنیت پیشرفته پایتون: تهدیدات AI و ذخیره و بازخوانی امن داده‌ها
  • موارد استفاده پیشرفته از Pickle در پایتون
  • آشنایی با جایگزین‌های Pickle در پایتون
  • راهکارهای بهبود عملکرد
  • عیب‌یابی مشکلات متداول
  • کاربردهای واقعی
  • ادغام AI و یادگیری ماشین در پایتون
  • جمع بندی
Pickle در پایتون

نکات کلیدی

  • Pickle برای کارهای یادگیری ماشین و هوش مصنوعی عالی است: می‌توانید مدل‌ها را ذخیره کنید، پیش‌بینی‌ها را کش کنید و وضعیت آزمایش‌ها را حفظ کنید.
  • امنیت اهمیت زیادی دارد: هیچ‌گاه داده‌های ناشناس را با Pickle بازسازی نکنید؛ همواره اعتبارسنجی و بررسی صحت داده‌ها را انجام دهید.
  • جایگزین‌های مدرن هم وجود دارند: بسته به نیازتان، می‌توانید از فرمت‌هایی مانند JSON, MessagePack, Protocol Buffers یا Arrow استفاده کنید.
  • بهینه‌سازی عملکرد مهم است: از پروتکل 5 در پایتون 3.8 به بالا استفاده کنید، داده‌ها را فشرده کنید و عملکرد عملیات خود را بررسی و پروفایل کنید.
  • مناسب برای یکپارچه‌سازی با AI و مدل‌های زبانی بزرگ (LLM): خروجی مدل‌ها را کش کنید، تنظیمات را ذخیره کنید و نقاط بازگشت (checkpoints) را حفظ کنید.
  • استفاده در محیط تولید نیاز به برنامه‌ریزی دارد: منابع را پایش کنید، لاگ‌گیری مناسب انجام دهید و بهترین شیوه‌های بکاپ‌گیری را رعایت کنید.

Pickle در پایتون چیست؟

ماژول Pickle در پایتون برای ذخیره و بازخوانی اشیا پایتونی استفاده می‌شود. تقریبا هر شی پایتونی را می‌توان با Pickle ذخیره کرد، روی دیسک نوشت، از طریق شبکه منتقل کرد یا در پایگاه داده‌ها نگهداری نمود. این ماژول اشیا را به جریان‌های بایتی تبدیل می‌کند که شامل تمام اطلاعات لازم برای بازسازی همان شی در اسکریپت‌های دیگر پایتون است.

مزایای کلیدی Python Pickle:

  • حفظ ساختار و روابط بین اشیا
  • پشتیبانی از اشیا پیچیده، تو در تو و کلاس‌های سفارشی
  • ذخیره و بازخوانی سریع اشیا
  • بهینه‌سازی‌های خاص پایتون
  • مناسب برای ذخیره و کش کردن مدل‌های هوش مصنوعی و یادگیری ماشین

هشدار امنیتی: ماژول Pickle در برابر داده‌های مخرب امن نیست. هرگز داده‌های ناشناس یا غیرقابل اعتماد را با Pickle بازخوانی نکنید.

با هاست پایتون لیارا، اپلیکیشن‌های Python خود را روی بستر سریع، پایدار و امن اجرا کن.
✅ نصب فوری✅ منابع اختصاصی✅ دسترسی کامل SSH
خرید و راه‌اندازی هاست پایتون

ذخیره داده‌ها با Pickle Dump در پایتون

در این بخش می‌آموزید چگونه با استفاده از تابع pickle.dump() داده‌ها را در پایتون ذخیره کنید. این تابع سه آرگومان می‌گیرد: شی مورد نظر برای ذخیره، شی فایل در حالت نوشتن باینری و تعیین پروتکل اختیاری.

مثال ساده Pickle Dump

import pickle

# Take user input for data collection
number_of_data = int(input('Enter the number of data items: '))
data = []

# Collect input data
for i in range(number_of_data):
    raw = input(f'Enter data {i}: ')
    data.append(raw)

# Open file in write-binary mode
with open('important_data.pkl', 'wb') as file:
    # Dump data with highest protocol for best performance
    pickle.dump(data, file, protocol=pickle.HIGHEST_PROTOCOL)

print(f"Successfully saved {len(data)} items to important_data.pkl")
  • برای ذخیره داده‌ها از حالت 'wb' (نوشتن باینری) استفاده کنید.
  • استفاده از pickle.HIGHEST_PROTOCOL بهترین عملکرد را فراهم می‌کند.
  • همواره از مدیریت کننده‌های زمینه‌ای (context managers) مثل with برای کار با فایل استفاده کنید تا کار با فایل امن‌تر و ساده‌تر شود.

مثال پیشرفته Pickle Dump با اشیا سفارشی

در این مثال نشان داده می‌شود که چگونه می‌توان یک لیست از اشیا سفارشی در پایتون را با استفاده از ماژول Pickle در فایل ذخیره کرد. در این مثال، یک کلاس ساده User با دکوراتور @dataclass تعریف می‌کنیم، نمونه‌هایی از این کلاس ایجاد می‌کنیم و سپس آن‌ها را روی دیسک ذخیره می‌کنیم. این روش برای حفظ ساختارهای داده پیچیده مانند پروفایل کاربران یا اشیا مدل‌ها بسیار کاربردی است.

import pickle
from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int
    email: str

# Create custom objects
users = [
    User("Alice", 30, "[email protected]"),
    User("Bob", 25, "[email protected]")
]

# Save custom objects
with open('users.pkl', 'wb') as file:
    pickle.dump(users, file, protocol=pickle.HIGHEST_PROTOCOL)

print(f"Saved {len(users)} user objects")

با این روش، شما می‌توانید نه تنها داده‌های ساده بلکه اشیا پیچیده و سفارشی را ذخیره و بازخوانی اشیا پایتونی را کنید و از آن‌ها در برنامه‌های خود استفاده کنید.

هاست پایتون چیست؟ + راهنمای کامل خرید هاست Python
هاست پایتون

بازیابی داده‌ها با Pickle Load در پایتون

بازخوانی داده‌های ذخیره شده با Pickle، از تابع pickle.load() استفاده می‌کنیم. این تابع نیاز به یک شی فایل دارد که در حالت باینری ('rb') باز شده باشد.

مثال ساده Pickle Load

import pickle

# Open file in read-binary mode
with open('important_data.pkl', 'rb') as file:
    # Load the pickled data
    data = pickle.load(file)

print('Retrieved pickled data:')
for i, item in enumerate(data):
    print(f'Data {i}: {item}')

خروجی مورد انتظار:

OutputRetrieved pickled data:
Data 0: 123
Data 1: abc
Data 2: !@#$

بازگردانی اشیا سفارشی

در این مثال نشان داده می‌شود که چگونه می‌توان اشیا سفارشی پایتون را از فایل ذخیره شده با Pickle بارگذاری کرد. همانند مثال قبلی، یک کلاس ساده User با دکوراتور @dataclass تعریف می‌کنیم و نمونه‌هایی از این کلاس را روی دیسک ذخیره کرده‌ایم. این روش برای حفظ و استفاده دوباره از ساختارهای داده پیچیده مانند پروفایل کاربران یا اشیا مدل‌ها بسیار کاربردی است.

import pickle

# Load custom objects
with open('users.pkl', 'rb') as file:
    users = pickle.load(file)

print('Retrieved users:')
for user in users:
    print(f"- {user.name} ({user.age}): {user.email}")

با این روش، شما می‌توانید داده‌های ساده و همچنین اشیا پیچیده و سفارشی را به راحتی بازخوانی و در برنامه‌های خود استفاده کنید.

آشنایی با پروتکل‌های Pickle در پایتون

پروتکل‌های Pickle فرمت ذخیره و بازخوانی اشیا پایتونی را تعیین می‌کنند. انتخاب پروتکل مناسب بستگی به نسخه پایتون، نیاز به سازگاری بین نسخه‌ها و اولویت‌های عملکردی شما دارد. جدول زیر مقایسه‌ای روشن و کوتاه از پروتکل‌ها ارائه می‌دهد:

پروتکلنسخه پایتونکاراییسازگاریموارد استفاده در AI/ML
Protocol 02.3+کندترینمتن‌خوان ASCII (قابل خواندن برای انسان)فقط سیستم‌های قدیمی
Protocol 12.3+کندفرمت باینریفقط سیستم‌های قدیمی
Protocol 22.3+متوسطپشتیبانی از کلاس‌های جدیدسازگاری میان نسخه‌ها
Protocol 33.0+سریعفقط پایتون 3برنامه‌های مدرن پایتون 3
Protocol 43.4+سریع‌ترپشتیبانی از اشیا بزرگمدل‌های بزرگ ML، داده‌های حجیم
Protocol 53.8+سریع‌ترینپشتیبانی از داده‌های خارج از باند (out-of-band)سیستم‌های تولیدی AI با نیاز عملکرد بالا

راهنمای انتخاب پروتکل

چند راهنمای ساده و عملی برای انتخاب پروتکل:

  • اگر می‌خواهید حداکثر سازگاری با نسخه‌های قدیمی (مثلا پایتون 2.7+) را حفظ کنید، از پروتکل 2 استفاده کنید.
  • در برنامه‌های مبتنی بر پایتون 3، اگر سرعت و کارایی برای شما اهمیت دارد، بهتر است از pickle.HIGHEST_PROTOCOL استفاده کنید.
  • اگر نیاز به یک نسخه مشخص دارید، صراحتا آن پروتکل را تعیین کنید (مثلا protocol=4).
  • در سیستم‌های تولیدی AI/ML (به‌خصوص سیستم‌های 2025 به بعد) بهتر است از بالاترین پروتکل و تنظیمات بهینه بهره ببرید تا هم سرعت و هم پشتیبانی از اشیا بزرگ تضمین شود.

مثال‌های متداول:

import pickle

# For maximum compatibility (Python 2.7+)
pickle.dump(data, file, protocol=2)

# For Python 3 only, best performance
pickle.dump(data, file, protocol=pickle.HIGHEST_PROTOCOL)

# For specific protocol version
pickle.dump(data, file, protocol=4)

# For AI/ML production systems (2025+)
pickle.dump(data, file, protocol=pickle.HIGHEST_PROTOCOL)

اصول و نکات امنیتی

Pickle به‌طور ذاتی ناامن است. برای کاهش ریسک‌ها حتما نکات زیر را رعایت کنید.

بهترین کتابخانه‌های پایتون برای هوش مصنوعی
کتابخانه‌ برای هوش مصنوعی

1. هرگز داده غیر قابل اعتماد را بازخوانی نکنید

بازخوانی داده‌های ناشناس با pickle.load() می‌تواند باعث اجرای کد مخرب روی سیستم شما شود. بنابراین هیچگاه چنین داده‌هایی را بدون اطمینان از منبع آن‌ها باز نکنید.

# DANGEROUS - Never do this
with open('untrusted_file.pkl', 'rb') as file:
    data = pickle.load(file)  # Security risk!

# SAFE - Only unpickle trusted sources
if is_trusted_source(file_path):
    with open(file_path, 'rb') as file:
        data = pickle.load(file)

2. برای انتقال روی شبکه از جایگزین‌های امن استفاده کنید

ارسال مستقیم داده Pickle روی شبکه خطرناک است. بهتر است برای انتقال بین سرویس‌ها از فرمت‌هایی استفاده کنید که قابلیت اعتبارسنجی امضای پیام یا رمزنگاری را دارند.

# Avoid sending pickle over networks
# pickle.dumps(data)  # Security risk

# Use secure alternatives
import json
import base64
import hmac

def secure_serialize(data, secret_key):
    json_data = json.dumps(data)
    signature = hmac.new(secret_key.encode(), json_data.encode(), 'sha256').hexdigest()
    return base64.b64encode(json_data.encode()).decode(), signature

3. قبل از بازخوانی اعتبارسنجی کنید

قبل از بازخوانی یک فایل، اندازه آن و دسترسی‌های فایل را بررسی کنید تا از حملات مبتنی بر فایل‌های بزرگ یا دسترسی‌های نامناسب جلوگیری شود.

import os
import pickle

def safe_unpickle(file_path, max_size_mb=10):
    """Safely unpickle with size and source validation"""
    
    # Check file size
    if os.path.getsize(file_path) > max_size_mb * 1024 * 1024:
        raise ValueError(f"File too large: {file_path}")
    
    # Check file permissions
    if not os.access(file_path, os.R_OK):
        raise PermissionError(f"Cannot read file: {file_path}")
    
    with open(file_path, 'rb') as file:
        return pickle.load(file)

امنیت پیشرفته پایتون: تهدیدات AI و ذخیره و بازخوانی امن داده‌ها

سیستم‌های مدرن هوش مصنوعی می‌توانند از آسیب‌پذیری‌های Pickle به شکل‌های پیچیده‌تری سوءاستفاده کنند. این بخش، روش‌های امنیتی به‌روز برای سال 2025 و بعد از آن را پوشش می‌دهد.

درک آسیب‌پذیری‌های قابل سوءاستفاده توسط AI

نمونه زیر یک الگوی خطرناک را نشان می‌دهد؛ داده مخرب Pickle می‌تواند هنگام بازخوانی، اجرای کد دلخواه را موجب شود و سیستم‌های AI قادرند چنین payload‌هایی را به‌صورت خودکار تولید یا تغییر دهند (مثلا حذف فایل‌ها، دسترسی شبکه‌ای، اجرای پروسس و ارتقای دسترسی).

# DANGEROUS - AI can exploit this pattern
import pickle
import os

# Malicious pickle payload that AI systems can generate
class MaliciousPayload:
    def __reduce__(self):
        return (os.system, ('rm -rf /',))  # Destructive command

# If this gets unpickled, it executes arbitrary code
malicious_data = pickle.dumps(MaliciousPayload())

# AI systems can generate variations of this attack
# - File system manipulation
# - Network access
# - Process creation
# - Memory corruption
# - Privilege escalation

1. چگونه ذخیره و بازخوانی امن با لایه‌های اعتبارسنجی انجام دهیم

در این بخش یک الگوی امن‌تر نشان داده شده که قبل از ذخیره یا بازخوانی، چندلایه اعتبارسنجی انجام می‌دهد: بررسی نوع‌ها، بررسی یکپارچگی، اعتبارسنجی منبع و محدودیت عمق داده‌ها. این الگو به‌صورت یک کلاس قابل استفاده مجدد ارائه شده است.

import pickle
import hashlib
import hmac
import json
from typing import Any, Dict, Optional
from dataclasses import dataclass
from datetime import datetime

@dataclass
class SecurePickleWrapper:
    """Secure wrapper for pickle operations with validation"""
    
    def __init__(self, secret_key: str, allowed_classes: set = None):
        self.secret_key = secret_key.encode()
        self.allowed_classes = allowed_classes or {
            'builtins.dict', 'builtins.list', 'builtins.str',
            'builtins.int', 'builtins.float', 'builtins.bool',
            'builtins.tuple', 'builtins.set', 'builtins.frozenset'
        }
        self.trusted_sources = set()
    
    def secure_dump(self, obj: Any, file_path: str, metadata: Dict = None) -> bool:
        """Securely dump object with integrity checks"""
        try:
            # Validate object before serialization
            if not self._validate_object_safety(obj):
                raise ValueError("Object contains potentially unsafe elements")
            
            # Create secure wrapper
            secure_data = {
                'data': obj,
                'metadata': metadata or {},
                'timestamp': datetime.now().isoformat(),
                'checksum': self._calculate_checksum(obj),
                'version': '2.0'
            }
            
            # Serialize with integrity
            with open(file_path, 'wb') as file:
                pickle.dump(secure_data, file, protocol=pickle.HIGHEST_PROTOCOL)
            
            return True
            
        except Exception as e:
            print(f"Secure dump failed: {e}")
            return False
    
    def secure_load(self, file_path: str, source_validation: bool = True) -> Optional[Any]:
        """Securely load object with comprehensive validation"""
        try:
            # Source validation
            if source_validation and not self._validate_source(file_path):
                raise SecurityError("Source not trusted")
            
            # Load and validate
            with open(file_path, 'rb') as file:
                secure_data = pickle.load(file)
            
            # Validate structure
            if not self._validate_secure_structure(secure_data):
                raise SecurityError("Invalid secure structure")
            
            # Verify checksum
            if not self._verify_checksum(secure_data['data'], secure_data['checksum']):
                raise SecurityError("Data integrity compromised")
            
            # Validate timestamp (prevent replay attacks)
            if not self._validate_timestamp(secure_data['timestamp']):
                raise SecurityError("Data timestamp invalid")
            
            return secure_data['data']
            
        except Exception as e:
            print(f"Secure load failed: {e}")
            return None
    
    def _validate_object_safety(self, obj: Any, depth: int = 0) -> bool:
        """Recursively validate object safety"""
        if depth > 10:  # Prevent infinite recursion
            return False
        
        obj_type = type(obj).__name__
        module_name = type(obj).__module__
        full_name = f"{module_name}.{obj_type}"
        
        # Check if class is allowed
        if full_name not in self.allowed_classes:
            return False
        
        # Recursively check nested objects
        if isinstance(obj, (dict, list, tuple, set)):
            for item in obj:
                if not self._validate_object_safety(item, depth + 1):
                    return False
        
        return True
    
    def _calculate_checksum(self, obj: Any) -> str:
        """Calculate cryptographic checksum of object"""
        obj_bytes = pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL)
        return hashlib.sha256(obj_bytes).hexdigest()
    
    def _verify_checksum(self, obj: Any, expected_checksum: str) -> bool:
        """Verify object integrity"""
        actual_checksum = self._calculate_checksum(obj)
        return hmac.compare_digest(actual_checksum, expected_checksum)
    
    def _validate_timestamp(self, timestamp_str: str) -> bool:
        """Validate timestamp to prevent replay attacks"""
        try:
            timestamp = datetime.fromisoformat(timestamp_str)
            now = datetime.now()
            # Allow 24-hour window
            return abs((now - timestamp).total_seconds()) < 86400
        except:
            return False
    
    def _validate_source(self, file_path: str) -> bool:
        """Validate file source"""
        # Add your source validation logic here
        # Example: Check file path, permissions, digital signatures
        return True
    
    def _validate_secure_structure(self, data: Dict) -> bool:
        """Validate secure data structure"""
        required_keys = {'data', 'metadata', 'timestamp', 'checksum', 'version'}
        return all(key in data for key in required_keys)

class SecurityError(Exception):
    """Custom security exception"""
    pass

# Usage example
secure_pickle = SecurePickleWrapper("your-secret-key-here")
safe_data = {"user": "alice", "score": 100}

# Secure dump
secure_pickle.secure_dump(safe_data, "secure_data.pkl", {"description": "user data"})

# Secure load
loaded_data = secure_pickle.secure_load("secure_data.pkl")

2. چگونه با استفاده از اعتبارسنجی اسکیمای داده، در برابر حملات AI مقاوم شویم

در این بخش، اعتبارسنجی ساختار داده پیاده‌سازی شده تا داده‌ها از نظر نوع، طول، عمیق و کلیدها بررسی شوند و تنها در صورت تطابق با اسکیمای تعریف شده، ذخیره انجام شود. این کار احتمال تزریق یا ساخت payload مخرب را کاهش می‌دهد.

import pickle
import json
import jsonschema
from typing import Any, Dict, List, Union
from dataclasses import dataclass, asdict

@dataclass
class SafeDataSchema:
    """Schema for safe data serialization"""
    
    # Define allowed data types
    ALLOWED_TYPES = {
        'string': str,
        'integer': int,
        'float': float,
        'boolean': bool,
        'array': list,
        'object': dict
    }
    
    # Define maximum limits
    MAX_STRING_LENGTH = 10000
    MAX_ARRAY_LENGTH = 1000
    MAX_OBJECT_KEYS = 100
    MAX_DEPTH = 5

class SchemaValidator:
    """JSON Schema validator for safe serialization"""
    
    def __init__(self):
        self.schemas = {}
        self._load_default_schemas()
    
    def _load_default_schemas(self):
        """Load default safe schemas"""
        self.schemas['user_data'] = {
            "type": "object",
            "properties": {
                "name": {"type": "string", "maxLength": 100},
                "age": {"type": "integer", "minimum": 0, "maximum": 150},
                "email": {"type": "string", "format": "email", "maxLength": 254},
                "preferences": {
                    "type": "array",
                    "items": {"type": "string"},
                    "maxItems": 50
                }
            },
            "required": ["name", "age"],
            "additionalProperties": False
        }
    
    def validate_and_serialize(self, data: Any, schema_name: str, use_pickle: bool = False) -> bytes:
        """Validate data against schema and serialize safely"""
        
        # Validate against schema
        if schema_name in self.schemas:
            jsonschema.validate(data, self.schemas[schema_name])
        
        # Additional safety checks
        self._deep_validate(data)
        
        # Choose serialization method
        if use_pickle:
            return self._safe_pickle_dump(data)
        else:
            return self._safe_json_dump(data)
    
    def _deep_validate(self, obj: Any, depth: int = 0):
        """Deep validation of object structure"""
        if depth > SafeDataSchema.MAX_DEPTH:
            raise ValueError("Object too deeply nested")
        
        if isinstance(obj, str) and len(obj) > SafeDataSchema.MAX_STRING_LENGTH:
            raise ValueError("String too long")
        
        if isinstance(obj, list):
            if len(obj) > SafeDataSchema.MAX_ARRAY_LENGTH:
                raise ValueError("Array too long")
            for item in obj:
                self._deep_validate(item, depth + 1)
        
        if isinstance(obj, dict):
            if len(obj) > SafeDataSchema.MAX_OBJECT_KEYS:
                raise ValueError("Object has too many keys")
            for key, value in obj.items():
                if not isinstance(key, str):
                    raise ValueError("Dictionary keys must be strings")
                self._deep_validate(value, depth + 1)
    
    def _safe_pickle_dump(self, data: Any) -> bytes:
        """Safe pickle serialization with protocol restrictions"""
        # Use only safe protocols
        return pickle.dumps(data, protocol=2)  # Protocol 2 for compatibility
    
    def _safe_json_dump(self, data: Any) -> bytes:
        """Safe JSON serialization"""
        return json.dumps(data, ensure_ascii=False).encode('utf-8')

# Usage
validator = SchemaValidator()
user_data = {
    "name": "Alice",
    "age": 30,
    "email": "[email protected]",
    "preferences": ["python", "ai", "security"]
}

# Safe serialization
try:
    safe_bytes = validator.validate_and_serialize(user_data, "user_data", use_pickle=False)
    print("Data safely serialized")
except Exception as e:
    print(f"Validation failed: {e}")

3. چگونه یک سریال‌سازی امن در سطح سازمانی انجام دهیم

در محیط سازمانی، علاوه بر اعتبارسنجی و چک‌سام، باید داده‌ها را رمزگذاری، امضا و مهر زمانی کنید تا در صورت سرقت یا تغییر بتوانید آن را تشخیص دهید. در این بخش یک نمونه با رمزنگاری و امضا ارائه شده است.

import pickle
import cryptography
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import base64
import os
import json
from typing import Any, Dict, Optional

class EnterpriseSecureSerializer:
    """Enterprise-grade secure serialization with encryption and signatures"""
    
    def __init__(self, master_key: str, organization_id: str):
        self.organization_id = organization_id
        self.master_key = master_key.encode()
        self.encryption_key = self._derive_encryption_key()
        self.cipher = Fernet(self.encryption_key)
        
    def _derive_encryption_key(self) -> bytes:
        """Derive encryption key from master key"""
        salt = b'enterprise_salt_2025'  # In production, use random salt
        kdf = PBKDF2HMAC(
            algorithm=hashes.SHA256(),
            length=32,
            salt=salt,
            iterations=100000,
        )
        return base64.urlsafe_b64encode(kdf.derive(self.master_key))
    
    def secure_serialize(self, data: Any, metadata: Dict = None) -> Dict[str, Any]:
        """Securely serialize data with enterprise-grade security"""
        
        # Create secure envelope
        envelope = {
            'version': '3.0',
            'organization_id': self.organization_id,
            'timestamp': datetime.now().isoformat(),
            'metadata': metadata or {},
            'data_hash': self._calculate_data_hash(data),
            'encrypted_data': None,
            'signature': None
        }
        
        # Encrypt the data
        pickled_data = pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)
        encrypted_data = self.cipher.encrypt(pickled_data)
        envelope['encrypted_data'] = base64.b64encode(encrypted_data).decode()
        
        # Sign the envelope
        envelope['signature'] = self._sign_envelope(envelope)
        
        return envelope
    
    def secure_deserialize(self, envelope: Dict[str, Any]) -> Optional[Any]:
        """Securely deserialize data with verification"""
        
        try:
            # Verify signature
            if not self._verify_signature(envelope):
                raise SecurityError("Envelope signature verification failed")
            
            # Verify timestamp (prevent replay attacks)
            if not self._verify_timestamp(envelope['timestamp']):
                raise SecurityError("Envelope timestamp verification failed")
            
            # Decrypt data
            encrypted_data = base64.b64decode(envelope['encrypted_data'])
            decrypted_data = self.cipher.decrypt(encrypted_data)
            
            # Verify data hash
            data = pickle.loads(decrypted_data)
            if not self._verify_data_hash(data, envelope['data_hash']):
                raise SecurityError("Data integrity verification failed")
            
            return data
            
        except Exception as e:
            print(f"Secure deserialization failed: {e}")
            return None
    
    def _calculate_data_hash(self, data: Any) -> str:
        """Calculate SHA-256 hash of data"""
        pickled_data = pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)
        return hashlib.sha256(pickled_data).hexdigest()
    
    def _sign_envelope(self, envelope: Dict[str, Any]) -> str:
        """Sign envelope with HMAC"""
        # Remove signature field for signing
        signing_data = {k: v for k, v in envelope.items() if k != 'signature'}
        signing_string = json.dumps(signing_data, sort_keys=True)
        return hmac.new(self.master_key, signing_string.encode(), hashlib.sha256).hexdigest()
    
    def _verify_signature(self, envelope: Dict[str, Any]) -> bool:
        """Verify envelope signature"""
        expected_signature = envelope['signature']
        actual_signature = self._sign_envelope(envelope)
        return hmac.compare_digest(expected_signature, actual_signature)
    
    def _verify_timestamp(self, timestamp_str: str) -> bool:
        """Verify timestamp validity"""
        try:
            timestamp = datetime.fromisoformat(timestamp_str)
            now = datetime.now()
            # Allow 1-hour window for enterprise use
            return abs((now - timestamp).total_seconds()) < 3600
        except:
            return False
    
    def _verify_data_hash(self, data: Any, expected_hash: str) -> bool:
        """Verify data hash integrity"""
        actual_hash = self._calculate_data_hash(data)
        return hmac.compare_digest(actual_hash, expected_hash)

# Enterprise usage example
enterprise_serializer = EnterpriseSecureSerializer("master-key-2025", "org-12345")

# Secure serialization
sensitive_data = {"api_keys": ["key1", "key2"], "config": {"debug": False}}
secure_envelope = enterprise_serializer.secure_serialize(sensitive_data, {"department": "AI"})

# Secure deserialization
recovered_data = enterprise_serializer.secure_deserialize(secure_envelope)

4. ملاحظات امنیتی خاص AI

سیستم‌های AI می‌توانند کد یا داده‌های تولید شده را طوری بسازند که حاوی الگوهای خطرناک باشند. در این بخش یک اعتبارسنج مخصوص AI معرفی شده که کد تولیدی AI را آنالیز می‌کند و الگوهای ممنوعه را رد می‌کند.

import pickle
import inspect
import ast
from typing import Any, Set, List

class AISecurityValidator:
    """AI-specific security validation for pickle operations"""
    
    def __init__(self):
        self.forbidden_patterns = {
            'os.system', 'os.popen', 'subprocess.call',
            'eval', 'exec', 'compile', 'input',
            'open', 'file', '__import__', 'globals',
            'locals', 'vars', 'dir', 'type'
        }
        
        self.safe_modules = {
            'math', 'random', 'datetime', 'json',
            'collections', 'itertools', 'functools'
        }
    
    def validate_ai_generated_code(self, code_string: str) -> bool:
        """Validate AI-generated code for safety"""
        try:
            # Parse code safely
            tree = ast.parse(code_string)
            
            # Check for dangerous patterns
            for node in ast.walk(tree):
                if isinstance(node, ast.Call):
                    if self._is_dangerous_call(node):
                        return False
                
                if isinstance(node, ast.Import):
                    if not self._is_safe_import(node):
                        return False
                
                if isinstance(node, ast.ImportFrom):
                    if not self._is_safe_import_from(node):
                        return False
            
            return True
            
        except SyntaxError:
            return False
    
    def _is_dangerous_call(self, node: ast.Call) -> bool:
        """Check if function call is dangerous"""
        if isinstance(node.func, ast.Name):
            return node.func.id in self.forbidden_patterns
        
        if isinstance(node.func, ast.Attribute):
            return f"{node.func.value.id}.{node.func.attr}" in self.forbidden_patterns
        
        return False
    
    def _is_safe_import(self, node: ast.Import) -> bool:
        """Check if import is safe"""
        for alias in node.names:
            if alias.name not in self.safe_modules:
                return False
        return True
    
    def _is_safe_import_from(self, node: ast.ImportFrom) -> bool:
        """Check if import from is safe"""
        if node.module not in self.safe_modules:
            return False
        return True
    
    def safe_ai_serialization(self, data: Any, ai_source: str = None) -> bytes:
        """Safe serialization for AI-generated content"""
        
        # Additional validation for AI sources
        if ai_source and ai_source.startswith('ai_'):
            if not self._validate_ai_data_safety(data):
                raise SecurityError("AI-generated data failed safety validation")
        
        # Use restricted pickle protocol
        return pickle.dumps(data, protocol=2)
    
    def _validate_ai_data_safety(self, data: Any) -> bool:
        """Validate AI-generated data for safety"""
        # Implement AI-specific validation logic
        # This could include checking for:
        # - Suspicious patterns
        # - Unusual data structures
        # - Potential injection attempts
        
        return True

# AI security usage
ai_validator = AISecurityValidator()

# Validate AI-generated code
ai_code = "import math\nresult = math.sqrt(16)"
if ai_validator.validate_ai_generated_code(ai_code):
    print("AI code is safe")
else:
    print("AI code contains dangerous patterns")

# Safe AI serialization
ai_data = {"algorithm": "neural_network", "parameters": {"layers": 3}}
safe_bytes = ai_validator.safe_ai_serialization(ai_data, "ai_gpt4")

5. برخی ملاحظات کلی امنیتی مخصوص AI

بهترین روش امنیتیتوضیح
هیچ‌وقت داده‌های غیرقابل اعتماد را بارگذاری نکنیدسیستم‌های هوش مصنوعی می‌توانند بارهای حمله (Payload) پیچیده‌ای تولید کنند.
از اعتبارسنجی ساختار داده (Schema Validation) استفاده کنیدقبل از سریال‌سازی، مطمئن شوید ساختار داده معتبر است.
کنترل صحت داده (Integrity Checks) را پیاده‌سازی کنیدبرای تضمین سلامت داده‌ها از هش‌ها و امضاهای رمزنگاری‌شده استفاده کنید.
رمزگذاری داده‌های حساسبرای محیط‌های عملیاتی از رمزگذاری سطح سازمانی استفاده کنید.
اعتبارسنجی محتوای تولیدشده توسط هوش مصنوعیسیستم‌های هوش مصنوعی می‌توانند محتوای مخرب ایجاد کنند؛ همیشه این داده‌ها را بررسی کنید.
محدود کردن استفاده از پروتکل‌هااستفاده از پروتکل‌های امن‌تر (مثل Protocol 2) ریسک را کاهش می‌دهد.
اعتبارسنجی منبع دادهقبل از ذخیره یا بارگذاری داده‌ها، منبع و سطح دسترسی بررسی شود.
اعتبارسنجی زمان (Timestamp Validation)با بررسی زمان، می‌توان از حملات تکراری (Replay Attacks) جلوگیری کرد.
استفاده از جایگزین‌های امنبه جای Pickle از فرمت‌های امن‌تر مثل JSON, MessagePack یا Protocol Buffers استفاده کنید.
ممیزی امنیتی منظمآسیب‌پذیری‌های جدید Pickle را زیر نظر داشته باشید و روش‌های امنیتی را به‌روزرسانی کنید.

پشته امنیتی پیشنهادی برای 2025

پیشنهاد پیکربندی برای محیط تولیدی که هر مولفه به یک نگرانی امنیتی پاسخ می‌دهد:

# Production security stack
security_config = {
    'encryption': 'AES-256-GCM',
    'signing': 'HMAC-SHA256',
    'validation': 'JSON Schema + Custom Rules',
    'protocol': 'pickle Protocol 2 (max compatibility)',
    'alternatives': ['JSON', 'MessagePack', 'Protocol Buffers'],
    'monitoring': 'Real-time vulnerability scanning',
    'updates': 'Automated security patch management'
}

موارد استفاده پیشرفته از Pickle در پایتون

علاوه بر استفاده‌های پایه‌ای، کتابخانه‌ی Pickle امکاناتی دارد که در شرایط خاص بسیار کاربردی می‌شوند. این امکانات بیشتر برای پروژه‌هایی به کار می‌آیند که با حجم بالای داده سروکار دارند یا نیازمند مدیریت حرفه‌ای خطا هستند. در ادامه به چند مورد مهم از این کاربردهای پیشرفته می‌پردازیم.

نحوه ساخت محیط توسعه پایتون در سرور مجازی
 ساخت محیط توسعه پایتون

ذخیره‌سازی اشیای بزرگ (Streaming Large Objects)

در این بخش نشان داده می‌شود چگونه می‌توان اشیای بزرگ پایتونی را به‌صورت بهینه ذخیره و بازخوانی کرد و هم‌زمان گزینه‌ای برای فشرده‌سازی (compression) ارائه داد. فشرده‌سازی می‌تواند حجم فایل را به‌طور چشمگیری کاهش دهد و برای نگهداری یا انتقال دیتاست‌های بزرگ بسیار مفید است. نکات کاربردی:

  • استفاده از gzip باعث می‌شود فایل‌های تولیدی حجیم کمتر شوند و انتقال/ ذخیره‌سازی سریع‌تر و ارزان‌تر شود.
  • هنگام بازخوانی فایل‌های فشرده دقت کنید که همان پارامتر compress را مطابق زمان ذخیره‌سازی انتخاب کنید.
  • اگر با داده‌های حساس کار می‌کنید، پیش از ذخیره‌سازی فشرده‌سازی اعتبارسنجی و ایمن‌سازی داده‌ها را انجام دهید.
import pickle
import gzip

def pickle_large_object(obj, file_path, compress=True):
    """Efficiently pickle large objects with optional compression"""
    
    if compress:
        with gzip.open(file_path, 'wb') as file:
            pickle.dump(obj, file, protocol=pickle.HIGHEST_PROTOCOL)
    else:
        with open(file_path, 'wb') as file:
            pickle.dump(obj, file, protocol=pickle.HIGHEST_PROTOCOL)

def unpickle_large_object(file_path, compress=True):
    """Load large pickled objects"""
    
    if compress:
        with gzip.open(file_path, 'rb') as file:
            return pickle.load(file)
    else:
        with open(file_path, 'rb') as file:
            return pickle.load(file)

ذخیره‌سازی همراه با مدیریت خطا (Pickling with Error Handling)

این بخش روش‌هایی را نشان می‌دهد که چگونه خطاهای احتمالی هنگام ذخیره و بازخوانی اشیا پایتونی را مدیریت کنید تا برنامه‌تان پایدار بماند و در مواجهه با خطاها (مثل خطاهای IO یا خطاهای مربوط به خود pickle) رفتار کنترل شده‌ای داشته باشید. نکات کاربردی:

  • لاگ‌گیری (logging) کمک می‌کند خطاها بعدا تحلیل شوند و علت مشکل مشخص گردد.
  • دسته‌بندی انواع استثناها (PicklingError, UnpicklingError, EOFError, FileNotFoundError, و غیره) باعث می‌شود واکنش مناسب‌تری به هر خطا داشته باشید.
  • در سیستم‌های تولیدی، علاوه بر لاگ، می‌توان از مکانیزم retry، بکاپ و هشداردهی خودکار استفاده کرد.
import pickle
import logging

def robust_pickle_dump(obj, file_path):
    """Pickle with comprehensive error handling"""
    
    try:
        with open(file_path, 'wb') as file:
            pickle.dump(obj, file, protocol=pickle.HIGHEST_PROTOCOL)
        logging.info(f"Successfully pickled object to {file_path}")
        return True
        
    except (pickle.PicklingError, OSError) as e:
        logging.error(f"Failed to pickle object: {e}")
        return False
    except Exception as e:
        logging.error(f"Unexpected error during pickling: {e}")
        return False

def robust_pickle_load(file_path):
    """Load pickle with error handling"""
    
    try:
        with open(file_path, 'rb') as file:
            return pickle.load(file)
            
    except (pickle.UnpicklingError, EOFError) as e:
        logging.error(f"Failed to unpickle {file_path}: {e}")
        return None
    except FileNotFoundError:
        logging.error(f"File not found: {file_path}")
        return None

آشنایی با جایگزین‌های Pickle در پایتون

برای ذخیره و بازخوانی اشیا پایتونی می‌توانید بسته به نیازتان یکی از گزینه‌های زیر را در نظر بگیرید:

1. JSON

import json

# Serialization
data = {"name": "Alice", "age": 30, "skills": ["Python", "Data Science"]}
with open('data.json', 'w') as file:
    json.dump(data, file, indent=2)

# Deserialization
with open('data.json', 'r') as file:
    loaded_data = json.load(file)

مزایا:

  • خوانا برای انسان،
  • مستقل از زبان برنامه‌نویسی،
  • امن‌تر نسبت به Pickle برای داده‌های ساده.

معایب:

  • پشتیبانی از انواع داده محدود است (مثلا سفارشی را مستقیم پشتیبانی نمی‌کند)،
  • برای بعضی ساختارهای پیچیده نیاز به تبدیل دستی دارید.

2. بسته پیام

import msgpack

# Serialization
data = {"name": "Alice", "age": 30}
with open('data.msgpack', 'wb') as file:
    file.write(msgpack.packb(data))

# Deserialization
with open('data.msgpack', 'rb') as file:
    loaded_data = msgpack.unpackb(file.read())

مزایا:

  • سریع و کم حجم،
  • مستقل از زبان، مناسب وقتی بین سرویس‌های مختلف ارتباط دارید.

معایب:

  • پشتیبانی از تمام نوع‌های خاص پایتون محدودتر است (ممکن است برای اشیا سفارشی نیاز به تبدیل داشته باشید).

3. بافرهای پروتکل

# Requires protobuf installation: pip install protobuf
import person_pb2

# Create protobuf message
person = person_pb2.Person()
person.name = "Alice"
person.age = 30

# Serialize
with open('person.pb', 'wb') as file:
    file.write(person.SerializeToString())

مزایا:

  • مبتنی بر اسکیمای مشخص، ساختار داده از قبل تعریف می‌شود،
  • بسیار کارا و مناسب برای ارتباط بین سرویس‌ها در محیط‌های چندزبانه و تولیدی.

معایب:

  • نیاز به تعریف اسکیمای جداگانه و یک مرحله کامپایل/ تولید فایل‌های پیام (پیچیده‌تر در راه‌اندازی)،
  • کمی پیچیده‌تر برای پیاده‌سازی نسبت به JSON.

راهکارهای بهبود عملکرد

این بخش نشان می‌دهد چگونه می‌توان عملکرد روش‌های مختلف سریال‌سازی را مقایسه کرد. در این مثال، یک تابع ارائه شده است که سریال‌سازی یک ساختار نمونه را با استفاده از pickle, JSON و MessagePack اندازه‌گیری می‌کند. نتایج در کنسول چاپ می‌شوند و زمان صرف شده برای هر روش نمایش داده‌ می‌شود.

import time
import pickle
import json
import msgpack

def benchmark_serialization(data, iterations=1000):
    """Benchmark different serialization methods"""
    
    # Pickle
    start_time = time.time()
    for _ in range(iterations):
        pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)
    pickle_time = time.time() - start_time
    
    # JSON
    start_time = time.time()
    for _ in range(iterations):
        json.dumps(data)
    json_time = time.time() - start_time
    
    # MessagePack
    start_time = time.time()
    for _ in range(iterations):
        msgpack.packb(data)
    msgpack_time = time.time() - start_time
    
    return {
        'pickle': pickle_time,
        'json': json_time,
        'msgpack': msgpack_time
    }

# Test with sample data
test_data = {
    'numbers': list(range(1000)),
    'strings': [f'string_{i}' for i in range(100)],
    'nested': {'level1': {'level2': {'level3': 'value'}}}
}

results = benchmark_serialization(test_data)
for method, time_taken in results.items():
    print(f"{method.capitalize()}: {time_taken:.4f} seconds")

عیب‌یابی مشکلات متداول

این بخش رایج‌ترین مشکلاتی که هنگام استفاده از Pickle رخ می‌دهند را بررسی می‌کند و راهکارهایی برای حل آن‌ها ارائه می‌دهد.

1. خطای AttributeError هنگام Unpickle کردن

مشکل: تعریف کلاس از زمان سریال‌سازی تغییر کرده است.

class OldUser:
    def __init__(self, name, age):
        self.name = name
        self.age = age

راه حل: برای حفظ سازگاری با نسخه‌های قبلی، فیلدهای جدید را با مقدار پیش‌فرض اضافه کنید.

class User:
    def __init__(self, name, age, email=None):
        self.name = name
        self.age = age
        self.email = email  # فیلد جدید با مقدار پیش‌فرض

2. مشکلات سازگاری پروتکل

مشکل: نسخه پروتکل سریال‌سازی با نسخه‌ای که می‌خواهید باز کنید مطابقت ندارد.

# Problem: Protocol version mismatch
try:
    with open('data.pkl', 'rb') as file:
        data = pickle.load(file)
except ValueError as e:
    if "unsupported pickle protocol" in str(e):
        print("Protocol version mismatch. Try using a compatible protocol.")

3. مشکلات حافظه هنگام کار با فایل‌های بزرگ

برای فایل‌های بزرگ، می‌توان از Memory Mapping استفاده کرد تا حافظه به شکل بهینه‌تری مدیریت شود.

import pickle
import mmap

def load_large_pickle(file_path):
    """Load large pickle files using memory mapping"""
    
    with open(file_path, 'rb') as file:
        # Memory map the file for efficient loading
        mm = mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ)
        return pickle.load(mm)

این بخش به شما کمک می‌کند مشکلات رایج هنگام بازکردن یا بارگذاری داده‌های pickle را شناسایی و رفع کنید، از جمله تغییر کلاس‌ها، ناسازگاری پروتکل و مدیریت فایل‌های بزرگ.

کاربردهای واقعی

این بخش به کاربردهای عملی ماژول Pickle در پایتون می‌پردازد. از ذخیره‌سازی مدل‌های یادگیری ماشین، مدیریت نشست‌ها (Session)، تا مدیریت پیکربندی (Configuration) را پوشش می‌دهد. هر زیر بخش شامل مثال‌های کد و توضیحاتی است که به شما کمک می‌کند این تکنیک‌ها را به‌صورت ایمن و بهینه استفاده کنید.

1. ذخیره و بازیابی مدل‌های یادگیری ماشین

import pickle
import joblib
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification

# Train a model
X, y = make_classification(n_samples=1000, n_features=20)
model = RandomForestClassifier(n_estimators=100)
model.fit(X, y)

# Save with pickle
with open('model.pkl', 'wb') as file:
    pickle.dump(model, file, protocol=pickle.HIGHEST_PROTOCOL)

# Alternative: Use joblib for large models
joblib.dump(model, 'model.joblib')

2. ذخیره‌سازی نشست‌ها

import pickle
import os
from datetime import datetime

class SessionManager:
    def __init__(self, session_dir='sessions'):
        self.session_dir = session_dir
        os.makedirs(session_dir, exist_ok=True)
    
    def save_session(self, session_id, data):
        file_path = os.path.join(self.session_dir, f'{session_id}.pkl')
        with open(file_path, 'wb') as file:
            pickle.dump({
                'data': data,
                'timestamp': datetime.now(),
                'session_id': session_id
            }, file, protocol=pickle.HIGHEST_PROTOCOL)
    
    def load_session(self, session_id):
        file_path = os.path.join(self.session_dir, f'{session_id}.pkl')
        if os.path.exists(file_path):
            with open(file_path, 'rb') as file:
                return pickle.load(file)
        return None

3. مدیریت پیکربندی

import pickle
import os

class ConfigManager:
    def __init__(self, config_file='config.pkl'):
        self.config_file = config_file
        self.config = self.load_config()
    
    def load_config(self):
        if os.path.exists(self.config_file):
            try:
                with open(self.config_file, 'rb') as file:
                    return pickle.load(file)
            except Exception:
                return self.get_default_config()
        return self.get_default_config()
    
    def save_config(self):
        with open(self.config_file, 'wb') as file:
            pickle.dump(self.config, file, protocol=pickle.HIGHEST_PROTOCOL)
    
    def get_default_config(self):
        return {
            'database_url': 'localhost:5432',
            'api_key': '',
            'debug_mode': False,
            'max_connections': 10
        }

ادغام AI و یادگیری ماشین در پایتون

این بخش به یکپارچه‌سازی هوش مصنوعی و یادگیری ماشین با ماژول pickle در پایتون می‌پردازد، شامل جریان‌های کاری مدرن AI، مدیریت وضعیت مدل و کش کردن پاسخ‌ها. هر زیر مجموعه شامل مثال‌های کد و توضیحات است تا بتوانند این تکنیک‌ها را به‌صورت امن و کارآمد به کار ببرید.

جریان کاری مدرن AI با Pickle

این بخش نشان می‌دهد چگونه می‌توان وضعیت یک مدل AI را ذخیره و بارگذاری کرد و همچنین کش embeddings برای افزایش عملکرد ایجاد نمود.

import pickle
import numpy as np
from transformers import AutoTokenizer, AutoModel
import torch

class AIModelManager:
    def __init__(self, model_name="bert-base-uncased"):
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        self.model = AutoModel.from_pretrained(model_name)
        self.cache = {}
    
    def save_model_state(self, file_path):
        """Save model state for later use"""
        state = {
            'model_state_dict': self.model.state_dict(),
            'tokenizer': self.tokenizer,
            'cache': self.cache,
            'metadata': {
                'version': '1.0',
                'created_at': '2025-01-27',
                'framework': 'pytorch'
            }
        }
        
        with open(file_path, 'wb') as file:
            pickle.dump(state, file, protocol=pickle.HIGHEST_PROTOCOL)
    
    def load_model_state(self, file_path):
        """Load previously saved model state"""
        with open(file_path, 'rb') as file:
            state = pickle.load(file)
        
        self.model.load_state_dict(state['model_state_dict'])
        self.tokenizer = state['tokenizer']
        self.cache = state['cache']
        return state['metadata']
    
    def cache_embedding(self, text, embedding):
        """Cache embeddings for performance"""
        self.cache[text] = embedding
    
    def get_cached_embedding(self, text):
        """Retrieve cached embedding"""
        return self.cache.get(text)

# Usage in AI pipeline
ai_manager = AIModelManager()
ai_manager.save_model_state('ai_model_2025.pkl')

کلاس AIModelManager وضعیت مدل و tokenizer را ذخیره می‌کند و امکان بازیابی آن‌ها را فراهم می‌آورد. همچنین می‌توان embeddings را کش کرد تا سرعت پردازش افزایش یابد.

کش کردن پاسخ LLM

این بخش نشان می‌دهد چگونه می‌توان پاسخ‌های تولید شده توسط مدل‌های زبان بزرگ را ذخیره و بازیابی کرد تا از پردازش مجدد جلوگیری شود.

import pickle
import hashlib
from datetime import datetime, timedelta

class LLMCache:
    def __init__(self, cache_file='llm_cache.pkl', max_age_hours=24):
        self.cache_file = cache_file
        self.max_age = timedelta(hours=max_age_hours)
        self.cache = self.load_cache()
    
    def load_cache(self):
        """Load existing cache or create new one"""
        try:
            with open(self.cache_file, 'rb') as file:
                return pickle.load(file)
        except FileNotFoundError:
            return {}
    
    def save_cache(self):
        """Save cache to disk"""
        with open(self.cache_file, 'wb') as file:
            pickle.dump(self.cache, file, protocol=pickle.HIGHEST_PROTOCOL)
    
    def get_cache_key(self, prompt, model_name):
        """Generate unique cache key"""
        content = f"{prompt}:{model_name}"
        return hashlib.sha256(content.encode()).hexdigest()
    
    def get_cached_response(self, prompt, model_name):
        """Get cached response if available and fresh"""
        key = self.get_cache_key(prompt, model_name)
        if key in self.cache:
            entry = self.cache[key]
            if datetime.now() - entry['timestamp'] < self.max_age:
                return entry['response']
            else:
                del self.cache[key]  # Expired
        return None
    
    def cache_response(self, prompt, model_name, response):
        """Cache new response"""
        key = self.get_cache_key(prompt, model_name)
        self.cache[key] = {
            'response': response,
            'timestamp': datetime.now(),
            'prompt': prompt,
            'model': model_name
        }
        self.save_cache()

# Usage in LLM application
llm_cache = LLMCache()
cached_response = llm_cache.get_cached_response("What is Python pickle?", "gpt-4")
if cached_response:
    print("Using cached response:", cached_response)
else:
    # Generate new response and cache it
    response = "Python pickle is a serialization module..."
    llm_cache.cache_response("What is Python pickle?", "gpt-4", response)

کلاس LLMCache پاسخ‌های تولید شده توسط LLM را ذخیره می‌کند و هنگام درخواست مشابه، اگر پاسخ هنوز منقضی نشده باشد، آن را بازیابی می‌کند. این کار باعث صرفه‌جویی در زمان و منابع می‌شود.

7 روش و ترفند دیباگ(Debuging) کردن کدهای پایتون Python
دیباگ کردن کدهای پایتون

جمع بندی

استفاده از ماژول pickle در پایتون، اگرچه ساده و قدرتمند است، نیازمند رعایت اصول ایمنی و مدیریت صحیح داده‌هاست. با ترکیب آن با روش‌های پیشرفته مانند کش پاسخ‌ها، ذخیره وضعیت مدل‌های یادگیری ماشین و استفاده از قالب‌های امن برای ذخیره‌سازی، می‌توان عملکرد برنامه‌ها و مدل‌های هوش مصنوعی را به شکل چشمگیری بهبود داد.

به طور خلاصه، pickle نه تنها ابزار مناسبی برای سریالیزه کردن داده‌هاست، بلکه با رعایت نکات امنیتی و بهینه‌سازی عملکرد، می‌تواند بخش مهمی از جریان کاری مدرن AI و یادگیری ماشین باشد.

به اشتراک بگذارید