AI Agents

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

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

فراخوانی ابزار چیست؟

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

معماری حلقه عامل

پیاده‌سازی فراخوانی ابزار نیازمند یک الگوی معماری خاص است که اغلب به عنوان حلقه ReAct (استدلال و عمل) یا یک حلقه فراخوانی تابع ساده شناخته می‌شود. جریان کار معمولاً شامل سه مرحله است:

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

پیاده‌سازی عملی با پایتون

بیایید یک مثال عملی با استفاده از پایتون بررسی کنیم. ما یک ابزار ساده تعریف می‌کنیم که وضعیت فعلی آب‌وهوا را محاسبه می‌کند. توجه داشته باشید که اگرچه چارچوب‌های زیادی مانند LangChain وجود دارند، اما درک ساختار خام JSON برای اشکال‌زدایی و بهینه‌سازی حیاتی است.

import json

def get_weather(location: str) -> str:
    """
    یک ابزار ساده برای دریافت داده‌های آب‌وهوا.
    در یک سناریوی واقعی، این تابع یک API خارجی را فراخوانی می‌کند.
    """
    if location == "London":
        return "60 degrees, cloudy"
    return "Unknown location"

# تعریف طرحواره ابزار برای LLM
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "دریافت وضعیت فعلی آب‌وهوا برای یک مکان خاص",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "شهر و ایالت، مثلاً San Francisco, CA"
                    }
                },
                "required": ["location"]
            }
        }
    }
]

user_query = "What's the weather like in London?"

# ساختار فرضی پاسخ LLM
llm_response = {
    "content": None,
    "tool_calls": [
        {
            "id": "call_123",
            "type": "function",
            "function": {
                "name": "get_weather",
                "arguments": '{"location": "London"}'
            }
        }
    ]
}

# اجرای ابزار
if llm_response['tool_calls']:
    tool_call = llm_response['tool_calls'][0]
    tool_name = tool_call['function']['name']
    tool_args = json.loads(tool_call['function']['arguments'])
    
    if tool_name == "get_weather":
        result = get_weather(**tool_args)
        print(f"Tool Output: {result}")
        
    # بازگرداندن نتیجه به LLM برای تولید پاسخ نهایی
    # final_response = llm.generate(content=f"Result: {result}")

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

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

نتیجه‌گیری

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

Share: