لقد أحدث بروتوكول سياق النموذج (MCP) ثورة في طريقة تفاعل نماذج اللغة الكبيرة (LLMs) مع الأدوات ومصادر البيانات الخارجية. ومع ذلك، كلما زاد عدد الأدوات المتاحة، زاد حجم نافذة السياق المطلوبة لوصفها. يمكن أن يؤدي هذا "الانتفاخ السياقي" إلى تدهور أداء النموذج، وزيادة زمن الاستجابة، ورفع تكاليف الواجهة البرمجية (API). لم تعد التصفية الذكية للأدوات خيارًا إضافيًا، بل أصبحت ممارسة هندسية حاسمة للتنفيذات القابلة للتوسع من MCP.
المشكلة: الانتفاخ السياقي في MCP
عندما يسجّل خادم MCP عددًا كبيرًا من الأدوات، يستهلك كل تعريف أداة—including اسمه، ووصفه، ومخطط الإدخال، وقيود المعاملات—رموزًا (Tokens) في موجه النظام (System Prompt). على سبيل المثال، قد يضيف خادم يحتوي على 50 أداة ما بين 10,000 إلى 15,000 رمز إلى كل طلب. هذا العبء الإضافي يزيح استعلام المستخدم الفعلي وسجل المحادثة، مما يجبر نموذج LLM على العمل بنافذة سياق فعلية أصغر. علاوة على ذلك، يمكن أن تؤدي تعريفات الأدوات الزائدة إلى إرباك النموذج، مما يؤدي إلى أخطاء في اختيار الأدوات أو الهلوسة (Hallucinations).
الاستراتيجية: الإزالة الديناميكية قبل الاستدلال
تتمثل الحل في تصفية الأدوات ديناميكيًا قبل إرسالها إلى LLM. بدلاً من إرسال القائمة الكاملة للأدوات المتاحة، يجب أن يتضمن عميل MCP فقط تلك ذات الصلة بالسياق الحالي. يمكن تحقيق ذلك من خلال عدة استراتيجيات:
- التصفية بناءً على النية: استخدم مصنفًا خفيف الوزن أو مطابقة الكلمات المفتاحية للتنبؤ بفئات الأدوات ذات الصلة باستعلام المستخدم.
- الوصول بناءً على الدور: قيّد الأدوات بناءً على دور المستخدم أو صلاحياته، مما يضمن كشف الأدوات المصرح بها فقط.
- الحداثة والتكرار: أعطِ الأولوية للأدوات التي تم استخدامها مؤخرًا أو بشكل متكرر، بافتراض أنها أكثر احتمالًا أن تكون ذات صلة.
- التشابه التضميني (Embedding Similarity): قم بتضمين (Embed) استعلام المستخدم ووصف الأدوات، ثم اختر الأدوات ذات أعلى تشابه دلالي.
مثال على التنفيذ
إليك مثالًا مبسطًا بلغة بايثون يوضح كيفية تصفية الأدوات بناءً على التشابه الدلالي باستخدام تضمينات الجمل (Sentence Embeddings). هذا النهج قوي وقابل للتوسع لمجموعات الأدوات الكبيرة.
import numpy as np
from sentence_transformers import SentenceTransformer
# Load a pre-trained model for embedding
model = SentenceTransformer('all-MiniLM-L6-v2')
def filter_tools_by_relevance(user_query, tools, top_k=10):
"""
Filter tools based on semantic similarity to the user query.
Args:
user_query (str): The user's input.
tools (list): List of tool objects with 'name', 'description', and 'schema'.
top_k (int): Number of top tools to return.
Returns:
list: Top k most relevant tools.
"""
# Prepare texts for embedding
tool_texts = [f"{tool['name']}: {tool['description']}" for tool in tools]
# Generate embeddings
query_embedding = model.encode(user_query)
tool_embeddings = model.encode(tool_texts)
# Calculate cosine similarity
query_embedding = query_embedding / np.linalg.norm(query_embedding)
tool_embeddings = tool_embeddings / np.linalg.norm(tool_embeddings, axis=1, keepdims=True)
similarities = np.dot(tool_embeddings, query_embedding.T)
# Get indices of top k similarities
top_indices = np.argsort(similarities)[::-1][:top_k]
return [tools[i] for i in top_indices]
# Example usage
all_tools = [
{"name": "search_web", "description": "Search the web for current information.", "schema": {...}},
{"name": "calculate", "description": "Perform mathematical calculations.", "schema": {...}},
{"name": "send_email", "description": "Send an email to a recipient.", "schema": {...}},
# ... hundreds of other tools
]
user_query = "What is the stock price of Apple today?"
relevant_tools = filter_tools_by_relevance(user_query, all_tools, top_k=5)
print(f"Selected {len(relevant_tools)} tools for inference:")
for tool in relevant_tools:
print(f"- {tool['name']}")
في هذا المثال، من المرجح أن يتم اختيار أداة `search_web` بسبب تشابهها الدلالي العالي مع الاستعلام حول أسعار الأسهم، بينما يتم استبعاد `calculate` أو `send_email`. يقلل هذا من حجم السياق بشكل كبير مع الحفاظ على صلة عالية.
أفضل الممارسات والاعتبارات
- التخزين المؤقت (Caching): قم بتخزين تضمينات (Embeddings) وصف الأدوات مؤقتًا لتجنب إعادة حسابها في كل طلب.
- آلية الاحتياط (Fallback): إذا لم تستوفِ أي أدوات عتبة التشابه، فكّر في إرجاع مجموعة افتراضية من الأدوات العامة أو رسالة "لا تتوفر أداة".
- المراقبة: تتبّع الأدوات التي يتم اختيارها والأدوات التي يستخدمها LLM لتحسين استراتيجية التصفية الخاصة بك بمرور الوقت.
- مقايضة زمن الاستجابة (Latency Trade-off): تأكد من أن عملية التصفية نفسها لا تضيف زمن استجابة كبيرًا. استخدم نماذج تضمين فعالة وقواعد بيانات متجهات إذا كان عدد الأدوات كبيرًا جدًا.
الخلاصة
التصفية الذكية للأدوات هي تحسين حاسم لأي نظام MCP على مستوى الإنتاج. من خلال إزالة تعريفات الأدوات غير المستخدمة ديناميكيًا قبل استدلال LLM، يمكنك تقليل الانتفاخ السياقي، وتحسين دقة النموذج، وخفض التكاليف التشغيلية. مع نضج منظومة MCP ونمو سجلات الأدوات، سيكون الاستثمار في استراتيجيات التصفية الفعالة مفتاحًا لتقديم تطبيقات ذكاء اصطناعي سريعة وموثوقة وفعالة من حيث التكلفة.