Prompt Engineering

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

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

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

درک معماری

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

  1. تعریف: توسعه‌دهنده مجموعه‌ای از تعاریف تابع (اسکیماها) را به مدل ارائه می‌دهد که معمولاً به فرمت JSON هستند. این اسکیماها نام تابع، توضیحات و پارامترهای مورد انتظار را توصیف می‌کنند.
  2. استدعاء: کاربر یک پرس‌وجو ارسال می‌کند. مدل زبانی بزرگ درخواست را تحلیل کرده و در صورت نیاز، تعیین می‌کند که برای پاسخ به پرس‌وجو به فراخوانی یک تابع نیاز است. به جای تولید متن، مدل یک پیکربندی JSON ساختاریافته شامل نام تابع و آرگومان‌های آن را برمی‌گرداند.
  3. اجرا: بک‌اند برنامه این پیکربندی JSON را دریافت کرده، تابع واقعی را در کد میزبان (مانند Python یا JavaScript) اجرا می‌کند و نتیجه را بازیابی می‌کند.
  4. پاسخ: نتیجه در پیامی بعدی به مدل زبانی بزرگ ارسال می‌شود، که به مدل امکان می‌دهد پاسخ نهایی و دقیقی را برای کاربر سنتز کند.

مثال پیاده‌سازی

بیایید یک مثال عملی با استفاده از API اوپن‌ای‌آی (OpenAI) بررسی کنیم. فرض کنید ما در حال ساخت یک دستیار آب‌وهوا هستیم. ما نیاز داریم تابعی را تعریف کنیم که داده‌های آب‌وهوا را دریافت کند.

import openai

# Define the function schema
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g., San Francisco, CA"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"]
                    }
                },
                "required": ["location"]
            }
        }
    }
]

# User query
messages = [{"role": "user", "content": "What's the weather like in Tokyo?"}]

# Call the API
response = openai.chat.completions.create(
    model="gpt-4-turbo",
    messages=messages,
    tools=tools,
    tool_choice="auto"
)

# Check if the model wants to call a function
response_message = response.choices[0].message
tool_calls = response_message.tool_calls

if tool_calls:
    # The model has requested a function call
    available_functions = {
        "get_weather": get_weather_from_api
    }
    
    # Execute the function
    function_name = tool_calls[0].function.name
    function_args = json.loads(tool_calls[0].function.arguments)
    function_response = available_functions[function_name](**function_args)
    
    # Send response back to the model
    messages.append(response_message) # Add assistant message
    messages.append({
        "tool_call_id": tool_calls[0].id,
        "role": "tool",
        "name": function_name,
        "content": function_response
    })
    
    # Get final answer
    second_response = openai.chat.completions.create(
        model="gpt-4-turbo",
        messages=messages
    )
    print(second_response.choices[0].message.content)

بهترین شیوه‌ها برای استحکام

در حالی که مفهوم آن ساده است، پیاده‌سازی در محیط تولید نیازمند توجه دقیق به جزئیات است:

  • طراحی اسکیما معنایی: اسکیماهای JSON شما باید دقیق باشند. برای مقادیر محدود شده از enum استفاده کنید و فیلدهای description دقیق ارائه دهید. مدل زبانی بزرگ کاملاً به این توضیحات برای تعیین زمان فراخوانی یک تابع تکیه دارد.
  • مدیریت خطا: درخواست‌های شبکه به APIهای خارجی ممکن است شکست بخورند. مطمئن شوید بک‌اند شما این خطاها را دریافت کرده و آن‌ها را به عنوان یک پیام با role: "tool" و وضعیت خطا به مدل زبانی بزرگ باز می‌گرداند. این امر به مدل امکان می‌دهد تلاش مجدد انجام دهد یا به صورت شایسته کاربر را مطلع کند.
  • سانیتیزه کردن امنیتی: هرگز آرگومان‌های تابع دریافتی از یک مدل زبانی بزرگ را به صورت کورکورانه اجرا نکنید. قبل از اجرا، تمام ورودی‌ها را با انواع و محدودیت‌های داخلی خود اعتبارسنجی کنید تا از حملات تزریق جلوگیری شود.

نتیجه‌گیری

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

Share: