راهنمای کامل Function Calling در API ChatGPT: ساخت ابزارهای هوشمند

Function Calling در ChatGPT API

فهرست مطلب

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

Function Calling چیست و چرا اصلاً به آن نیاز داریم؟

مدل‌های زبانی مثل GPT فقط روی متن آموزش دیده‌اند؛ آن‌ها نمی‌توانند مستقیم به اینترنت وصل شوند، دیتابیس شما را بخوانند، یا یک ایمیل واقعی ارسال کنند. Function Calling راهی است که به مدل اجازه می‌دهد بگوید «من برای پاسخ دادن به این سوال، به این تابع با این پارامترها نیاز دارم»، و بعد برنامه‌ی شما آن تابع را اجرا می‌کند و نتیجه را برمی‌گرداند. به این ترتیب مدل می‌تواند به سیستم‌های خارجی، APIها و داده‌های زنده دسترسی پیدا کند، بدون اینکه خودش مستقیماً کدی اجرا کند.

تفاوت Function Calling با Tool Calling

احتمالاً در مستندات OpenAI با هر دو اصطلاح Function Calling و Tool Calling مواجه شده‌اید و گیج شده‌اید که کدام درست است. خبر خوب این است که این دو اصطلاح عملاً به یک چیز اشاره می‌کنند. در نسخه‌های قدیمی‌تر API chat GPT از پارامتر functions استفاده می‌شد، اما الان این پارامتر منسوخ شده و جای خود را به پارامتر tools داده است. در طول این مقاله از واژه‌ی «Function Calling» استفاده می‌کنیم چون همچنان رایج‌تر است، اما تمام نمونه کدها از ساختار جدید tools پیروی می‌کنند.

مدل چه کاری انجام می‌دهد و چه کاری انجام نمی‌دهد؟

نکته‌ی بسیار مهمی که باید همیشه در ذهن داشته باشید: مدل هیچ‌وقت کد شما را اجرا نمی‌کند. کار مدل فقط این است که تشخیص بدهد کدام تابع باید صدا زده شود و چه آرگومان‌هایی باید به آن پاس داده شود، و این اطلاعات را در قالب یک JSON ساختاریافته برمی‌گرداند. اجرای واقعی تابع، کنترل امنیتی، و ارسال نتیجه به مدل، همگی وظیفه‌ی برنامه‌ی شماست. این جداسازی دقیقاً همان چیزی است که Function Calling را امن و قابل کنترل می‌کند.

فرآیند گام‌به‌گام Function Calling چطور پیش می‌رود؟

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

مرحله اول: معرفی توابع به مدل

شما لیستی از توابع موجود را همراه با توضیح، نام پارامترها و نوع داده‌ی هرکدام، در قالب JSON Schema به مدل معرفی می‌کنید. این توضیحات همان چیزی است که مدل برای تشخیص اینکه «کِی» و «چطور» باید یک تابع را صدا بزند استفاده می‌کند. هرچه توضیحات شما دقیق‌تر و واضح‌تر باشد، تشخیص مدل هم دقیق‌تر خواهد بود.

مرحله دوم: تشخیص نیاز به ابزار توسط مدل

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

مرحله سوم: اجرای تابع توسط برنامه شما

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

مرحله چهارم: بازگرداندن نتیجه به مدل و دریافت پاسخ نهایی

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

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

بهترین راه برای یادگیری، دیدن یک مثال واقعی است. در ادامه یک نمونه‌ی ساده اما کامل با Python می‌بینید که نشان می‌دهد چطور یک تابع گرفتن وضعیت آب‌وهوا را به مدل معرفی می‌کنید.


from openai import OpenAI

client = OpenAI(api_key="YOUR_API_KEY")

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "دریافت وضعیت آب‌وهوای فعلی برای یک شهر مشخص",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "نام شهر، مثلا تهران یا اصفهان"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"]
                    }
                },
                "required": ["location"]
            }
        }
    }
]

messages = [
    {"role": "user", "content": "هوای تهران الان چطوره؟"}
]

response = client.chat.completions.create(
    model="gpt-5-4-mini",
    messages=messages,
    tools=tools
)

print(response.choices[0].message.tool_calls)

وقتی این کد را اجرا کنید، مدل به‌جای پاسخ متنی، یک شیء tool_calls برمی‌گرداند که شامل نام تابع (get_current_weather) و آرگومان {"location": "تهران"} است. حالا نوبت شماست که این تابع را واقعاً اجرا کنید و نتیجه را به مدل برگردانید.

ارسال نتیجه و گرفتن پاسخ نهایی

بعد از اجرای تابع، باید نتیجه را به‌عنوان یک پیام جدید با نقش tool به لیست پیام‌ها اضافه کنید و دوباره درخواست را به مدل بفرستید. کد زیر این مرحله را نشان می‌دهد:


# فرض کنید نتیجه تابع را گرفته‌ایم
weather_result = '{"temperature": "28", "condition": "آفتابی"}'

messages.append(response.choices[0].message)
messages.append({
    "role": "tool",
    "tool_call_id": response.choices[0].message.tool_calls[0].id,
    "content": weather_result
})

final_response = client.chat.completions.create(
    model="gpt-5-4-mini",
    messages=messages,
    tools=tools
)

print(final_response.choices[0].message.content)

خروجی نهایی چیزی شبیه به این خواهد بود: «هوای تهران الان آفتابیه و دما حدود ۲۸ درجه است.» همان‌طور که می‌بینید، مدل توانست داده‌ی واقعی را در یک پاسخ طبیعی و روان به کاربر تحویل دهد.

Structured Outputs و افزایش دقت فراخوانی توابع

یکی از مشکلات قدیمی Function Calling این بود که گاهی مدل آرگومان‌هایی برمی‌گرداند که دقیقاً با اسکیمای تعریف‌شده مطابقت نداشت؛ مثلاً یک فیلد را خالی می‌گذاشت یا نوع داده را اشتباه می‌فرستاد. با معرفی Structured Outputs، اگر گزینه‌ی strict: true را در تعریف تابع فعال کنید، مدل تضمین می‌دهد که خروجی دقیقاً مطابق با JSON Schema شما باشد. این یعنی دیگر نیازی به کدهای پیچیده برای اعتبارسنجی و رفع خطای ساختار داده ندارید.

Parallel Function Calling: اجرای چند ابزار همزمان

گاهی برای پاسخ به یک سوال، مدل به چند تابع مختلف به‌طور همزمان نیاز دارد. مثلاً اگر کاربر بپرسد «هوای تهران و مشهد چطور است؟»، مدل می‌تواند دو فراخوانی جدا برای هر شهر برگرداند که هر دو در یک پاسخ قرار دارند. این قابلیت به نام Parallel Function Calling شناخته می‌شود و باعث می‌شود برنامه‌ی شما بتواند چند درخواست را هم‌زمان پردازش کند و سرعت پاسخ‌دهی به‌شکل قابل توجهی افزایش پیدا کند.

جدول مقایسه: API های Function Calling در OpenAI

برای انتخاب درست API مناسب پروژه‌ی خود، باید بدانید کدام API چه ویژگی‌هایی را پشتیبانی می‌کند. جدول زیر یک مقایسه‌ی سریع از گزینه‌های موجود را ارائه می‌دهد:

API وضعیت پشتیبانی Function Calling توصیه
Responses API فعال و پیشنهادی کامل + MCP + Tool Search برای پروژه‌های جدید
Chat Completions API همچنان فعال پایه‌ای، بدون ابزارهای جدید برای پروژه‌های موجود
Assistants API منسوخ‌شده (تا اوت ۲۰۲۶) دارد، اما در حال جایگزینی مهاجرت به Responses API

نکات طلایی برای نوشتن توضیحات بهتر توابع

کیفیت Function Calling به‌شدت به کیفیت توضیحاتی که در JSON Schema می‌نویسید بستگی دارد. اگر توضیح تابع مبهم یا کلی باشد، مدل ممکن است اصلاً متوجه نشود چه زمانی باید از آن استفاده کند، یا آرگومان‌های اشتباه بفرستد. یکی از نکاتی که میتواند ریسک شما را پایین تر آورد استفاده از api هوش مصنوعی رایگان به عنوان تست و آزمایش است. همچنین در ادامه چند نکته‌ی کاربردی آورده‌ایم:

  • توضیحات (description) باید مشخص کنند تابع دقیقاً چه کاری انجام می‌دهد و چه زمانی باید استفاده شود.
  • برای پارامترهایی که مقادیر محدودی دارند، حتماً از enum استفاده کنید.
  • نام توابع را واضح و معنادار انتخاب کنید؛ مثلاً get_order_status بهتر از func1 است.
  • پارامترهای ضروری را با required مشخص کنید تا مدل آن‌ها را فراموش نکند.
  • تعداد توابع معرفی‌شده را معقول نگه دارید؛ تعداد بیش از حد می‌تواند دقت تشخیص را کاهش دهد.

ملاحظات امنیتی هنگام اجرای توابع

از آنجایی که نتیجه‌ی Function Calling می‌تواند منجر به اجرای عملیات واقعی در سیستم شما شود، رعایت چند اصل امنیتی الزامی است. هیچ‌وقت به مدل اعتماد کامل نکنید و همیشه آرگومان‌های دریافتی را قبل از اجرا اعتبارسنجی کنید.

تایید کاربر قبل از عملیات حساس

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

محدود کردن دسترسی توابع

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

کاربردهای واقعی Function Calling در محصولات

شاید بپرسید این همه پیچیدگی برای چه کاری به کار می‌آید؟ جواب این است: تقریباً هر ویژگی هوشمند که در محصولات امروزی می‌بینید! از دستیارهای رزرو هتل تا چت‌بات‌های پشتیبانی که می‌توانند سفارش شما را پیدا کنند، همه از همین الگو استفاده می‌کنند.

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

نتیجه‌گیری

Function Calling در ChatGPT API دروازه‌ای است که مدل‌های زبانی را از ابزارهای صرفاً گفت‌وگو به دستیارهای واقعی و کاربردی تبدیل می‌کند. وقتی این مکانیزم را به‌خوبی درک کنید، می‌توانید هر سیستم، دیتابیس یا API هوش مصنوعی دلخواهتان را به مدل متصل کنید و تجربه‌ای بسازید که واقعاً برای کاربر مفید است.

نکته‌ی کلیدی این است که همیشه توضیحات توابع را دقیق بنویسید، از Structured Outputs برای افزایش دقت استفاده کنید، و امنیت را در اولویت قرار دهید. با این اصول، می‌توانید ابزارهای هوشمندی بسازید که هم قدرتمند هستند و هم قابل اعتماد.

سوالات متداول (FAQ)

۱. آیا Function Calling فقط در مدل‌های جدید OpenAI پشتیبانی می‌شود؟

خیر، Function Calling از سال ۲۰۲۳ روی مدل‌های GPT-3.5 و GPT-4 هم در دسترس بود، اما مدل‌های جدیدتر دقت بسیار بالاتری در تشخیص و فراخوانی توابع دارند و قابلیت‌های پیشرفته‌تری مثل Tool Search را نیز پشتیبانی می‌کنند.

۲. آیا مدل می‌تواند به‌طور مستقیم به اینترنت یا دیتابیس من وصل شود؟

خیر، مدل هیچ دسترسی مستقیمی به سیستم‌های شما ندارد. مدل فقط درخواست فراخوانی یک تابع را برمی‌گرداند و برنامه‌ی شما مسئول اجرای واقعی آن تابع و دسترسی به منابع است.

۳. تفاوت Chat Completions API و Responses API در Function Calling چیست؟

Responses API نسخه‌ی جدیدتر و یکپارچه‌تری است که علاوه بر Function Calling، از ابزارهایی مثل جستجوی وب، جستجوی فایل و یکپارچگی با MCP نیز پشتیبانی می‌کند. برای پروژه‌های جدید توصیه می‌شود از Responses API استفاده کنید.

۴. اگر مدل آرگومان اشتباهی برگرداند چه باید کرد؟

فعال کردن گزینه‌ی strict: true در تعریف تابع (Structured Outputs) احتمال این خطا را به‌شدت کاهش می‌دهد. همچنین همیشه باید یک لایه‌ی اعتبارسنجی در کد خودتان داشته باشید تا آرگومان‌های دریافتی را قبل از اجرا بررسی کنید.

۵. آیا می‌توان چند تابع را همزمان به مدل معرفی کرد؟

بله، می‌توانید لیستی از چندین تابع را در پارامتر tools تعریف کنید. مدل بر اساس پیام کاربر تشخیص می‌دهد کدام تابع (یا توابع) مناسب هستند و حتی می‌تواند چند تابع را به‌صورت همزمان فراخوانی کند.