Prompt Engineering

فراتر از متن: تسلط بر فراخوانی توابع در برنامه‌های مدل‌های زبانی بزرگ

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

درک حلقه فراخوانی توابع

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

  1. تعریف ابزار: شما یک اسکیم (معمولاً JSON) را به LLM ارائه می‌دهید که توابع موجود، نام‌ها، توضیحات و پارامترهای آن‌ها را تعریف می‌کند.
  2. پرسش کاربر: کاربر سوالی می‌پرسد یا دستوری می‌دهد.
  3. تصمیم مدل: LLM درخواست را تحلیل می‌کند و تعیین می‌کند که آیا تابعی مورد نیاز است یا خیر. یک خروجی ساختاریافته مشخص می‌کند که کدام تابع باید فراخوانی شود و چه آرگومان‌هایی باید استفاده شوند.
  4. اجرا: کد برنامه شما این خروجی ساختاریافته را دریافت می‌کند، آن را تجزیه می‌کند و در واقع تابع را اجرا می‌کند (مثلاً انجام یک درخواست HTTP).
  5. تکمیل پاسخ: نتیجه اجرای تابع به LLM ارسال می‌شود، که سپس یک پاسخ نهایی به زبان طبیعی برای کاربر ترکیب می‌کند.

تعریف ابزارها: هنر اسکیم‌ها

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

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_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"],
                        "description": "The temperature unit to use. Infer this from the user's location."
                    }
                },
                "required": ["location"]
            }
        }
    }
]

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

پیاده‌سازی عملی در Python

در اینجا یک مثال ساده‌شده از نحوه مدیریت حلقه فراخوانی توابع با استفاده از یک کلاینت API فرضی آورده شده است. توجه داشته باشید که LLM هرگز تابع Python را اجرا نمی‌کند؛ فقط تصمیم می‌گیرد که آن را فراخوانی کند.

import json
from openai import OpenAI

client = OpenAI()

def get_weather(location, unit="fahrenheit"):
    # Placeholder for actual API call
    return f"The weather in {location} is sunny and {72 if unit == 'fahrenheit' else 22} degrees."

# Initial chat
response = client.chat.completions.create(
    model="gpt-4o",
    tools=tools,
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What's the weather like in Boston?"}
    ]
)

# Check if the model wants to call a function
if response.choices[0].message.tool_calls:
    tool_call = response.choices[0].message.tool_calls[0]
    
    # Parse arguments
    function_name = tool_call.function.name
    arguments = json.loads(tool_call.function.arguments)
    
    # Execute the actual function
    if function_name == "get_current_weather":
        result = get_weather(**arguments)
    else:
        result = "Unknown function"
    
    # Send result back to the model
    final_response = client.chat.completions.create(
        model="gpt-4o",
        tools=tools,
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "What's the weather like in Boston?"},
            {"role": "assistant", "content": response.choices[0].message.content},
            {"role": "tool", "tool_call_id": tool_call.id, "content": result}
        ]
    )
    print(final_response.choices[0].message.content)

بهترین روش‌ها برای سیستم‌های تولیدی

  1. توضیحات را شفاف و مختصر نگه دارید: LLM این توضیحات را می‌خواند. از ابهام پرهیز کنید. اگر پارامترها پیچیده هستند، از مثال‌ها استفاده کنید.
  2. تعداد ابزارها را محدود کنید: گزینه‌های بیش از حد می‌توانند مدل را گیج کنند. ابزارهای مرتبط را گروه‌بندی کنید یا از یک مدل "مسیریاب" برای انتخاب مجموعه ابزار مناسب استفاده کنید.
  3. خطاها را با ظرافت مدیریت کنید: اگر تابعی شکست بخورد (مثلاً زمان‌بندی شبکه)، پیام خطا را به LLM بازگردانید. اغلب می‌تواند عذرخواهی کند یا جایگزینی پیشنهاد دهد.
  4. ورودی‌ها را اعتبارسنجی کنید: هرگز به صورت کورکورانه به خروجی LLM اعتماد نکنید. قبل از انجام هر عملیات حساسی، انواع و محدوده‌ها را اعتبارسنجی کنید.

نتیجه‌گیری

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

Share: