الأدوات والموارد والتعليمات

دمج القدرات

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

كل قدرة على حدة أمر مباشر. العمل التصميمي يبدأ حين يقدّم خادم واحد القدرات الثلاث معاً ويتعيّن عليك أن تقرر أي مهمة تذهب إلى أين.

مثال كامل: خادم قاعدة المعرفة

إليك قاعدة المعرفة نفسها مكشوفة بثلاث طرق في آن واحد. لاحظ أن كل قدرة تجيب عن سؤال مختلف حول المستندات نفسها:

قاعدة معرفة واحدة، ثلاث واجهات

الموارد — «دعني أقرأ ذلك»
الأدوات — «اذهب فابحث عنه» أو «غيّره»
التعليمات — «افعل الشيء المعتاد»
التخزين

الاقتران الذي يجعل هذا يعمل هو search_knowledge مع doc://{id}. فالموارد معنونة لكنها غير قابلة للاكتشاف من النموذج، إذ لا سبيل له لتخمين معرّف مستند. وأداة البحث موجودة تحديداً لتحويل السؤال إلى معرّفات تستطيع طبقة الموارد تقديمها. اشحن إحداهما دون الأخرى فيصير نصف الخادم غير قابل للوصول.

from mcp.server import MCPServer

mcp = MCPServer(name="knowledge-base")


# 1. الموارد — عروض للقراءة فقط، تُعنون بـ URI
@mcp.resource("doc://{doc_id}", mime_type="text/markdown")
async def document(doc_id: str) -> str:
    """مستند واحد من قاعدة المعرفة."""
    doc = await db.get_document(doc_id)
    return doc.content


# 2. الأدوات — أفعال، بما فيها ذات الآثار الجانبية
@mcp.tool()
async def search_knowledge(query: str, limit: int = 5) -> str:
    """البحث في قاعدة المعرفة وإرجاع أفضل المستندات المطابقة."""
    return await kb.search(query, limit=limit)


@mcp.tool()
async def add_document(title: str, content: str, tags: list[str] | None = None) -> str:
    """إضافة مستند جديد إلى قاعدة المعرفة."""
    doc_id = await db.add_document(title, content, tags or [])
    return f"تم إنشاء doc://{doc_id}"


# 3. الموجَّهات — تفاعلات موحّدة يختارها المستخدم من قائمة
@mcp.prompt()
def summarize_topic(topic: str) -> str:
    """تلخيص كل ما تعرفه قاعدة المعرفة عن موضوع ما."""
    return f"ابحث في قاعدة المعرفة عن '{topic}' ثم لخّص ما تجده. واذكر كل doc:// استخدمته."

القدرات الثلاث تؤدي هنا ثلاث وظائف مختلفة، وهذا الفصل هو التصميم كله. فـ doc://{doc_id} قالب، ولذلك يكشف الخادم كل مستند دون أن يسرد أياً منها. وadd_document أداة لا مورداً قابلاً للكتابة لأن لها أثراً جانبياً. وsummarize_topic موجَّه لأن المستخدم يختاره عن قصد — فالموجَّهات يبدؤها المستخدم، وهو بالضبط ما لا تفعله الأدوات.

سير العمل: الذكاء الاصطناعي يستخدم جميع القدرات

تتبّع طلباً حقيقياً من أوله إلى آخره. الترتيب ليس اعتباطياً، فالبحث يجب أن يأتي أولاً لأن لا شيء غيره يعرف أي المستندات موجودة:

«لخّص سياسات أمان الذكاء الاصطناعي لدينا»

المستخدم يختار التعليمة

summarize_topic مع topic="أمان الذكاء الاصطناعي". خطوة اختيارية، فمن يعرف ما يريد يستطيع السؤال مباشرة

search_knowledge

نداء أداة يُرجع doc://policy-123 و doc://policy-456. هذه خطوة الاكتشاف، وبدونها لا يملك النموذج معرّفات يقرؤها

قراءة doc://policy-123

قراءة مورد: نص كامل بلا معطيات وبلا آثار جانبية

قراءة doc://policy-456

والمرة نفسها مجدداً. القراءات رخيصة ومستقلة، فيمكن تنفيذها معاً

التلخيص

لا دور للخادم هنا. النموذج يعمل على نص استرجعه فعلاً لا على ذاكرته

الخطوتان الثانية والثالثة هما ما يستحق الترسيخ. البحث يُرجع معرّفات لا محتوى، وطبقة الموارد هي ما يحوّل المعرّفات إلى محتوى. ودمجهما في أداة واحدة تُرجع المستندات كاملة يبدو أنظف، إلى أن يطابق البحث ثلاثين ملفاً فتختفي نافذة السياق.

تنسيق الموارد والأدوات

صمم الموارد والأدوات للعمل معاً:

# المورد: عرض للقراءة فقط
Resource(uri="user://123", name="ملف المستخدم 123")

# الأداة: تعديل المستخدم
Tool(name="update_user", description="تحديث ملف المستخدم")

أفضل الممارسات

الممارسةالسبب
فصل واضحالموارد للقراءة، الأدوات للإجراءات
URIs متسقةتجعل الموارد قابلة للتنبؤ
تسمية ذات صلةuser://123 مع أداة update_user
توثيق العلاقاتاشرح في الأوصاف

الآن دعنا نطبق هذه الأنماط في مختبر عملي. :::

اختبار

اختبار الوحدة 3: الأدوات والموارد والتعليمات

خذ الاختبار
هل كان هذا الدرس مفيدًا؟

سجّل الدخول للتقييم