Prompt Engineering

استفاده عملی از ابزارها: انتخاب و یکپارچه‌سازی APIهای خارجی برای وظایف LLM در دنیای واقعی

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

چرا استفاده از ابزار برای برنامه‌های عملیاتی حیاتی است

تکیه صرف بر داده‌های آموزشی مدل منجر به توهم (Hallucination) می‌شود، به‌ویژه زمانی که دقت مورد نیاز است. با در دسترس قرار دادن ابزارهای خاص—مانند یک نقطه پایانی REST API، یک تولیدکننده کوئری SQL یا یک ماشین‌حساب—فضای خروجی مدل را محدود می‌کنید. این کار نه تنها دقت را بهبود می‌بخشد، بلکه لایه‌ای از امنیت و کنترل نیز اضافه می‌کند. مدل به عنوان یک مسیری عمل می‌کند که تصمیم می‌گیرد کی و چه ابزاری را بر اساس قصد کاربر استفاده کند، به جای اینکه سعی کند حقایقی را حدس بزند که ممکن است نداند.

انتخاب طرحواره (Schema) ابزار مناسب

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

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

  • انواع صریح: از تعاریف طرحواره JSON سخت‌گیرانه برای تمام پارامترها استفاده کنید. از رشته‌های با تایپ شل خودداری کنید، جایی که اعداد صحیح یا بولین مورد انتظار است.
  • نام‌های توصیفی: نام ابزارها باید جفت‌های فعل-مفعول باشند (مثلاً get_weather_forecast به جای فقط weather).
  • توضیحات مختصر: فیلد توضیحات چیزی است که LLM می‌خواند تا تصمیم بگیرد آیا باید از ابزار استفاده کند یا خیر. آن را واضح و عمل‌گرا نگه دارید.

پیاده‌سازی اجرای ابزار: یک مثال پایتون

بیایید یک پیاده‌سازی عملی را با استفاده از پایتون و یک API آب‌وهوای فرضی بررسی کنیم. ما ابزار را تعریف می‌کنیم، آن را به LLM ارسال می‌کنیم و پاسخ فراخوانی تابع را مدیریت می‌کنیم.

import openai
import json

# Define the tool schema
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"]
                    }
                },
                "required": ["location"],
            },
        }
    }
]

# Simulate user input
user_message = "What is the weather in Tokyo today in celsius?"

# 1. Send request to LLM with tools
response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": user_message}],
    tools=tools
)

# 2. Check if the model wants to call a tool
message = response.choices[0].message
if hasattr(message, 'tool_calls') and message.tool_calls:
    # 3. Execute the actual Python function
    tool_call = message.tool_calls[0]
    args = json.loads(tool_call.function.arguments)
    
    # In a real app, this would be an HTTP request
    def get_current_weather(location, unit='fahrenheit'):
        return {"temperature": 22, "unit": unit}
        
    result = get_current_weather(args['location'], args.get('unit', 'celsius'))
    
    # 4. Send the result back to the LLM to generate a natural language response
    messages = [
        {"role": "user", "content": user_message},
        message, # The model's initial response with tool call
        {
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": str(result) # The output of the function
        }
    ]
    
    final_response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=messages
    )
    print(final_response.choices[0].message.content)

مدیریت خطاها و موارد حاشیه‌ای

در محیط عملیاتی، فراخوانی‌های API شکست می‌خورند. زمان‌های انتظار شبکه، محدودیت‌های نرخ (Rate Limits) و توکن‌های احراز هویت نامعتبر اجتناب‌ناپذیر هستند. یک معماری عامل قوی باید این خطاها را بگیرد و آن‌ها را به LLM بازگرداند. با ارائه پیام خطا به عنوان content پاسخ ابزار، به مدل اجازه می‌دهید تصمیم بگیرد که آیا باید با پارامترهای مختلف تلاش مجدد کند، از کاربر برای شفاف‌سازی بپرسد یا شکست را به کاربر نهایی توضیح دهد.

نتیجه‌گیری

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

Share: