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. يختارون ما يحتاجون.
التالي: تحميل المهارات ديناميكياً أثناء التشغيل. :::