Function Calling
Tool Use — Araç Çağırma
LLM'in çalıştırılabilir bir fonksiyonun adını ve parametrelerini yapılandırılmış JSON olarak çıktılaması; uygulama bu çağrıyı çalıştırıp sonucu modele geri verir.
LLM kod çalıştıramaz, hesap yapamaz, internete giremez. Ama yapabileceği
bir şey vardır: senin tanımladığın fonksiyonların isimlerini ve
parametrelerini yapılandırılmış şekilde üretebilir. Sen ona "şu fonksiyonlar
var: get_weather(city), send_email(to, body)" dersin; o da kullanıcı
isteğine göre get_weather(city: "Paris") üretir. Çalıştırma senin işin.
Akış: (1) modele araç tanımlarını ver, (2) model tool_call JSON üretir,
(3) sen fonksiyonu çalıştır, (4) sonucu tool_result olarak modele
geri ver, (5) model son cevabı yazar. Bu döngü birden fazla turdan
oluşabilir — ajan (agent) dediğimiz şeyin temel mekaniği budur.
OpenAI, Anthropic, Google, Mistral — hepsi destekler. JSON Schema ile parametre türleri tanımlanır. Modern modeller paralel araç çağrısı da yapabilir.
Bir sekreterle telefonda konuşur gibi. Sekreter raporları kendi yazamaz, ama "şu klasörden Q3 raporunu getir" diyebilir. Talimat sözel, eylem fiziksel. LLM = sekreter, function calling = "getir" emrini yapılandırılmış komuta dönüştürmek, senin uygulaman = arşivden raporu fiilen alan kişi.
Müşteri "siparişimin durumu ne?" diye sorar. Bot LLM'e mesajı +
get_order_status(order_id) araç tanımını birlikte verir. LLM önce
ask_user(question: "Sipariş numaranız nedir?") çağırır. Müşteri
"TR-9921" der. LLM bu kez get_order_status(order_id: "TR-9921")
üretir. Arka uç gerçek API'yi çağırır, "Kargoda, yarın teslim" döner.
LLM bu veriyi alıp "Siparişiniz kargoda, yarın elinizde olacak 🚚"
diye insan diliyle yanıtlar.
from openai import OpenAI
import json
client = OpenAI()
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Belirli bir şehrin hava durumu",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"],
},
},
}]
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Paris hava durumu?"}],
tools=tools,
)
call = resp.choices[0].message.tool_calls[0]
args = json.loads(call.function.arguments)
# → call.function.name == "get_weather"
# → args == {"city": "Paris"}
# Sen burada gerçek API'yi çağırırsın, sonucu modele tool_result
# olarak geri verirsin, model nihai cevabı yazar.- Gerçek zamanlı veri çekmek (hava, fiyat, stok)
- Hassas hesap (LLM matematikte zayıftır — hesap makinesi aracı kullan)
- Yan etki yaratan işlemler: e-posta gönder, kayıt aç, ödeme tetikle
- Yapılandırılmış çıktı şart olduğunda — JSON şeması garanti eder
- Bilgi zaten prompt içinde varsa — gereksiz tur ekleme
- Tek seferlik yaratıcı içerik (şiir, blog) — araç gerekmez
- Gecikmeye duyarlı UI akışları — her araç turu ekstra ileri-geri tur demek
Araç sayısını aşırı artırmak
20'den fazla araç verince model kafası karışır, yanlış aracı seçer. 5-10 ile başla, gerekirse hiyerarşik düzen kur.
Şema doğrulamasını atlamak
Model bazen şemada olmayan parametreler üretir ya da türü yanlış geçer. Çağrıyı çalıştırmadan önce mutlaka doğrula.
Sonsuz döngü
Model sonuca ulaşamayınca aynı aracı tekrar tekrar çağırır. Maksimum tur sayısı (örn. 10) ve döngü tespiti koy.