آموزش Function Calling (Tool Calling) با OpenAI از صفر

آموزش Function Calling (Tool Calling) با OpenAI از صفر

در این بلاگ با مفهوم Function Calling یا Tool Calling آشنا میشوید؛ قابلیتی که به مدلهای زبانی اجازه میدهد فقط متن تولید نکنند، بلکه کارهای واقعی مثل گرفتن داده از API یا اجرای یک تابع را انجام دهند. همراه با یک مثال عملی ساده در پایتون با OpenAI، قدمبهقدم از تعریف ابزار تا دریافت پاسخ نهایی را یاد میگیرید.

۱۴۰۴/۶/۹:تاریخ انتشار
4 دقیقه:زمان مطالعه
openaiفراخوانی ابزار ها در هوش مصنوعیهوش مصنوعی

آشنایی با Function Calling (Tool Calling) — شروعی ساده برای همه

مدلهای زبانی مثل ChatGPT یا Claude در نگاه اول فقط به عنوان تولیدکننده متن شناخته میشوند. شما یک سؤال میپرسید و مدل یک پاسخ متنی برمیگرداند. اما در دنیای واقعی خیلی وقتها نیاز داریم مدل فقط حرف نزند، بلکه یک کار واقعی انجام دهد: مثلا وضعیت آبوهوای یک شهر را از یک سرویس بگیرد، موجودی حساب را بررسی کند یا حتی یک سرور ابری بسازد. اینجاست که Function Calling یا همان Tool Calling وارد صحنه میشود.

Function Calling یعنی شما تعدادی ابزار یا تابع را به مدل معرفی میکنید. هر ابزار یک اسم، یک توضیح و یک ساختار ورودی (معمولاً به شکل JSON Schema) دارد. وقتی کاربر سوالی میپرسد، مدل تشخیص میدهد که آیا باید یکی از این ابزارها را صدا بزند یا نه. اگر لازم بود، ورودی مناسب را تولید میکند، کد شما آن ابزار را اجرا میکند و خروجی به مدل برمیگردد. در نهایت، مدل پاسخی طبیعی و قابل فهم برای کاربر میسازد.

یک مثال ساده

فرض کنید میخواهید یک دستیار بسازید که وضعیت آبوهوای شهرها را بگوید.

  • کاربر میپرسد: «الان هوای تهران چطور است؟»
  • مدل تشخیص میدهد که باید ابزار getWeather را صدا بزند.
  • برنامه شما این ابزار را با ورودی { city: "Tehran" } اجرا میکند.
  • خروجی ابزار: «۳۴ درجه و آفتابی».
  • مدل جواب نهایی میسازد: «الان تهران آفتابی است و دما ۳۴ درجه است

این مثال نشان میدهد چطور یک مدل از حالت «فقط متن» به یک عامل هوشمند واقعی تبدیل میشود.

چرا Function Calling مهم است؟

  • دسترسی به دادههای تازه: مدل به اطلاعاتی که در دیتاست آموزشیاش نبوده هم دسترسی پیدا میکند.
  • اتصال به سرویسهای واقعی: مثل پرداخت آنلاین، جستجو در وب یا اتصال به دیتابیس.
  • ایجاد دستیارهای کاربردی: از پشتیبانی مشتری گرفته تا مدیریت سرور و تحلیل داده.
  • خروجی ساختاریافته: به کمک JSON Schema خروجیها قابل اعتماد و قابل استفاده در سیستمهای دیگر میشوند.

اجزای اصلی Function Calling

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

نکات مهم هنگام استفاده

  • همیشه ورودیها را اعتبارسنجی کنید؛ به مدل به تنهایی اعتماد نکنید.
  • تعداد ابزارها را زیاد نکنید تا مدل سردرگم نشود.
  • برای ابزارها محدودیت زمانی و تعداد دفعات اجرا در نظر بگیرید.
  • همه چیز را لاگ کنید تا در دیباگ و بهبود کیفیت سیستم کمک کند.

مثال عملی Function Calling با OpenAI (Python)

در این بخش یک مثال ساده و قدمبهقدم با OpenAI میسازیم. هدف این است که حتی اگر تازهکار باشید بتوانید درک کنید Function Calling چطور کار میکند.

۱) نصب و آمادهسازی

code
pip install openai
export OPENAI_API_KEY="کلید_API_خودت"

۲) تعریف ابزار (تابع)

یک ابزار ساده برای گرفتن آبوهوا تعریف میکنیم:

code
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "وضعیت آب‌وهوای یک شهر را برمی‌گرداند",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "نام شهر"}
                },
                "required": ["city"]
            }
        }
    }
]

۳) ارسال پرسش کاربر به مدل

code
from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "هوای تهران چطوره؟"}],
    tools=tools
)

۴) بررسی درخواست ابزار

code
message = response.choices[0].message

if message.tool_calls:
    tool_call = message.tool_calls[0]
    print("مدل درخواست کرد ابزار اجرا شود با ورودی:", tool_call.function.arguments)

۵) اجرای واقعی ابزار

code
import json

def get_weather(city):
    if city == "Tehran":
        return {"temperature": "34°C", "condition": "Sunny"}
    else:
        return {"temperature": "20°C", "condition": "Cloudy"}

args = json.loads(tool_call.function.arguments)
result = get_weather(args["city"])

۶) برگرداندن نتیجه به مدل

code
second_response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "user", "content": "هوای تهران چطوره؟"},
        message,  # پاسخ مرحله قبل که مدل گفت ابزار لازم است
        {
            "role": "tool",                 # یعنی این پیام از طرف ابزار است
            "tool_call_id": tool_call.id,    # به مدل می‌گوییم این نتیجه مربوط به همان ابزار است
            "content": json.dumps(result)    # خروجی واقعی ابزار به شکل JSON
        }
    ]
)

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

توضیح بخش دوم پیامها

در این مرحله سه نوع پیام به مدل داده میشود:

  • پیام کاربر: همان سؤال اولیه.
  • پیام دستیار (message): پاسخی که مدل در مرحله اول داده و در آن خواست ابزار اجرا شود.
  • پیام ابزار (role: tool): نتیجهٔ واقعی ابزار که ما اجرا کردیم و حالا به مدل برمیگردانیم.

با این سه بخش، مدل میداند:

  1. کاربر چه پرسیده.
  2. خودش در مرحله قبل چه پیشنهادی داده (صدا زدن ابزار).
  3. نتیجه واقعی ابزار چیست.

و حالا میتواند یک پاسخ نهایی و طبیعی تولید کند.

خروجی نهایی

code
الان تهران آفتابی است و دما حدود 34 درجه سانتی‌گراد است.

کاربردهای واقعی Function Calling

  • پشتیبانی مشتری: ثبت سفارش، استعلام حساب یا پیگیری وضعیت
  • اپلیکیشنهای روزمره: جستجو و خلاصهسازی نتایج اینترنتی
  • DevOps و Cloud: بررسی وضعیت سرورها یا ایجاد یک VPS جدید
  • تحلیل داده: اجرای کوئریهای سبک و توضیح نتایج به زبان ساده

جمعبندی

Function Calling یا Tool Calling یکی از مهمترین قابلیتهای نسل جدید مدلهای زبانی است. این ویژگی به شما اجازه میدهد دستیارهای هوشمندی بسازید که فقط به پرسشها پاسخ نمیدهند، بلکه میتوانند کارهای واقعی انجام دهند. در این مقاله با مفهوم اولیه آشنا شدیم و دیدیم چطور کار میکند. همچنین یک مثال عملی و ساده با OpenAI را قدمبهقدم مرور کردیم. در بخش بعدی همین سری، سراغ Structured Outputs و نکات امنیتی میرویم تا سیستم ما کاملتر و حرفهایتر شود.