مدلهای زبانی بزرگ (LLMs) از تولیدکنندگان ساده متن به موتورهای استدلال قدرتمند تبدیل شدهاند. با این حال، پتانسیل واقعی آنها زمانی آزاد میشود که بتوانند با دنیای بیرون تعامل داشته باشند. این قابلیت به نام فراخوانی ابزار (یا فراخوانی تابع) شناخته میشود. برای توسعهدهندگان متوسط تا پیشرفته که عاملهای هوش مصنوعی میسازند، درک مکانیکهای فراخوانی ابزار نه یک انتخاب، بلکه یک پیشنیاز است.
در این پست، نحوه عملکرد فراخوانی ابزار، اهمیت حیاتی آن در معماری عاملها و نحوه پیادهسازی مؤثر آن با استفاده از ساختارهای API مدرن را بررسی خواهیم کرد.
فراخوانی ابزار چیست؟
به طور سنتی، LLMها به تولید متن در محدوده دادههای آموزشی خود محدود بودند. فراخوانی ابزار این سقف شیشهای را میشکند و به مدل اجازه میدهد دادههای ساختاریافتهای را که نمایانگر یک فراخوانی تابع هستند، خروجی دهد. به جای توهمسازی (hallucination) یک نتیجه، مدل وظیفه را به یک برنامه خارجی واگذار میکند.
مدل زبانی بزرگ را به عنوان مغز و ابزارها را به عنوان دستها در نظر بگیرید. مغز تصمیم میگیرد که چه کاری باید انجام شود، اما دستها عمل فیزیکی را انجام میدهند؛ چه این کار پرسوجو از پایگاه داده باشد، ارسال ایمیل یا اجرای عملیات ماشینحساب.
نحوه عملکرد: پروتکل دست دادن
این فرآیند از یک حلقه سختگیرانه پیروی میکند:
- ورودی کاربر: کاربر سوالی میپرسد که به دادههای خارجی نیاز دارد.
- تحلیل مدل: LLM پرامپت را تحلیل میکند و تعیین میکند که آیا به یک ابزار از پیش تعریف شده نیاز است یا خیر.
- خروجی ساختاریافته: اگر به ابزاری نیاز باشد، مدل یک شیء JSON را که تابع و آرگومانهای آن را توصیف میکند، به جای یک پاسخ گفتگویی، برمیگرداند.
- اجرا: بکاند برنامه تابع را با آرگومانهای ارائه شده اجرا میکند.
- تزریق پاسخ: نتیجه به LLM ارسال میشود تا یک خلاصه به زبان طبیعی برای کاربر تولید کند.
تعریف ابزارها: یک مثال عملی
هنگام پیادهسازی فراخوانی ابزار، باید تعریف طرحواره (schema) را به LLM ارائه دهید. این طرحواره به عنوان قرارداد بین کد شما و مدل عمل میکند. در زیر نمونهای از نحوه تعریف یک ابزار برای بازیابی دادههای آبوهوا با استفاده از ساختار API OpenAI آورده شده است.
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"],
"description": "The temperature unit to use"
}
},
"required": ["location"]
}
}
}
]
به فیلد required توجه کنید. این بخش حیاتی است. این به مدل میگوید که location الزامی است و احتمال فراخوانی تابع توسط مدل با دادههای ناقص را کاهش میدهد.
بهترین شیوهها برای معماریهای عاملهای مقاوم
اگرچه فراخوانی ابزار قدرتمند است، اما تأخیر و پیچیدگی را نیز به همراه دارد. برای ساخت عاملهای آماده تولید، موارد زیر را در نظر بگیرید:
۱. مستندات توصیفی
فیلدهای description در طرحوارههای ابزار شما، سیگنال اصلی برای مدل هستند. پرجزئیته باشید. به جای گفتن "دریافت داده"، بگویید "دریافت آخرین آمار فروش برای شناسه محصول مشخص شده از CRM داخلی". وضوح، توهمسازی را کاهش میدهد.
۲. مدیریت خطا و منطق تلاش مجدد
APIهای خارجی شکست میخورند. اگر اجرای ابزار شما خطایی ایجاد کند، عامل را متوقف نکنید. پیام خطا را به LLM بازگردانید. مدل اغلب میتواند رویکرد خود را اصلاح کند. برای مثال، اگر مدل فرمت تاریخ نامعتبری ارسال کند، پاسخ خطا میتواند LLM را برای تلاش مجدد با فرمت اصلاح شده ترغیب کند.
۳. امنیت و اعتبارسنجی
هرگز به آرگومانهای LLM به صورت کورکورانه اعتماد نکنید. همیشه پیکربندی JSON را در بکاند بر اساس طرحواره خود اعتبارسنجی کنید. علاوه بر این، مجوزهای سختگیرانه را پیادهسازی کنید. اگر ابزاری به پایگاه داده مینویسد، اطمینان حاصل کنید که تابع اجراکننده دارای اعتبارنامههای محدود شده (scoped-down) است.
نتیجهگیری
فراخوانی ابزار، پل ارتباطی بین هوش مصنوعی مولد و نرمافزار عملیاتی است. با امکان فراخوانی توابع توسط LLMها، توانایی ساخت عاملهایی را آزاد میکنیم که میتوانند تحقیق کنند، محاسبات انجام دهند و با سیستمهای دیجیتال تعامل داشته باشند. با بالغتر شدن اکوسیستم، انتظار چارچوبهای هماهنگی پیچیدهتری را داشته باشید که زنجیرههای ابزار چندمرحلهای پیچیده را مدیریت میکنند. تسلط بر اصول پایه امروز، شما را برای آیندهای که توسط عاملها هدایت میشود، آماده میکند.