2-qism · Matn generatsiyasi·06-bob
Function calling: modelga vosita berish
Model o'zi bila olmaydigan narsalarni — joriy vaqt, ob-havo, baza yozuvi — qanday qilib sizning funksiyangiz orqali biladi, parallel chaqiruvlar va xavfsizlik.
Modelga "Toshkentda hozir soat necha?" deb so'rasangiz, u to'g'ri javob bera olmaydi — u joriy vaqtni bilmaydi, faqat o'qitilgan ma'lumotlar asosida matn generatsiya qiladi. Function calling — modelga "bu ma'lumot kerak bo'lsa, mana shu funksiyani chaqir" deyishning rasmiy yo'li.
1. Asosiy g'oya: model funksiyani o'zi ishga tushirmaydi#
Bu — eng ko'p tushunmovchilikka sabab bo'ladigan joy. Model hech qachon sizning kodingizni to'g'ridan-to'g'ri ishga tushirmaydi. Jarayon shunday:
Vositalarni tasvirlaysiz
Modelga "sizda mana bunday funksiyalar bor" deb, ularning nomi va argumentlarini JSON Schema shaklida aytasiz.
Model 'chaqiraman' deydi, o'zi chaqirmaydi
Model javob o'rniga "menga
ob_havo_ol(shahar='Toshkent')funksiyasini shu argumentlar bilan chaqiring" degan JSON qaytaradi.Siz haqiqatda chaqirasiz
Sizning kodingiz shu JSON'ni o'qiydi va haqiqiy
ob_havo_ol()funksiyangizni ishga tushiradi.Natijani qaytarib yuborasiz
Funksiya natijasini yangi xabar sifatida modelga qaytadan yuborasiz — model endi shu natija asosida yakuniy javob yozadi.
2. Vositani tasvirlash#
tools = [
{
"type": "function",
"name": "obhavo_ol",
"description": "Berilgan shahar uchun joriy ob-havo ma'lumotini qaytaradi.",
"parameters": {
"type": "object",
"properties": {
"shahar": {"type": "string", "description": "Shahar nomi, masalan 'Toshkent'"},
},
"required": ["shahar"],
"additionalProperties": False,
},
}
]description maydonlari — bezak emas, model shundan o'qib qachon va
qanday chaqirishni tushunadi. Noaniq tavsif — noto'g'ri yoki keraksiz
chaqiruvlarning eng ko'p uchraydigan sababi.
- "Berilgan shahar uchun joriy ob-havoni Selsiy darajada qaytaradi"
- Har bir parametr nima ekanini alohida tushuntiradi
- Qachon ishlatilmasligi kerakligini ham aytadi (agar zarur bo'lsa)
- "Ob-havo funksiyasi" — qanday format qaytaradi? Qaysi birlik?
- Parametr nomi o'zini o'zi tushuntiradi deb taxmin qilingan
Description'ni xuddi yangi hamkasbingizga funksiyani tushuntirayotgandek yozing — u sizning kodingizni ko'rmaydi, faqat shu matnga tayanadi.
3. To'liq aylanish (round-trip)#
def obhavo_ol(shahar: str) -> dict:
# Haqiqiy loyihada bu yerda tashqi ob-havo API'siga so'rov bo'lar edi
return {"shahar": shahar, "harorat": 24, "holat": "quyoshli"}
input_list = [{"role": "user", "content": "Toshkentda hozir ob-havo qanday?"}]
response = client.responses.create(model="gpt-4o-mini", tools=tools, input=input_list)
# Model funksiya chaqirishni so'ragan bo'lishi mumkin
for item in response.output:
if item.type == "function_call" and item.name == "obhavo_ol":
import json
args = json.loads(item.arguments)
natija = obhavo_ol(**args) # HAQIQIY funksiyani SIZ chaqirasiz
input_list.append(item) # modelning chaqiruv so'rovini tarixga qo'shamiz
input_list.append({
"type": "function_call_output",
"call_id": item.call_id,
"output": json.dumps(natija),
})
# Natija bilan yakuniy javobni so'raymiz
final = client.responses.create(model="gpt-4o-mini", tools=tools, input=input_list)
print(final.output_text)
# → "Hozir Toshkentda 24°C, havo quyoshli."Diqqat qiling: ikkita API chaqiruvi bo'ldi. Birinchisi — "menga qaysi funksiya kerakligini ayt", ikkinchisi — "mana natija, endi yakuniy javob yoz". Bu — function calling'ning tabiiy shakli.
4. Bir nechta vosita, bir nechta parallel chaqiruv#
Real ilovalarda modelga bir nechta vosita berasiz, va model bittasini, bir nechtasini bir vaqtda (parallel) yoki hech birini tanlamasligi mumkin:
tools = [
{"type": "function", "name": "obhavo_ol", "description": "...", "parameters": {...}},
{"type": "function", "name": "valyuta_kursi", "description": "...", "parameters": {...}},
{"type": "function", "name": "kalendar_yoz", "description": "...", "parameters": {...}},
]
input_list = [{"role": "user", "content": "Toshkentda ob-havo qanday va dollar kursi qancha?"}]
response = client.responses.create(model="gpt-4o-mini", tools=tools, input=input_list)
# Model IKKI funksiyani BIR VAQTDA so'ragan bo'lishi mumkin
funksiyalar = {"obhavo_ol": obhavo_ol, "valyuta_kursi": valyuta_kursi}
for item in response.output:
if item.type == "function_call":
import json
args = json.loads(item.arguments)
natija = funksiyalar[item.name](**args)
input_list.append(item)
input_list.append({
"type": "function_call_output",
"call_id": item.call_id,
"output": json.dumps(natija),
})
final = client.responses.create(model="gpt-4o-mini", tools=tools, input=input_list)
print(final.output_text)Kodingiz har bir function_call elementini navbat bilan qayta ishlaydi
— nechta funksiya so'ralganidan qat'iy nazar, mantiq bir xil qoladi.
5. tool_choice — modelni majburlash yoki cheklash#
Standart holatda model o'zi hal qiladi: vosita chaqirsinmi yoki to'g'ridan-to'g'ri matn bilan javob bersinmi. Buni nazorat qilish ham mumkin:
| Qiymat | Ma'nosi |
|---|---|
"auto" (standart) | Model o'zi hal qiladi |
"required" | Model albatta qandaydir vositani chaqirishi shart |
"none" | Vositalar berilgan bo'lsa ham, model ularni chaqira olmaydi |
{"type": "function", "name": "obhavo_ol"} | Model aynan shu funksiyani chaqirishga majburlanadi |
# Model albatta vosita chaqirishini xohlaymiz — matn javob emas
response = client.responses.create(
model="gpt-4o-mini",
tools=tools,
tool_choice="required",
input="Toshkentda ob-havo qanday?",
)6. Xavfsizlik: chaqiruv — hali ruxsat emas#
Amaliy naqsh — xavfli funksiyalarni ikki bosqichga bo'lish:
def pul_otkazish_taklifi(qabul_qiluvchi: str, summa: float) -> dict:
# Bosqich 1: faqat TAKLIF qaytaradi, hali hech narsa o'tkazilmaydi
return {"holat": "tasdiq_kutilmoqda", "qabul_qiluvchi": qabul_qiluvchi, "summa": summa}
def pul_otkazish_bajarish(tranzaksiya_id: str) -> dict:
# Bosqich 2: FAQAT foydalanuvchi UI'da aniq tasdiqlagandan keyin chaqiriladi
# Bu funksiya modelga umuman ko'rsatilmaydi — faqat sizning backend kodingizda
...Model faqat "taklif qilish" funksiyasini ko'radi; haqiqiy pul o'tkazish funksiyasi modeldan butunlay yashiringan va faqat foydalanuvchi interfeysida aniq bosilgan "Tasdiqlash" tugmasi orqali chaqiriladi.
7. Nega bu "agent"larning yuragi#
"AI agentlar qurish" kitobidagi 4-bobda ko'rganingizdek, agent — aynan shu tsiklni takrorlaydigan dastur: model vosita so'raydi → dastur bajaradi → natija qaytadi → model yana vosita so'raydi yoki yakuniy javob beradi. Function calling — shu tsiklning bitta bosqichi, aynan shu mexanizm ustiga butun "agent" tushunchasi quriladi.
8. Nima noto'g'ri ketishi mumkin#
| Belgi | Sabab | Yechim |
|---|---|---|
| Model funksiyani chaqirmaydi, matn bilan javob beradi | description noaniq yoki tool_choice="auto" bilan model kerak topmagan | Description'ni aniqlashtiring yoki tool_choice="required" qo'ying |
| Model noto'g'ri argument yuboradi | Parametr sxemasi yetarlicha aniq emas | Har bir parametrga batafsil description va (kerak bo'lsa) enum qo'shing |
Kodingiz KeyError beradi | item.name funksiyalar lug'atida yo'q | Har doim noma'lum funksiya nomini ham tuting (.get() yoki try/except) |
| Ikkinchi so'rov ham yana funksiya chaqirishni so'raydi | Natija formati modelga tushunarsiz | output'ni aniq, tuzilgan JSON sifatida qaytaring |
Ikki vositali oddiy yordamchi yozing
Ikkita mustaqil funksiyani (masalan, joriy vaqtni qaytaruvchi va oddiy matematik amalni bajaruvchi) modelga vosita sifatida bering. Bitta so'rovda ikkalasi ham kerak bo'ladigan savol yuboring va model ikkalasini ham to'g'ri, parallel chaqirishini tekshiring.
Maslahatni ko'rsatish
Ikkita sodda funksiya yozing: vaqt_ol() (hozirgi vaqtni qaytaradi) va hisobla(ifoda) (oddiy matematik ifodani hisoblaydi). Ikkalasini ham tools ro'yxatiga qo'shib, 'Hozir soat necha va 15 karra 8 nechaga teng?' so'rovini yuboring.