مدلهای زبانی بزرگ (LLMs) از تولیدکنندگان متن ایستا به موتورهای پویایی تبدیل شدهاند که قادر به انجام وظایف پیچیده هستند. با این حال، قدرت واقعی آنها در ساخت عاملهای هوش مصنوعی مستحکم از طریق مکانیسمی به نام فراخوانی تابع (Function Calling) (که به عنوان استفاده از ابزار یا فراخوانی عمل نیز شناخته میشود) آزاد میشود. این ویژگی به مدلها اجازه میدهد تا با دنیای خارج تعامل داشته باشند و آنها را از پاسخدهندگان منفعل به حلکنندگان فعال مشکلات تبدیل کند.
فراخوانی تابع چیست؟
در هسته خود، فراخوانی تابع یک رابط ساختاریافته بین LLM و منطق بکاند (Backend) برنامه شماست. به جای مجبور کردن مدل به توهمپردازی (Hallucination) یا نیاز به تجزیه متن نامنظم، شما یک طرحواره (Schema) که توابع موجود را توصیف میکند به مدل ارائه میدهید. مدل سپس تصمیم میگیرد که کدام تابع را فراخوانی کند و استدلالهای لازم را از درخواست کاربر استخراج نماید.
برای مثال، اگر کاربر بپرسد: «وضعیت آب و هوای لندن چگونه است؟»، مدل میتواند تشخیص دهد که دادههای بلادرنگ را در اختیار ندارد. به جای حدس زدن، میتواند یک درخواست ساختاریافته برای فراخوانی تابع get_weather تولید کند. برنامه شما سپس این تابع را اجرا کرده، پاسخ JSON بلادرنگ را دریافت میکند و آن را برای خلاصهسازی به زبان طبیعی به مدل بازمیگرداند.
تعریف طرحواره
پایه و اساس فراخوانی تابع مؤثر، تعریف دقیق طرحواره JSON است. این طرحواره به عنوان یک قرارداد عمل میکند و اطمینان حاصل میکند که مدل ورودیها و انواع خروجی مورد نیاز را درک میکند. دقت در اینجا حیاتی است؛ طرحوارههای مبهم منجر به شکست فراخوانیها یا استخراج نادرست استدلالها میشوند.
یک طرحواره ساده برای مبدل ارز را در نظر بگیرید:
{
"name": "convert_currency",
"description": "Converts an amount from one currency to another.",
"parameters": {
"type": "object",
"properties": {
"amount": {
"type": "number",
"description": "The numeric value to convert."
},
"from_currency": {
"type": "string",
"description": "The source currency code (e.g., USD, EUR)."
},
"to_currency": {
"type": "string",
"description": "The target currency code."
}
},
"required": ["amount", "from_currency", "to_currency"]
}
}
حلقه گفتگو
پیادهسازی فراخوانی تابع نیازمند یک جریان گفتگوی خاص است. شما نمیتوانید صرفاً درخواست کاربر را ارسال کنید و انتظار داشته باشید که پاسخ نهایی در یک مرحله دریافت شود. این فرآیند معمولاً شامل سه مرحله متمایز است:
- درخواست اولیه: کاربر یک درخواست ارسال میکند. LLM آن را تحلیل کرده و تعیین میکند که آیا نیاز به فراخوانی تابع وجود دارد یا خیر. در صورت وجود، یک پاسخ ساختاریافته شامل نام تابع و استدلالها را بازمیگرداند.
- اجرا: کد بکاند شما فراخوانی تابع را تشخیص داده، منطق واقعی (مانند پرسوجو از پایگاه داده یا یک API خارجی) را اجرا میکند و نتیجه را ثبت مینماید.
- تغذیه زمینه: شما نتیجه اجرای تابع را به عنوان یک پیام «خروجی ابزار» به تاریخچه گفتگو اضافه کرده و آن را به LLM ارسال میکنید.
در اینجا یک قطعه کد مفهومی وجود دارد که این حلقه را با استفاده از یک ساختار کتابخانه شبهکد نشان میدهد:
def handle_llm_interaction(user_prompt, history):
# Step 1: Send prompt to LLM with function definitions
response = llm.chat(messages=history, functions=weather_functions)
if response.has_function_calls():
for call in response.function_calls:
# Step 2: Execute the function on the backend
result = execute_function(call.name, call.arguments)
# Step 3: Add function result to history
history.append({
"role": "function",
"name": call.name,
"content": str(result)
})
# Step 4: Send updated history back to LLM for final answer
final_response = llm.chat(messages=history)
return final_response.text
return response.text
بهترین شیوهها برای محیط تولید
در حالی که فراخوانی تابع توسعه عاملها را ساده میکند، پیچیدگیهای جدیدی نیز ایجاد میکند. اول، همیشه خطاها را به صورت شایسته مدیریت کنید. اگر تابعی به دلیل مشکلات شبکه یا دادههای نامعتبر شکست بخورد، یک پیام خطا را در فیلد «محتوا» بازگردانید تا LLM بتواند کاربر را به درستی مطلع کند. دوم، از نمایش بیش از حد توابع خودداری کنید. هر ابزار اضافی بار شناختی مدل را افزایش داده و ممکن است منجر به زمانهای پاسخدهی کندتر یا «رقیق شدن توجه» شود. در نهایت، استدلالها را در سمت سرور اعتبارسنجی کنید. هرگز استخراج LLM را به صورت ضمنی قابل اعتماد نباشید؛ اطمینان حاصل کنید که انواع دادهها به شدت با طرحواره شما مطابقت دارند.
نتیجهگیری
فراخوانی تابع پل بین دانش ایستا نهفته در وزنهای LLM و دادههای دنیای واقعی و بلادرنگی است که از طریق APIها در دسترس هستند. با تسلط بر این الگو، توسعهدهندگان میتوانند عاملهایی بسازند که نه تنها قصد کاربر را درک میکنند، بلکه بر اساس آن نیز عمل مینمایند. با بالغ شدن اکوسیستم، ابزارهایی مانند LangChain و LlamaIndex به ابستره کردن بخش زیادی از کدهای تکراری ادامه خواهند داد و به مهندسان اجازه میدهند تا بر طراحی جریانهای کاری هوشمند و قابل اعتمادی که مشکلات واقعی کاربران را حل میکنند، تمرکز کنند.