Model Context Protocol (MCP)

تسلط بر جلسات حالت‌دار و پنجره‌های زمینه در برنامه‌های پروتکل زمینه مدل

وقتی توسعه‌دهندگان عمیق‌تر در پروتکل زمینه مدل (MCP) غوطه‌ور می‌شوند، جذابیت اتصال مدل‌های زبانی بزرگ به ابزارهای خارجی کمرنگ شده و با چالش‌های مهندسی پیچیده استقرار در سطح تولید جایگزین می‌شود. دو مانع حیاتی در این گذار، حفظ حالت پایدار در طول تعاملات و مدیریت مؤثر پنجره زمینه محدود مدل زبانی بزرگ زیرین است. بدون استراتژی‌های قوی برای این حوزه‌ها، برنامه‌های مبتنی بر MCP شما در حفظ ثبات، انسجام و مقیاس‌پذیری با مشکل مواجه خواهند شد.

ضرورت جلسات حالت‌دار

بیشتر تعاملات با مدل‌های زبانی بزرگ (LLM) ذاتاً بی‌حالت (stateless) هستند. وقتی شما درخواستی به یک API ارسال می‌کنید، مدل هیچ حافظه‌ای از تبادل‌های قبلی ندارد، مگر اینکه صراحتاً در پیکربندی (payload) گنجانده شود. برای برنامه‌های MCP—چه دستیاران کدنویسی، چه تحلیلگران داده یا عامل‌های خودمختار—این محدودیت غیرقابل قبول است. کاربران انتظار دارند گفتگوها به طور طبیعی جریان یابد، به طوری که عامل تصمیمات قبلی، ترجیحات کاربر یا نتایج محاسبات میانی را به خاطر بسپارد.

پیاده‌سازی جلسات حالت‌دار نیازمند یک لایه پایداری خارجی است. اگرچه MCP نحوه ارتباط بین کلاینت‌ها و سرورها را تعریف می‌کند، اما نحوه ذخیره‌سازی حالت را دیکته نمی‌کند. شما باید یک مدیر جلسه پیاده‌سازی کنید که تاریخچه گفتگو را ردیابی کرده و آن را به هر درخواست جدید اعمال کند. در یک پیاده‌سازی معمولی پایتون با استفاده از کتابخانه mcp، ممکن است لیستی از پیام‌ها را مدیریت کنید که به مرور زمان انباشته می‌شود.

class ConversationSession:
    def __init__(self, session_id: str):
        self.session_id = session_id
        self.history = []
        self.metadata = {
            "created_at": datetime.now(),
            "token_count": 0
        }

    def add_message(self, role: str, content: str):
        """Add a new message to the session history."""
        self.history.append({"role": role, "content": content})
        self.metadata["token_count"] += self._estimate_tokens(content)

    def get_context_for_prompt(self) -> list:
        """Return the current context window for the LLM."""
        # Return full history or a truncated version based on strategy
        return self.history

با کپسوله کردن تاریخچه درون یک شیء جلسه، شما تضمین می‌کنید که هر نوبت در گفتگو بر نوبت قبلی استوار باشد و به سرور MCP اجازه می‌دهد پاسخ‌های همگام و آگاه از زمینه ارائه دهد.

مدیریت پنجره زمینه

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

چندین استراتژی برای مدیریت این پنجره وجود دارد:

  1. پنجره لغزان: فقط N پیام آخر را نگه دارید. این روش ساده است اما خطر از دست دادن زمینه مهم اولیه را دارد.
  2. خلاصه‌سازی: به طور دوره‌ای بخش‌های قدیمی‌تر گفتگو را به یک خلاصه فشرده کنید. این کار بینش‌های کلیدی را حفظ کرده و در عین حال توکن‌های آزاد می‌کند.
  3. RAG (تولید تقویت‌شده با بازیابی): تعاملات دقیق را در یک پایگاه داده برداری ذخیره کنید و فقط قطعات مرتبط را هنگام نیاز بازیابی نمایید.

برای بیشتر برنامه‌های MCP، یک رویکرد ترکیبی بهترین عملکرد را دارد. شما می‌توانید یک «حافظه اصلی» از دستورالعمل‌های ضروری و ترجیحات کاربر را حفظ کنید، در حالی که از یک پنجره لغزان برای جریان گفتگوی فوری استفاده می‌کنید. در اینجا نحوه پیاده‌سازی یک استراتژی برش ساده آورده شده است:

def trim_history(history: list, max_tokens: int, tokenizer) -> list:
    """Trim history to fit within token limits, keeping system prompts."""
    
    # Separate system prompt if present
    system_prompt = history[0] if history and history[0]['role'] == 'system' else None
    
    # Calculate tokens for remaining messages
    total_tokens = sum(tokenizer.encode(msg['content']) for msg in history)
    
    if total_tokens <= max_tokens:
        return history
        
    # Keep system prompt and truncate from the beginning of user/assistant turns
    relevant_history = [system_prompt] if system_prompt else []
    
    # Add messages from the end until we hit the limit
    for msg in reversed(history):
        if msg['role'] == 'system':
            continue
        if total_tokens + len(tokenizer.encode(msg['content'])) > max_tokens:
            break
        relevant_history.insert(0, msg)
        total_tokens += len(tokenizer.encode(msg['content']))
        
    return relevant_history

نتیجه‌گیری

ساخت برنامه‌های آماده تولید با پروتکل زمینه مدل نیازمند عبور از چرخه‌های ساده درخواست-پاسخ است. با پیاده‌سازی مدیریت جلسات قوی و استراتژی‌های هوشمندانه پنجره زمینه، شما به عامل‌های هوش مصنوعی خود امکان می‌دهید پیوستگی را حفظ کنند، هزینه‌ها را کاهش دهند و پاسخ‌های با کیفیت بالاتری ارائه دهند. با بالغ شدن اکوسیستم MCP، احتمالاً کتابخانه‌های استاندارد برای مدیریت این الگوهای مدیریت حالت ظهور خواهند کرد، اما در حال حاضر، درک مکانیک‌های زیربنایی برای هر توسعه‌دهنده پیشرفته‌ای که در حوزه هوش مصنوعی فعالیت می‌کند، ضروری است.

Share: