aidoc.uz

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:

  1. Vositalarni tasvirlaysiz

    Modelga "sizda mana bunday funksiyalar bor" deb, ularning nomi va argumentlarini JSON Schema shaklida aytasiz.

  2. Model 'chaqiraman' deydi, o'zi chaqirmaydi

    Model javob o'rniga "menga ob_havo_ol(shahar='Toshkent') funksiyasini shu argumentlar bilan chaqiring" degan JSON qaytaradi.

  3. Siz haqiqatda chaqirasiz

    Sizning kodingiz shu JSON'ni o'qiydi va haqiqiy ob_havo_ol() funksiyangizni ishga tushiradi.

  4. 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.

Aniq tavsif
  • "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)
Noaniq tavsif
  • "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:

QiymatMa'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#

BelgiSababYechim
Model funksiyani chaqirmaydi, matn bilan javob beradidescription noaniq yoki tool_choice="auto" bilan model kerak topmaganDescription'ni aniqlashtiring yoki tool_choice="required" qo'ying
Model noto'g'ri argument yuboradiParametr sxemasi yetarlicha aniq emasHar bir parametrga batafsil description va (kerak bo'lsa) enum qo'shing
Kodingiz KeyError beradiitem.name funksiyalar lug'atida yo'qHar doim noma'lum funksiya nomini ham tuting (.get() yoki try/except)
Ikkinchi so'rov ham yana funksiya chaqirishni so'raydiNatija formati modelga tushunarsizoutput'ni aniq, tuzilgan JSON sifatida qaytaring
Amaliy topshiriq

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.