ai-agents-for-beginners

كيفية تصميم وكلاء ذكاء اصطناعي جيدين

(انقر على الصورة أعلاه لمشاهدة فيديو هذا الدرس)

نمط تصميم استخدام الأدوات

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

المقدمة

في هذا الدرس، نسعى للإجابة على الأسئلة التالية:

أهداف التعلم

بعد إكمال هذا الدرس، ستكون قادرًا على:

ما هو نمط تصميم استخدام الأدوات؟

يركز نمط تصميم استخدام الأدوات على إعطاء نماذج اللغة الكبيرة (LLMs) القدرة على التفاعل مع أدوات خارجية لتحقيق أهداف محددة. الأدوات هي كود يمكن تنفيذه بواسطة الوكيل لأداء إجراءات. يمكن أن تكون الأداة دالة بسيطة مثل الآلة الحاسبة، أو استدعاء API لخدمة طرف ثالث مثل البحث عن سعر الأسهم أو توقع الطقس. في سياق وكلاء الذكاء الاصطناعي، تم تصميم الأدوات ليتم تنفيذها من قبل الوكلاء استجابة لـ نداءات الوظائف التي يولدها النموذج.

ما هي حالات الاستخدام التي يمكن تطبيقها عليها؟

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

ما هي العناصر/الكتل الأساسية اللازمة لتنفيذ نمط تصميم استخدام الأدوات؟

تتيح هذه الكتل الأساسية لوكيل الذكاء الاصطناعي أداء مجموعة واسعة من المهام. لننظر إلى العناصر الأساسية اللازمة لتنفيذ نمط تصميم استخدام الأدوات:

بعد ذلك، دعونا ننظر إلى نداء الوظائف/الأدوات بمزيد من التفصيل.

نداء الوظائف/الأدوات

نداء الوظائف هو الطريقة الأساسية التي تتيح لنماذج اللغة الكبيرة (LLMs) التفاعل مع الأدوات. سترى غالبًا استخدام “وظيفة” و”أداة” بالتبادل لأن “الوظائف” (كتل من الكود القابل لإعادة الاستخدام) هي “الأدوات” التي يستخدمها الوكلاء لأداء المهام. لكي يتم استدعاء كود الوظيفة، يجب على LLM مقارنة طلب المستخدم بوصف الوظائف. لهذا الغرض، يتم إرسال مخطط يحتوي على أوصاف جميع الوظائف المتاحة إلى LLM. ثم يختار LLM الوظيفة الأنسب للمهمة ويعيد اسمها وحججها. تُستدعى الوظيفة المختارة، ويرسل ردها مرة أخرى إلى LLM، الذي يستخدم المعلومات للرد على طلب المستخدم.

لتنفيذ نداء الوظائف لوكلاء الذكاء الاصطناعي، ستحتاج إلى:

  1. نموذج LLM يدعم نداء الوظائف
  2. مخطط يحتوي على أوصاف الوظائف
  3. كود لكل وظيفة موصوفة

لنستخدم مثال الحصول على الوقت الحالي في مدينة لتوضيح ذلك:

  1. تهيئة LLM يدعم نداء الوظائف:

    ليست جميع النماذج تدعم نداء الوظائف، لذا من المهم التحقق من أن النموذج الذي تستخدمه يدعم ذلك. يدعم Azure OpenAI نداء الوظائف. يمكننا البدء بإنشاء عميل Azure OpenAI.

     # تهيئة عميل Azure OpenAI
     client = AzureOpenAI(
         azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"), 
         api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
         api_version="2024-05-01-preview"
     )
    
  2. إنشاء مخطط وظيفة:

    بعد ذلك، سنعرّف مخطط JSON يحتوي على اسم الوظيفة، وصف ما تفعله الوظيفة، وأسماء وأوصاف المعاملات الخاصة بالوظيفة. ثم نأخذ هذا المخطط ونمرره إلى العميل الذي أنشأناه مسبقًا، مع طلب المستخدم للعثور على الوقت في سان فرانسيسكو. ما هو مهم أن نلاحظه هو أن نداء الأداة هو ما يتم إرجاعه، وليس الجواب النهائي للسؤال. كما ذكرنا سابقًا، يعيد LLM اسم الوظيفة التي اختارها للمهمة، والحجج التي سيتم تمريرها إليها.

     # وصف الدالة للنموذج للقراءة
     tools = [
         {
             "type": "function",
             "function": {
                 "name": "get_current_time",
                 "description": "Get the current time in a given location",
                 "parameters": {
                     "type": "object",
                     "properties": {
                         "location": {
                             "type": "string",
                             "description": "The city name, e.g. San Francisco",
                         },
                     },
                     "required": ["location"],
                 },
             }
         }
     ]
    
      
     # رسالة المستخدم الأولية
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # المكالمة الأولى للواجهة البرمجية: اطلب من النموذج استخدام الوظيفة
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # معالجة رد النموذج
       response_message = response.choices[0].message
       messages.append(response_message)
      
       print("Model's response:")  
    
       print(response_message)
      
    
     Model's response:
     ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_pOsKdUlqvdyttYB67MOj434b', function=Function(arguments='{"location":"San Francisco"}', name='get_current_time'), type='function')])
    
  3. كود الوظيفة المطلوب لتنفيذ المهمة:

    بعد أن يختار LLM الوظيفة التي يجب تشغيلها، يجب تنفيذ الكود الذي ينفذ المهمة.
    يمكننا تنفيذ الكود للحصول على الوقت الحالي باستخدام بايثون. كما أننا بحاجة إلى كتابة كود لاستخراج الاسم والحجج من response_message للحصول على النتيجة النهائية.

       def get_current_time(location):
         """Get the current time for a given location"""
         print(f"get_current_time called with location: {location}")  
         location_lower = location.lower()
            
         for key, timezone in TIMEZONE_DATA.items():
             if key in location_lower:
                 print(f"Timezone found for {key}")  
                 current_time = datetime.now(ZoneInfo(timezone)).strftime("%I:%M %p")
                 return json.dumps({
                     "location": location,
                     "current_time": current_time
                 })
          
         print(f"No timezone data found for {location_lower}")  
         return json.dumps({"location": location, "current_time": "unknown"})
    
      # معالجة استدعاءات الدوال
       if response_message.tool_calls:
           for tool_call in response_message.tool_calls:
               if tool_call.function.name == "get_current_time":
         
                   function_args = json.loads(tool_call.function.arguments)
         
                   time_response = get_current_time(
                       location=function_args.get("location")
                   )
         
                   messages.append({
                       "tool_call_id": tool_call.id,
                       "role": "tool",
                       "name": "get_current_time",
                       "content": time_response,
                   })
       else:
           print("No tool calls were made by the model.")  
      
       # استدعاء API الثاني: الحصول على الاستجابة النهائية من النموذج
       final_response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
       )
      
       return final_response.choices[0].message.content
    
       get_current_time called with location: San Francisco
       Timezone found for san francisco
       The current time in San Francisco is 09:24 AM.
    

يعد نداء الوظائف جوهر معظم، إن لم يكن كل، نمط تصميم استخدام أدوات الوكلاء، ومع ذلك فإن تنفيذه من الصفر يمكن أن يكون تحديًا أحيانًا. كما تعلمنا في الدرس 2 توفر أُطُر العمل الوكيلة كتل بناء جاهزة لتنفيذ استخدام الأدوات.

أمثلة استخدام الأدوات مع أُطُر العمل الوكيلة

إليك بعض الأمثلة على كيفية تنفيذ نمط تصميم استخدام الأدوات باستخدام أُطُر العمل الوكيلة المختلفة:

إطار عمل مايكروسوفت للوكلاء

إطار عمل مايكروسوفت للوكلاء هو إطار عمل ذكاء اصطناعي مفتوح المصدر لبناء وكلاء ذكاء اصطناعي. يبسط عملية استخدام نداء الوظائف من خلال السماح لك بتعريف الأدوات كدوال بايثون باستخدام المزخرف @tool. يتولى الإطار التعامل مع التواصل ذهابًا وإيابًا بين النموذج وكودك. كما يوفر وصولًا إلى أدوات معرفة مسبقًا مثل بحث الملفات ومفسر الكود عبر AzureAIProjectAgentProvider.

يوضح الرسم البياني التالي عملية نداء الوظائف مع إطار عمل مايكروسوفت للوكلاء:

نداء الوظائف

في إطار عمل مايكروسوفت للوكلاء، تُعرّف الأدوات كدوال مزخرفة. يمكننا تحويل دالة get_current_time التي رأيناها سابقًا إلى أداة باستخدام المزخرف @tool. سيقوم الإطار تلقائيًا بتسلسل الوظيفة ومعاملاتها، وإنشاء المخطط لإرساله إلى LLM.

from agent_framework import tool
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential

@tool
def get_current_time(location: str) -> str:
    """Get the current time for a given location"""
    ...

# إنشاء العميل
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())

# إنشاء وكيل وتشغيل الأداة معه
agent = await provider.create_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")

خدمة وكيل الذكاء الاصطناعي من Azure

خدمة وكيل الذكاء الاصطناعي من Azure هي إطار عمل وكيل أحدث مصمم لتمكين المطورين من بناء ونشر وتوسيع وكلاء ذكاء اصطناعي عالي الجودة وقابلين للتوسع بطريقة آمنة دون الحاجة لإدارة موارد الحوسبة والتخزين الأساسية. وهو مفيد بشكل خاص لتطبيقات المؤسسات لأنه خدمة مُدارة بالكامل مع أمان على مستوى المؤسسات.

عند المقارنة بالتطوير باستخدام LLM API مباشرة، توفر خدمة وكيل الذكاء الاصطناعي من Azure بعض الميزات، بما في ذلك:

يمكن تقسيم الأدوات المتاحة في خدمة وكيل الذكاء الاصطناعي من Azure إلى فئتين:

  1. أدوات المعرفة:
  2. أدوات العمل:

تتيح خدمة الوكيل لنا استخدام هذه الأدوات معًا كمجموعة أدوات (toolset). كما تستخدم الـ threads التي تتتبع تاريخ الرسائل من محادثة معينة.

تخيل أنك وكيل مبيعات في شركة تسمى Contoso. تريد تطوير وكيل محادثة يمكنه الإجابة على الأسئلة حول بيانات المبيعات الخاصة بك.

توضح الصورة التالية كيف يمكنك استخدام خدمة وكيل الذكاء الاصطناعي من Azure لتحليل بيانات مبيعاتك:

خدمة الوكيل قيد التنفيذ

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

import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from fetch_sales_data_functions import fetch_sales_data_using_sqlite_query # دالة fetch_sales_data_using_sqlite_query التي يمكن العثور عليها في ملف fetch_sales_data_functions.py.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

project_client = AIProjectClient.from_connection_string(
    credential=DefaultAzureCredential(),
    conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)

# تهيئة مجموعة الأدوات
toolset = ToolSet()

# تهيئة وكيل استدعاء الدوال مع دالة fetch_sales_data_using_sqlite_query وإضافتها إلى مجموعة الأدوات
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)

# تهيئة أداة مفسر الأكواد وإضافتها إلى مجموعة الأدوات.
code_interpreter = CodeInterpreterTool()toolset.add(code_interpreter)

agent = project_client.agents.create_agent(
    model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent", 
    toolset=toolset
)

ما هي الاعتبارات الخاصة باستخدام نمط تصميم استخدام الأدوات لبناء وكلاء ذكاء اصطناعي موثوقين؟

أحد المخاوف الشائعة مع SQL المولد ديناميكيًا بواسطة LLMs هو الأمان، خصوصًا خطر حقن SQL أو الأفعال الخبيثة، مثل حذف أو العبث بقاعدة البيانات. بينما هذه المخاوف صحيحة، يمكن التخفيف منها بشكل فعّال من خلال تكوين أذونات الوصول لقاعدة البيانات بشكل ملائم. بالنسبة لمعظم قواعد البيانات، يتطلب هذا تكوين قاعدة البيانات كـ “قراءة فقط”. بالنسبة لخدمات قواعد البيانات مثل PostgreSQL أو Azure SQL، يجب تعيين دور التطبيق كقراءة فقط (SELECT).

تشغيل التطبيق في بيئة آمنة يعزز الحماية بشكل أكبر. في سيناريوهات المؤسسات، عادةً ما يتم استخراج وتحويل البيانات من الأنظمة التشغيلية إلى قاعدة بيانات قراءة فقط أو مستودع بيانات مع مخطط سهل الاستخدام. يضمن هذا الأسلوب أن البيانات آمنة، ومحسّنة للأداء وسهولة الوصول، وأن التطبيق يملك وصولاً محدودًا للقراءة فقط.

أمثلة رموز

هل لديك المزيد من الأسئلة حول نمط تصميم استخدام الأدوات؟

انضم إلى خادم Microsoft Foundry على Discord لتلتقي مع متعلمين آخرين، تحضر ساعات العمل، وتحصل على إجابات لأسئلتك حول وكلاء الذكاء الاصطناعي.

موارد إضافية

الدرس السابق

فهم أنماط تصميم الوكلاء

الدرس التالي

الاسترجاع الوكيل


تنويه: تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي Co-op Translator. بينما نسعى للدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الهامة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة.