الدرس 11 من 20

MCP ومهارات الوكيل

إطار مهارات الوكيل

4 دقيقة للقراءة

مع اكتساب الوكلاء قدرات أكثر، إدارتها تصبح تحدياً. إطار المهارات ينظم القدرات في وحدات قابلة للاكتشاف وموثقة ذاتياً.

مشكلة قوائم الأدوات المسطحة

# هذا يصبح غير قابل للإدارة على نطاق واسع
tools = [
    "search_web", "search_files", "search_database",
    "read_file", "write_file", "delete_file",
    "run_python", "run_bash", "run_javascript",
    "send_email", "send_slack", "send_sms",
    "create_pr", "merge_pr", "review_pr",
    # ... 50 أداة أخرى
]

النموذج يرى 60+ أداة ويضيع رموزاً في تحديد أيها يستخدم.

المهارات: قدرات مجمعة

نظّم الأدوات في مجموعات مهارات منطقية:

skills/
├── web/
│   ├── SKILL.md
│   └── tools: [search, fetch, scrape]
├── filesystem/
│   ├── SKILL.md
│   └── tools: [read, write, list, delete]
├── coding/
│   ├── SKILL.md
│   └── tools: [run_python, run_bash, lint]
└── communication/
    ├── SKILL.md
    └── tools: [email, slack, sms]

نمط SKILL.md

كل مهارة لها بيان يصف ما تفعله:

# مهارة نظام الملفات

## الغرض
قراءة وكتابة وإدارة الملفات في مساحة العمل.

## متى تُستخدم
- المستخدم يطلب قراءة أو تعديل ملفات
- الحاجة لحفظ المخرجات على القرص
- إدارة هيكل المشروع

## متى لا تُستخدم
- القراءة من URLs (استخدم مهارة الويب)
- عمليات قاعدة البيانات (استخدم مهارة قاعدة البيانات)

## الأدوات
- `read_file`: قراءة محتويات الملف
- `write_file`: إنشاء أو الكتابة فوق الملفات
- `list_directory`: عرض الملفات في دليل
- `delete_file`: حذف ملف

## أمثلة
"اقرأ ملف الإعدادات" → read_file("config.json")
"احفظ هذا في output.txt" → write_file("output.txt", content)

الكشف التدريجي

لا تحمّل جميع المهارات دفعة واحدة. حمّل بناءً على السياق:

class SkillManager:
    def __init__(self):
        self.available_skills = self.discover_skills()
        self.active_skills = set()

    def discover_skills(self) -> dict:
        """البحث عن جميع ملفات SKILL.md."""
        skills = {}
        for path in Path("skills").glob("*/SKILL.md"):
            skill_name = path.parent.name
            skills[skill_name] = self.parse_skill(path)
        return skills

    def get_relevant_skills(self, user_message: str) -> list[str]:
        """تحديد أي مهارات قد تكون مطلوبة."""
        relevant = []

        # مطابقة كلمات بسيطة (استخدم embeddings للإنتاج)
        keywords = {
            "filesystem": ["ملف", "اقرأ", "اكتب", "احفظ", "دليل"],
            "web": ["بحث", "url", "موقع", "جلب", "http"],
            "coding": ["شغّل", "نفّذ", "python", "سكربت", "كود"],
            "communication": ["إيميل", "سلاك", "أرسل", "رسالة", "أبلغ"]
        }

        message_lower = user_message.lower()
        for skill, words in keywords.items():
            if any(word in message_lower for word in words):
                relevant.append(skill)

        return relevant or ["filesystem"]  # المهارة الافتراضية

    def activate_skills(self, skill_names: list[str]):
        """تحميل المهارات المطلوبة فقط."""
        self.active_skills = set(skill_names)
        return self.get_active_tools()

    def get_active_tools(self) -> list[dict]:
        """الحصول على تعريفات الأدوات للمهارات النشطة فقط."""
        tools = []
        for skill_name in self.active_skills:
            skill = self.available_skills[skill_name]
            tools.extend(skill["tools"])
        return tools

تحميل المهارات الواعي بالسياق

async def process_message(user_message: str):
    # الخطوة 1: تحديد المهارات ذات الصلة
    relevant = skill_manager.get_relevant_skills(user_message)

    # الخطوة 2: تفعيل تلك المهارات فقط
    tools = skill_manager.activate_skills(relevant)

    # الخطوة 3: استدعاء LLM بمجموعة أدوات مركزة
    response = await llm.chat(
        messages=[{"role": "user", "content": user_message}],
        tools=tools  # 5-10 أدوات فقط بدلاً من 60
    )

    return response

الفوائد

المنهج الأدوات المرئية تكلفة الرموز جودة القرار
قائمة مسطحة (60 أداة) 60 عالية ضعيفة (مُغرَق)
مهارات (3 نشطة) 15 منخفضة جيدة (مركزة)

تركيب المهارات

المهارات يمكن أن تعتمد على مهارات أخرى:

# skills/research/SKILL.md
name: research
description: بحث عميق في المواضيع
depends_on:
  - web        # للبحث
  - filesystem # لحفظ الملاحظات
tools:
  - research_topic
  - summarize_sources

ملاحظة نيردية: فكر في المهارات مثل إضافات VS Code. المستخدمون لا يثبتون كل الـ 30,000. يختارون ما يحتاجون.

التالي: تحميل المهارات ديناميكياً أثناء التشغيل. :::

اختبار

الوحدة 3: MCP ومهارات الوكيل

خذ الاختبار