OpenAI Function Calling قابلیتی است که به مدلهای زبانی اجازه میدهد بهجای تولید صرف متن، تصمیم بگیرند چه زمانی باید یک تابع مشخص با ورودی ساختاریافته فراخوانی شود. این قابلیت در واقع پلی بین مدلهای زبانی و دنیای واقعی ایجاد میکند؛ جایی که خروجی مدل میتواند به اجرای کد، دریافت داده از API یا انجام یک عملیات واقعی منجر شود. Function Calling باعث میشود مدلها از یک سیستم پاسخدهنده متنی ساده، به بخشی از یک سیستم هوشمند و قابل کنترل تبدیل شوند.
در این مقاله ابتدا توضیح میدهیم Function Calling چیست و چه مشکلی را حل میکند، سپس تفاوت آن با Tool Calling را بررسی میکنیم. بعد از آن، نحوه کار Function Calling را بهصورت مفهومی و سپس با مثالهای کدنویسی واقعی توضیح میدهیم. در ادامه به ساختار JSON Schema، مثالهای پیشرفتهتر، چالشها و اشتباهات رایج میپردازیم و در نهایت جایگاه Function Calling در Agentها و آینده سیستمهای مبتنی بر هوش مصنوعی را بررسی میکنیم.
Function Calling چیست؟

Function Calling (که با نام Tool Calling نیز شناخته میشود) قابلیتی در مدلهای OpenAI است که امکان تعامل مستقیم مدل با سیستمهای خارجی و دسترسی به دادههایی خارج از دادههای آموزشی آن را فراهم میکند. به کمک Function Calling، مدل میتواند تشخیص دهد چه زمانی برای پاسخ دادن به یک درخواست، لازم است بهجای تولید متن، یک «عمل» مشخص انجام شود؛ عملی مثل فراخوانی یک تابع، دریافت داده از API یا اجرای منطق برنامهنویسی در سمت سرور.
در این رویکرد، توسعهدهنده مجموعهای از ابزارها یا توابع را در اختیار مدل قرار میدهد. این توابع معمولا با استفاده از JSON Schema تعریف میشوند تا ساختار ورودیها و خروجیها برای مدل کاملا شفاف باشد. زمانی که کاربر یک درخواست ارسال میکند، مدل OpenAI تصمیم میگیرد آیا باید از یکی از این ابزارها استفاده کند یا خیر و در صورت نیاز، نام تابع و ورودیهای مناسب آن را بهصورت ساختاریافته تولید میکند. سپس این دادهها توسط برنامه اجرا شده و نتیجه دوباره به مدل بازگردانده میشود.
در مستندات جدید OpenAI، اصطلاح Tool Calling بهعنوان یک مفهوم عمومیتر معرفی شده است که Function Calling یکی از مصادیق اصلی آن محسوب میشود. به بیان ساده، هر Function یک Tool است، اما Toolها میتوانند فراتر از توابع ساده باشند و ورودیها و خروجیهای متنی آزاد نیز داشته باشند. در این مقاله، برای سادگی و هماهنگی با منابع رایج، از اصطلاح Function Calling استفاده میکنیم؛ با این درک که منظور همان مکانیزم Tool Calling در OpenAI است.
چرا OpenAI Function Calling مهم است؟
اهمیت Function Calling در این است که مدلهای زبانی را از حالت «پاسخدهنده متنی» خارج میکند و آنها را به تصمیمگیرندههایی تبدیل میکند که میتوانند بخشی از یک سیستم نرمافزاری باشند. این قابلیت امکان اتصال مدل به APIها و دیتابیسها را فراهم میکند و باعث میشود پاسخها دقیقتر، قابل پیشبینیتر و قابل کنترلتر باشند.
علاوه بر این، Function Calling به شکل قابلتوجهی احتمال hallucination را کاهش میدهد. بهجای اینکه مدل درباره دادههایی که به آن دسترسی ندارد حدس بزند، میتواند صراحتا اعلام کند که برای پاسخ دادن نیاز به اجرای یک تابع دارد. این موضوع در سیستمهای حساس مثل ثبت سفارش، امور مالی یا دسترسی به اطلاعات کاربر اهمیت زیادی دارد.
برای درک بهتر، تصور کنید کاربر میپرسد: «هوای تهران چطوره؟». بدون Function Calling، مدل فقط یک پاسخ متنی حدسی تولید میکند. اما با Function Calling، مدل تشخیص میدهد که برای پاسخ دقیق، باید تابعی مثل getWeather فراخوانی شود و شهر «تهران» را بهعنوان ورودی به آن بدهد. نتیجه اجرای تابع، سپس دوباره به مدل برگردانده میشود تا پاسخ نهایی ساخته شود.
Function Calling چگونه کار میکند؟

برای درک درست Function Calling، ابتدا لازم است با چند مفهوم پایه آشنا شویم.
- Tools: قابلیتهایی که توسعهدهنده در اختیار مدل قرار میدهد
- Tool Calls: درخواستهایی که مدل برای استفاده از ابزارها تولید میکند
- Tool Call Outputs: خروجیای که برنامه بعد از اجرای ابزار به مدل بازمیگرداند
ابزار میتواند یک تابع مشخص با ورودیهای ساختاریافته یا یک ابزار سفارشی با ورودی متنی آزاد باشد. زمانی که مدل تشخیص میدهد برای پاسخ به درخواست کاربر به یکی از این ابزارها نیاز دارد، یک «Tool Call» تولید میکند که در واقع درخواست مدل برای استفاده از آن ابزار است.
در این فرایند، اجرای واقعی ابزار یا تابع هرگز توسط مدل انجام نمیشود. مدل تنها نام ابزار و ورودیهای لازم را مشخص میکند و این وظیفهی برنامهی شماست که درخواست مدل را دریافت کند، کد مربوطه را اجرا کند و خروجی را دوباره به مدل بازگرداند. این تفکیک مسئولیت باعث میشود کنترل کامل منطق اجرایی و امنیت سیستم در اختیار توسعهدهنده باقی بماند.
جریان کلی Function Calling بهصورت زیر است:
- برنامه، درخواستی به مدل ارسال میکند و ابزارهای قابل استفاده را معرفی میکند.
- مدل درخواست کاربر را تحلیل میکند و در صورت نیاز، یک یا چند Tool Call تولید میکند.
- برنامه Tool Call را دریافت میکند و بر اساس نام ابزار و ورودیها، کد مربوطه را اجرا میکند.
- خروجی اجرای ابزار به مدل بازگردانده میشود.
- مدل با استفاده از این خروجی، پاسخ نهایی را برای کاربر تولید میکند.
در این فرایند، مدل هرگز کد را اجرا نمیکند؛ تمام منطق اجرایی در اختیار برنامه باقی میماند.
تعریف توابع (Defining Functions)
توابع از طریق پارامتر tools در هر درخواست API به مدل معرفی میشوند. هر تابع با یک schema تعریف میشود که به مدل توضیح میدهد این تابع چه کاری انجام میدهد و چه ورودیهایی انتظار دارد.
یک تعریف تابع شامل فیلدهای زیر است:
- type: که همیشه مقدار آن function است
- name: نام تابع
- description: توضیح کاربرد تابع
- parameters: ساختار ورودیها بر اساس JSON Schema
- strict: مشخص میکند آیا مدل باید دقیقا از schema پیروی کند یا نه
مثال تعریف تابع get_weather
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ “type”: “function”, “name”: “get_weather”, “description”: “Retrieves current weather for the given location.”, “strict”: true, “parameters”: { “type”: “object”, “properties”: { “location”: { “type”: “string”, “description”: “City and country e.g. Bogotá, Colombia” }, “units”: { “type”: “string”, “enum”: [“celsius”, “fahrenheit”], “description”: “Units the temperature will be returned in.” } }, “required”: [“location”, “units”], “additionalProperties”: false } } |
مثال Function Calling: دریافت وضعیت آبوهوا
در این مثال، یک مدل OpenAI تشخیص میدهد که برای پاسخ به سوال کاربر باید تابع get_weather فراخوانی شود.
درخواست به مدل
|
1 2 3 4 5 6 7 8 |
from openai import OpenAI client = OpenAI() response = client.responses.create( model=“gpt-4.1”, input=“What’s the weather like in Paris today?”, tools=[get_weather_function] ) |
پاسخ مدل (Tool Call)
|
1 2 3 4 5 6 7 8 9 |
[ { “id”: “fc_12345xyz”, “call_id”: “call_12345xyz”, “type”: “function_call”, “name”: “get_weather”, “arguments”: “{\”location\”:\”Paris, France\”,\”units\”:\”celsius\”}” } ] |
در این مرحله، مدل فقط اعلام کرده که تابع باید اجرا شود.
اجرای تابع و بازگرداندن نتیجه
برنامه باید Tool Call را پردازش کند:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import json def call_function(name, args): if name == “get_weather”: return get_weather(**args) input_messages = [] for tool_call in response.output: if tool_call.type != “function_call”: continue args = json.loads(tool_call.arguments) result = call_function(tool_call.name, args) input_messages.append({ “type”: “function_call_output”, “call_id”: tool_call.call_id, “output”: str(result) }) |
ارسال نتیجه به مدل و دریافت پاسخ نهایی
|
1 2 3 4 5 6 7 |
final_response = client.responses.create( model=“gpt-4.1”, input=input_messages, tools=[get_weather_function] ) print(final_response.output_text) |
پاسخ نهایی مدل
It’s about 15°C in Paris.
مثال پیشرفتهتر: چند تابع و چند Tool Call
مدل ممکن است در یک پاسخ، چند تابع مختلف را فراخوانی کند:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
[ { “type”: “function_call”, “name”: “get_weather”, “arguments”: “{\”location\”:\”Paris, France\”}” }, { “type”: “function_call”, “name”: “send_email”, “arguments”: “{\”to\”:\”bob@email.com\”,\”body\”:\”Hi Bob\”}” } ] |
در این حالت، برنامه باید هر Tool Call را بهصورت جداگانه اجرا کند و خروجی همه را به مدل بازگرداند.
Strict Mode؛ چرا مهم است؟
فعالسازی strict: true باعث میشود خروجی Tool Call دقیقا مطابق JSON Schema باشد. این موضوع پردازش خروجیها را سادهتر میکند و احتمال خطا را کاهش میدهد. برای اکثر پروژههای واقعی، استفاده از strict mode توصیه میشود.
ملاحظات عملی: مصرف توکن
توابع تعریفشده بخشی از پیام system محسوب میشوند و در محاسبه توکنها تاثیر دارند. اگر تعداد توابع یا توضیحات آنها زیاد باشد، مصرف توکن افزایش مییابد. در پروژههای بزرگ، بهتر است فقط توابع ضروری تعریف شوند و توضیحات مختصر و دقیق باشند.
Streaming و مشاهده زنده Tool Callها
میتوان Tool Callها را بهصورت streaming دریافت کرد تا مراحل پر شدن آرگومانها بهصورت زنده دیده شود:
|
1 2 3 4 5 6 7 8 9 |
stream = client.responses.create( model=“gpt-4.1”, input=“What’s the weather like in Paris today?”, tools=[get_weather_function], stream=True ) for event in stream: print(event) |
این قابلیت برای ساخت رابطهای کاربری real-time بسیار مفید است.
جایگاه Function Calling در Agentها
Agentها در سادهترین تعریف، سیستمهایی هستند که میتوانند تصمیم بگیرند، عمل کنند و نتیجه عمل خود را ارزیابی کنند. Function Calling یکی از ستونهای اصلی این معماری است، چون دقیقا همان نقطهای را پوشش میدهد که Agent باید از «فهم درخواست» وارد «انجام عمل» شود.
در معماری Agentهای مبتنی بر مدلهای OpenAI، مدل زبانی نقش مغز تصمیمگیرنده را دارد. این مدل با تحلیل ورودی کاربر یا وضعیت فعلی سیستم، تشخیص میدهد چه اقدامی باید انجام شود. Function Calling این امکان را فراهم میکند که این تصمیمگیری بهصورت ساختیافته و قابل کنترل به برنامه منتقل شود، بدون اینکه مدل مستقیما کد اجرا کند یا به منابع حساس دسترسی داشته باشد.
به بیان ساده، در یک Agent:
- مدل فکر میکند (تحلیل و تصمیمگیری)
- Function Calling اعلام میکند چه کاری باید انجام شود
- برنامه عمل میکند (اجرای تابع، API، منطق تجاری)
- نتیجه دوباره به مدل برمیگردد
این چرخه باعث میشود Agentها بتوانند وظایف چندمرحلهای، وابسته به شرایط و حتی طولانیمدت را مدیریت کنند؛ چیزی که بدون Function Calling عملا امکانپذیر یا بسیار ناپایدار بود.
چالشها و اشتباهات رایج در Function Calling

با اینکه OpenAI Function Calling ابزار قدرتمندی برای اتصال مدلهای زبانی به منطق واقعی برنامه است، استفاده نادرست از آن میتواند به سیستمهایی منجر شود که رفتارشان غیرقابل پیشبینی، پرهزینه یا حتی ناامن است. بسیاری از مشکلات رایج نه به خود قابلیت Function Calling، بلکه به نحوه طراحی توابع، تعریف schemaها و مدیریت تعامل بین مدل و برنامه برمیگردد. در ادامه، مهمترین چالشها و اشتباهاتی که در پیادهسازی Function Calling دیده میشوند را مرور میکنیم.
- تعریف بیش از حد توابع بدون توضیح شفاف
قرار دادن تعداد زیادی تابع با نامها یا توضیحات مبهم باعث میشود مدل در تشخیص تابع مناسب دچار سردرگمی شود. در چنین شرایطی ممکن است مدل تابع اشتباه را انتخاب کند یا اصلا هیچ تابعی را فراخوانی نکند، در حالی که انتظار میرفته یک عمل مشخص انجام شود.
- اعتماد کامل به خروجی مدل بدون اعتبارسنجی
اگرچه Function Calling خروجیها را ساختاریافتهتر میکند، اما همچنان نباید ورودیهای تولیدشده توسط مدل را بدون بررسی اجرا کرد. در سناریوهای حساس مثل ارسال ایمیل، ثبت سفارش یا عملیات مالی، اعتبارسنجی ورودیها و اعمال محدودیتهای امنیتی در سمت برنامه ضروری است.
- طراحی نامناسب JSON Schema
schemaهای بیشازحد پیچیده، تو در تو یا مبهم، تصمیمگیری مدل را دشوار میکنند و احتمال خطا را افزایش میدهند. در مقابل، schemaهای ساده، صریح و با توضیحات دقیق برای هر فیلد، خروجیهای قابل پیشبینیتری ایجاد میکنند.
- نادیده گرفتن تاثیر توابع بر مصرف توکن
توابع تعریفشده در Function Calling بخشی از پیام system هستند و روی مصرف توکن و محدودیت context مدل اثر مستقیم دارند. تعریف تعداد زیاد توابع یا توضیحات طولانی برای پارامترها میتواند هزینهها را افزایش دهد یا باعث رسیدن به سقف context شود.
- انتقال بیش از حد منطق به مدل
مدل باید نقش «تصمیمگیرنده» را داشته باشد. پیادهسازی قوانین کسبوکار، کنترل خطا و محدودیتها در داخل prompt یا تعریف تابع باعث رفتارهای غیرقابل پیشبینی و سختقابلدیباگ میشود.
- عدم مدیریت چند Tool Call بهصورت همزمان
پاسخ مدل ممکن است شامل صفر، یک یا چند Tool Call باشد. اگر برنامه فرض کند همیشه فقط یک تابع فراخوانی میشود، در سناریوهای واقعی دچار خطا خواهد شد. بهترین رویکرد این است که همیشه آمادهی پردازش چند Tool Call باشید.
- بیتوجهی به strict mode در پروژههای واقعی
استفاده نکردن از strict mode باعث میشود خروجیهای مدل صرفا «بهترین تلاش» باشند و الزاما مطابق schema نباشند. در اغلب کاربردهای عملی، فعالسازی strict mode باعث افزایش اطمینان و سادهتر شدن پردازش خروجیها میشود.
آینده سیستمهای مبتنی بر هوش مصنوعی و Function Calling
با حرکت اکوسیستم هوش مصنوعی به سمت Agentic Systems، نقش Function Calling پررنگتر از گذشته میشود. در آینده، مدلهای زبانی کمتر بهعنوان «چتبات» و بیشتر بهعنوان «هماهنگکننده عملیات» استفاده خواهند شد؛ موجودیتی که تصمیم میگیرد چه کاری، در چه زمانی و با چه ابزاری انجام شود.
در چنین سیستمی، Function Calling فقط یک قابلیت فنی نیست، بلکه یک الگوی معماری است. این الگو اجازه میدهد سیستمهای هوشمند:
- قابل توسعه باقی بمانند
- قابل کنترل و قابل ممیزی باشند
- و از نظر امنیتی مرز مشخصی بین تصمیمگیری و اجرا داشته باشند
همچنین با گسترش Tool Calling، custom tools و ترکیب آنها با workflowهای پیچیده، انتظار میرود Function Calling به پایهی اصلی سیستمهایی تبدیل شود که بتوانند با چندین سرویس، دیتابیس و منبع داده بهصورت هماهنگ کار کنند. در چنین آیندهای، کیفیت طراحی توابع، schemaها و نحوه تعامل با مدل، نقشی کلیدی در موفقیت یا شکست سیستمهای مبتنی بر هوش مصنوعی خواهد داشت.
جمعبندی
OpenAI Function Calling فقط یک قابلیت API نیست، بلکه یک الگوی طراحی برای ساخت سیستمهای هوشمند است. با جدا کردن تصمیمگیری از اجرا، میتوان مدلهای زبانی را به ابزارهایی قابل اعتماد، قابل کنترل و قابل توسعه تبدیل کرد. اگر Function Calling بهدرستی طراحی و استفاده شود، پایهای محکم برای ساخت Agentها و workflowهای هوشمند خواهد بود.
منابع
سوالات متداول
خیر.
مدل فقط:
تشخیص میدهد کدام تابع باید صدا زده شود
و پارامترهای لازم را تولید میکند
اجرای واقعی تابع همیشه بر عهده کد شماست.
Prompt Engineering فقط مدل را راهنمایی متنی میکند
Function Calling مدل را مجبور به تولید خروجی ساختیافته مطابق قرارداد مشخص میکند
به بیان ساده، Function Calling کنترلپذیری بسیار بیشتری دارد.
معمولا خروجی بهصورت:
نام تابع
آرگومانها در قالب JSON
ارائه میشود تا بتوان آن را مستقیما به منطق برنامه پاس داد.
Function Calling روی توابع مشخصشده توسط توسعهدهنده تمرکز دارد
Tool Calling مفهوم گستردهتری است که میتواند شامل:
توابع
ابزارهای خارجی
یا سرویسهای سیستمی
باشد
Function Calling معمولا زیرمجموعهای از Tool Calling در نظر گرفته میشود.




دیدگاهتان را بنویسید