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

دمج القدرات

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

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

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

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

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

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

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

from mcp.server import Server
from mcp.types import Tool, Resource, Prompt, TextContent

server = Server(name="knowledge-base")

# 1. الموارد: كشف المستندات
@server.list_resources()
async def list_resources():
    docs = await db.get_all_documents()
    return [
        Resource(
            uri=f"doc://{doc.id}",
            name=doc.title,
            description=f"مستند: {doc.title}",
            mimeType="text/markdown"
        )
        for doc in docs
    ]

@server.read_resource()
async def read_resource(uri: str):
    doc_id = uri.replace("doc://", "")
    doc = await db.get_document(doc_id)
    return [TextContent(type="text", text=doc.content)]

# 2. الأدوات: البحث والتعديل
@server.list_tools()
async def list_tools():
    return [
        Tool(
            name="search_knowledge",
            description="البحث في قاعدة المعرفة",
            inputSchema={
                "type": "object",
                "properties": {
                    "query": {"type": "string"},
                    "limit": {"type": "integer", "default": 5}
                },
                "required": ["query"]
            }
        ),
        Tool(
            name="add_document",
            description="إضافة مستند جديد إلى قاعدة المعرفة",
            inputSchema={
                "type": "object",
                "properties": {
                    "title": {"type": "string"},
                    "content": {"type": "string"},
                    "tags": {"type": "array", "items": {"type": "string"}}
                },
                "required": ["title", "content"]
            }
        )
    ]

# 3. التعليمات: تفاعلات موحدة
@server.list_prompts()
async def list_prompts():
    return [
        Prompt(
            name="summarize_topic",
            description="تلخيص جميع المستندات حول موضوع",
            arguments=[
                PromptArgument(name="topic", required=True)
            ]
        )
    ]

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

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

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

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

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: الأدوات والموارد والتعليمات

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

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