از مدل بپرسید «هوای الان تهران چند درجه است؟» و یک پاسخ روان بگیرید؛ اما پاسخی که با احتمال خوبی تاریخش قطع شده است. مدل زبانی به داده‌ی زنده، دیتابیس شما یا هیچ سیستمی دسترسی ندارد — همه‌چیزش از متن آموزش دیده آمده. Function Calling راه‌حل استاندارد این گره است: مدل خودش تابع را اجرا نمی‌کند، اما می‌تواند دقیقاً بنویسد کدام تابع با چه ورودی‌هایی باید اجرا شود و کار اجرا با برنامه‌ی شماست. همین قابلیت ساده، پلی است که مدل زبانی را از «چت‌روم» به «موتور تصمیم‌گیریِ وصل به دنیای واقعی» تبدیل می‌کند.

حلقه‌ی کار در چهار قدم

سازوکار Function Calling یک چرخه‌ی مشخص است و همه‌ی پیاده‌سازی‌ها — از ساده تا پیچیده — همین مسیر را طی می‌کنند:

  • ۱. معرفی ابزارها: در هر درخواست، کنار پیام‌ها، فهرست توابع موجود را با نام، توضیح و ساختار پارامترها به مدل می‌دهید.
  • ۲. تصمیم مدل: مدل اگر ببیند کار جاری به ابزاری نیاز دارد، به‌جای متن معمولی یک فراخوانی ساختاریافته برمی‌گرداند: «تابع get_weather با پارامتر city=تهران».
  • ۳. اجرا توسط شما: برنامه‌ی شما این پیشنهاد را می‌خواند، تابع واقعی را اجرا می‌کند — صدا زدن API هواشناسی، کوئری دیتابیس، هر چیزی.
  • ۴. بازگشت نتیجه: خروجی واقعی به‌عنوان پیام جدید به مدل داده می‌شود و این‌بار مدل جواب نهایی طبیعی را می‌سازد: «الان تهران ۱۴ درجه است و باران ملایم داریم.»

شکل فراخوانی که مدل تولید می‌کند همیشه یک JSON ساختاریافته است:

{
  "name": "get_weather",
  "arguments": { "city": "تهران", "unit": "celsius" }
}

نکته‌ی کلیدی: خود مدل هیچ‌چیز را اجرا نمی‌کند

شاید بزرگ‌ترین سوءتفاهم این حوزه همین باشد: مدل «به سیستم شما نفوذ نکرده» و هیچ تابعی را اجرا نمی‌کند؛ فقط برگه‌ی درخواست را پر می‌کند. تمام قدرت اجرا دست برنامه‌ی شماست و همین یک ویژگی امنیتی است، نه محدودیت: شما تصمیم می‌گیرید کدام پیشنهادها اجرا شوند، ورودی‌ها را قبل از اجرا اعتبارسنجی کنید و برای کارهای حساس — پرداخت، حذف داده، ارسال پیام به دیگران — تأیید انسانی بین برگه و اجرا بگذارید.

نتیجه‌ی عملی دیگرش این است که Function Calling هیچ زیرساخت جدیدی نمی‌خواهد: هر تابعی که در کدتان صدا زدنی است، در تئوری قابل‌معرفی به مدل است. مدل هوش «استفاده» را اضافه می‌کند؛ اجرا و دسترسی همان‌هاست که قبلاً داشتید.

مدل در Function Calling چیزی جز یک JSON ساختاریافته تولید نمی‌کند؛ بقیه‌ی کار — و همه‌ی مسئولیت اجرا — با برنامه‌ی شماست.

چرا «ساختاریافته» این‌قدر مهم است؟

راه قدیمیِ اتصال مدل به برنامه این بود: به مدل بگویید خروجی را با الگوی مشخص بنویسد و با regex یا نوار زدن، از داخل متن داده را بیرون بکشید. این راه شکننده است؛ یک جمله‌ی اضافه یا یک ویرگول جابه‌جا، parser را می‌شکند. Function Calling این لایه را استاندارد می‌کند: خروجی ابزار از همان ابتدا فیلدی از پاسخ است، نه متنی که باید از دلش دربیایید. سرعت توسعه بالا می‌رود و خطای parse عملاً از بین می‌رود.

و کاربردش فقط «ابزار» نیست: همان سازوکار برای استخراج داده هم عالی است — یک قرارداد، یک فاکتور یا یک ایمیل بدهید و بگذارید مدل فیلدهای تعریف‌شده را به‌شکل JSON پر کند. خیلی از سیستم‌های ورودداده‌ی خودکار که می‌بینید، در هسته‌شان همین تکنیک است.

تعریف خوب یک تابع، نصف کیفیت

مدل از روی چیزی که می‌بیند تصمیم می‌گیرد؛ و آن چیز فقط نام و توضیح توابع است. تعریف تابع شبیه شرح شغلی برای یک منشی توانمند است: اگر مبهم باشد، منشی تصمیم‌های عجیب می‌گیرد. سه قاعده‌ی عملی: توضیح تابع بگوید «کِی» استفاده شود نه فقط «چیست» («برای سؤال درباره‌ی وضعیت سفارش به کار می‌رود؛ برای قیمت‌گذاری نه»)؛ هر پارامتر توضیح و نوع دقیق داشته باشد؛ و تعداد ابزارها را کنترل کنید — ده‌ها تابع هم‌شبیه، احتمال انتخاب اشتباه را بالا می‌برد. اگر فهرست ابزارها بزرگ شد، اول از طریق جستجوی معنایی ابزارهای مرتبط را انتخاب کنید و فقط همان چند تا را به مدل بدهید.

و مثل هر بخش دیگر از سیستم، ارزیابی کنید: مجموعه‌ای از درخواست‌های واقعی بسازید و ببینید مدل در چند درصد موارد، تابع و پارامتر درست را انتخاب می‌کند — همان منطق سنجشی که در ارزیابی RAG به‌کار می‌رود، این‌بار روی انتخاب ابزار.

نسبتش با MCP و عامل‌ها چیست؟

این سه مفهوم لایه‌های روی هم‌اند، نه رقیب هم. Function Calling توانایی پایه‌ی مدل است: تولید فراخوانی ساختاریافته. MCP استاندارد اتصال است: به‌جای این‌که هر برنامه هر ابزار را با کد سفارشی معرفی و اجرا کند، ابزارها یک‌بار به‌شکل سرور MCP استاندارد ارائه می‌شوند و هر کلاینتی از آن‌ها استفاده می‌کند. و عامل حلقه‌ی کامل است: در حلقه‌ی فکر، ابزار، مشاهده، مدل زنجیره‌ای از فراخوانی‌ها را تصمیم می‌گیرد، نتیجه‌ی هر قدم را می‌بیند و مسیر را اصلاح می‌کند. Function Calling جنسِ قدم‌های این حلقه است؛ MCP استاندارد وصل‌شدن به ابزارها؛ عامل، معماری‌ای که همه را کنار هم می‌گذارد.

در API ماین‌دبیس که سازگار با فرمت OpenAI است، تعریف توابع با همان فیلد استاندارد tools انجام می‌شود؛ یعنی همان کدی که برای سرویس‌دهنده‌های دیگر نوشته‌اید، بدون تغییر این‌جا هم کار می‌کند. برای دیدن تصویر کامل یک سیستم عامل‌محور، ساخت اولین عامل همین حلقه را گام‌به‌گام می‌سازد.

جمع‌بندی

Function Calling یعنی مدل به‌جای متن آزاد، فراخوانی تابع ساختاریافته تولید کند: شما ابزارها را معرفی می‌کنید، مدل تصمیم می‌گیرد کدام با چه ورودی‌هایی لازم است، اجرا و مسئولیت با برنامه‌ی شماست و نتیجه برای ساخت پاسخ نهایی به مدل برمی‌گردد. سه پیام عملی: تعریف توابع را مثل شرح شغل جدی بنویسید؛ ورودی‌ها را قبل از اجرا اعتبارسنجی کنید؛ و کارهای حساس را پشت تأیید انسانی نگه دارید. مسیر بعدی: ساخت اولین عامل هوش مصنوعی — جایی که همین قابلیت، به‌شکل حلقه‌ی کامل فکر و ابزار و مشاهده در می‌آید.