ai-agents-for-beginners

چگونه عوامل هوش مصنوعی خوب طراحی کنیم

(برای مشاهده ویدئوی این درس، روی تصویر بالا کلیک کنید)

الگوی طراحی استفاده از ابزار

ابزارها جالب هستند زیرا به عوامل هوش مصنوعی امکان می‌دهند تا دامنه وسیع‌تری از قابلیت‌ها داشته باشند. به جای اینکه عامل فقط مجموعه محدودی از اقدامات را بتواند انجام دهد، با افزودن یک ابزار، عامل اکنون می‌تواند طیف گسترده‌ای از اقدامات را انجام دهد. در این فصل، به الگوی طراحی استفاده از ابزار می‌پردازیم که توضیح می‌دهد چگونه عوامل هوش مصنوعی می‌توانند از ابزارهای خاص برای دستیابی به اهداف خود استفاده کنند.

مقدمه

در این درس، به دنبال پاسخ به سوالات زیر هستیم:

اهداف یادگیری

پس از تکمیل این درس، شما قادر خواهید بود:

الگوی طراحی استفاده از ابزار چیست؟

الگوی طراحی استفاده از ابزار بر دادن توانایی به مدل‌های زبان بزرگ (LLMs) برای تعامل با ابزارهای خارجی جهت دستیابی به اهداف خاص تمرکز دارد. ابزارها کدهایی هستند که می‌توانند توسط یک عامل اجرا شوند تا اقدامات خاصی انجام دهند. یک ابزار می‌تواند یک تابع ساده مانند یک ماشین حساب باشد یا یک فراخوانی API به یک سرویس شخص ثالث مانند جستجوی قیمت سهام یا پیش‌بینی آب‌وهوا. در زمینه عوامل هوش مصنوعی، ابزارها به گونه‌ای طراحی شده‌اند که توسط عوامل در پاسخ به فراخوانی‌های تابع تولید شده توسط مدل اجرا شوند.

موارد استفاده‌ای که می‌توان آن را به کار برد چیست؟

عوامل هوش مصنوعی می‌توانند از ابزارها برای انجام وظایف پیچیده، بازیابی اطلاعات یا تصمیم‌گیری استفاده کنند. الگوی طراحی استفاده از ابزار اغلب در سناریوهایی که نیاز به تعامل پویا با سیستم‌های خارجی دارند، مانند پایگاه‌های داده، خدمات وب یا مفسران کد، استفاده می‌شود. این قابلیت برای موارد استفاده مختلف مفید است، از جمله:

عناصر/بلوک‌های سازنده مورد نیاز برای پیاده‌سازی الگوی طراحی استفاده از ابزار چیست؟

این بلوک‌های سازنده به عامل هوش مصنوعی امکان می‌دهند تا طیف گسترده‌ای از وظایف را انجام دهد. بیایید به عناصر کلیدی مورد نیاز برای پیاده‌سازی الگوی طراحی استفاده از ابزار نگاهی بیندازیم:

در ادامه، به فراخوانی تابع/ابزار با جزئیات بیشتری می‌پردازیم.

فراخوانی تابع/ابزار

فراخوانی تابع روش اصلی برای امکان تعامل مدل‌های زبان بزرگ (LLMs) با ابزارها است. اغلب “تابع” و “ابزار” به صورت متناوب استفاده می‌شوند زیرا “توابع” (بلوک‌های کد قابل استفاده مجدد) همان “ابزارهایی” هستند که عوامل برای انجام وظایف از آن‌ها استفاده می‌کنند. برای اینکه کد یک تابع فراخوانی شود، مدل زبان بزرگ باید درخواست کاربر را با توضیحات تابع مقایسه کند. برای این کار، یک طرح شامل توضیحات تمام توابع موجود به مدل زبان بزرگ ارسال می‌شود. مدل زبان بزرگ سپس مناسب‌ترین تابع را برای وظیفه انتخاب کرده و نام و آرگومان‌های آن را بازمی‌گرداند. تابع انتخاب‌شده فراخوانی می‌شود، پاسخ آن به مدل زبان بزرگ ارسال می‌شود و مدل از اطلاعات برای پاسخ به درخواست کاربر استفاده می‌کند.

برای توسعه‌دهندگان جهت پیاده‌سازی فراخوانی تابع برای عوامل، شما نیاز دارید:

  1. یک مدل زبان بزرگ که از فراخوانی تابع پشتیبانی کند
  2. یک طرح شامل توضیحات توابع
  3. کد هر تابع توصیف‌شده

بیایید از مثال دریافت زمان فعلی در یک شهر برای توضیح استفاده کنیم:

  1. مدل زبان بزرگ که از فراخوانی تابع پشتیبانی می‌کند را مقداردهی اولیه کنید:

    همه مدل‌ها از فراخوانی تابع پشتیبانی نمی‌کنند، بنابراین مهم است که بررسی کنید مدل زبان بزرگی که استفاده می‌کنید این قابلیت را دارد. Azure OpenAI از فراخوانی تابع پشتیبانی می‌کند. ما می‌توانیم با ایجاد کلاینت Azure OpenAI شروع کنیم.

     # Initialize the Azure OpenAI client
     client = AzureOpenAI(
         azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
         api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
         api_version="2024-05-01-preview"
     )
    
  2. ایجاد یک طرح تابع:

    سپس یک طرح JSON تعریف می‌کنیم که شامل نام تابع، توضیحی درباره کاری که تابع انجام می‌دهد و نام‌ها و توضیحات پارامترهای تابع است. سپس این طرح را به کلاینتی که قبلاً ایجاد شده است، همراه با درخواست کاربر برای یافتن زمان در سان‌فرانسیسکو ارسال می‌کنیم. نکته مهم این است که یک فراخوانی ابزار بازگردانده می‌شود، نه پاسخ نهایی به سوال. همان‌طور که قبلاً ذکر شد، مدل زبان بزرگ نام تابعی که برای وظیفه انتخاب کرده است و آرگومان‌هایی که به آن ارسال می‌شود را بازمی‌گرداند.

     # Function description for the model to read
     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"],
                 },
             }
         }
     ]
    
      
     # Initial user message
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # First API call: Ask the model to use the function
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Process the model's response
       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. کد تابع مورد نیاز برای انجام وظیفه:

    اکنون که مدل زبان بزرگ انتخاب کرده است کدام تابع باید اجرا شود، کدی که وظیفه را انجام می‌دهد باید پیاده‌سازی و اجرا شود. ما می‌توانیم کد دریافت زمان فعلی را در پایتون پیاده‌سازی کنیم. همچنین باید کدی بنویسیم که نام و آرگومان‌ها را از 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"})
    
      # Handle function calls
       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.")  
      
       # Second API call: Get the final response from the model
       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.
    

فراخوانی تابع در قلب اکثر طراحی‌های استفاده از ابزار عامل قرار دارد، اما پیاده‌سازی آن از ابتدا گاهی اوقات چالش‌برانگیز است. همان‌طور که در درس ۲ یاد گرفتیم، چارچوب‌های عاملیک به ما بلوک‌های سازنده از پیش‌ساخته شده‌ای برای پیاده‌سازی استفاده از ابزار ارائه می‌دهند.

مثال‌های استفاده از ابزار با چارچوب‌های عاملیک

در اینجا چند مثال از نحوه پیاده‌سازی الگوی طراحی استفاده از ابزار با استفاده از چارچوب‌های عاملیک مختلف آورده شده است:

Semantic Kernel

Semantic Kernel یک چارچوب هوش مصنوعی متن‌باز برای توسعه‌دهندگان .NET، پایتون و جاوا است که با مدل‌های زبان بزرگ (LLMs) کار می‌کنند. این چارچوب فرآیند استفاده از فراخوانی تابع را با توصیف خودکار توابع و پارامترهای آن‌ها به مدل از طریق فرآیندی به نام سریال‌سازی ساده می‌کند. همچنین ارتباط بین مدل و کد شما را مدیریت می‌کند. یکی دیگر از مزایای استفاده از یک چارچوب عاملیک مانند Semantic Kernel این است که به شما امکان دسترسی به ابزارهای از پیش‌ساخته شده مانند جستجوی فایل و مفسر کد را می‌دهد.

نمودار زیر فرآیند فراخوانی تابع با Semantic Kernel را نشان می‌دهد:

فراخوانی تابع

در Semantic Kernel توابع/ابزارها پلاگین‌ها نامیده می‌شوند. ما می‌توانیم تابع get_current_time که قبلاً دیدیم را به یک پلاگین تبدیل کنیم، با تبدیل آن به یک کلاس که تابع در آن قرار دارد. همچنین می‌توانیم دکوریتور kernel_function را وارد کنیم که توضیح تابع را دریافت می‌کند. هنگامی که شما یک کرنل با پلاگین GetCurrentTimePlugin ایجاد می‌کنید، کرنل به طور خودکار تابع و پارامترهای آن را سریال‌سازی می‌کند و در این فرآیند طرحی برای ارسال به مدل زبان بزرگ ایجاد می‌کند.

from semantic_kernel.functions import kernel_function

class GetCurrentTimePlugin:
    async def __init__(self, location):
        self.location = location

    @kernel_function(
        description="Get the current time for a given location"
    )
    def get_current_time(location: str = ""):
        ...

from semantic_kernel import Kernel

# Create the kernel
kernel = Kernel()

# Create the plugin
get_current_time_plugin = GetCurrentTimePlugin(location)

# Add the plugin to the kernel
kernel.add_plugin(get_current_time_plugin)

سرویس عامل Azure AI

سرویس عامل Azure AI یک چارچوب عاملیک جدیدتر است که برای توانمندسازی توسعه‌دهندگان جهت ساخت، استقرار و مقیاس‌گذاری عوامل هوش مصنوعی با کیفیت بالا و قابل توسعه طراحی شده است، بدون نیاز به مدیریت منابع محاسباتی و ذخیره‌سازی زیرین. این سرویس به ویژه برای برنامه‌های سازمانی مفید است زیرا یک سرویس کاملاً مدیریت‌شده با امنیت درجه سازمانی است.

در مقایسه با توسعه با API مدل زبان بزرگ به طور مستقیم، سرویس عامل Azure AI برخی مزایا ارائه می‌دهد، از جمله:

ابزارهای موجود در سرویس عامل Azure AI به دو دسته تقسیم می‌شوند:

  1. ابزارهای دانش:
  2. ابزارهای عملیاتی:

سرویس عامل به ما امکان می‌دهد تا بتوانیم از این ابزارها به صورت یک مجموعه ابزار استفاده کنیم. همچنین از رشته‌ها استفاده می‌کند که تاریخچه پیام‌ها از یک مکالمه خاص را پیگیری می‌کنند.

تصور کنید شما یک عامل فروش در شرکتی به نام Contoso هستید. شما می‌خواهید یک عامل مکالمه‌ای توسعه دهید که بتواند به سوالات مربوط به داده‌های فروش شما پاسخ دهد.

تصویر زیر نشان می‌دهد که چگونه می‌توانید از سرویس عامل Azure AI برای تحلیل داده‌های فروش خود استفاده کنید:

سرویس عامل در عمل

برای استفاده از هر یک از این ابزارها با سرویس، می‌توانیم یک کلاینت ایجاد کرده و یک ابزار یا مجموعه ابزار تعریف کنیم. برای پیاده‌سازی این به صورت عملی، می‌توانیم از کد پایتون زیر استفاده کنیم. مدل زبان بزرگ قادر خواهد بود مجموعه ابزار را بررسی کند و تصمیم بگیرد که آیا از تابع ایجاد شده توسط کاربر، 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 function which can be found in a fetch_sales_data_functions.py file.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

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

# Initialize function calling agent with the fetch_sales_data_using_sqlite_query function and adding it to the toolset
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset = ToolSet()
toolset.add(fetch_data_function)

# Initialize Code Interpreter tool and adding it to the toolset. 
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset = ToolSet()
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 که به صورت پویا توسط مدل‌های زبان بزرگ تولید می‌شود، امنیت است، به ویژه خطر تزریق SQL یا اقدامات مخرب، مانند حذف یا دستکاری پایگاه داده. در حالی که این نگرانی‌ها معتبر هستند، می‌توان آن‌ها را با پیکربندی صحیح مجوزهای دسترسی پایگاه داده به طور مؤثر کاهش داد. برای اکثر پایگاه‌های داده، این شامل پیکربندی پایگاه داده به صورت فقط خواندنی است. برای خدمات پایگاه داده مانند PostgreSQL یا Azure SQL، برنامه باید نقش فقط خواندنی (SELECT) اختصاص داده شود. اجرای برنامه در یک محیط امن، حفاظت را بیشتر تقویت می‌کند. در سناریوهای سازمانی، داده‌ها معمولاً از سیستم‌های عملیاتی استخراج و به یک پایگاه داده فقط خواندنی یا انبار داده با یک طرح کاربرپسند تبدیل می‌شوند. این روش تضمین می‌کند که داده‌ها امن، بهینه برای عملکرد و دسترسی هستند و برنامه دسترسی محدود و فقط خواندنی دارد.

سوالات بیشتری درباره الگوهای طراحی ابزار دارید؟

به Discord Azure AI Foundry بپیوندید تا با دیگر یادگیرندگان ملاقات کنید، در ساعات اداری شرکت کنید و سوالات خود درباره عوامل هوش مصنوعی را پاسخ دهید.

منابع اضافی

درس قبلی

درک الگوهای طراحی عاملی

درس بعدی

Agentic RAG


سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌هایی باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.