2-qism · Matn generatsiyasi·03-bob
Xabarlar, rollar va parametrlar
developer/user/assistant rollari; instructions, temperature, max_output_tokens, metadata; suhbatni davom ettirishning ikki usuli va ularning savdo-sotig'i.
Bitta qatorlik input="..." — eng sodda holat. Haqiqiy ilovada esa modelga
qanday xatti-harakat qilishi kerakligini aytish, va suhbatni bir necha
xabar davomida davom ettirish kerak bo'ladi. Buning uchun rollar,
instructions parametri va tarixni boshqarish usullari bor.
1. Uchta rol#
Har bir xabar ikki narsadan iborat: kim aytdi (rol) va nima aytdi (matn). Rollar uchtа:
- developer
- Tizim ko'rsatmasiModel qanday xatti-harakat qilishi kerakligini belgilaydi. Foydalanuvchiga ko'rinmaydi. "Sen — mehribon yordamchisan, faqat o'zbek tilida javob ber" kabi.
- user
- FoydalanuvchiHaqiqiy odam (yoki sizning dasturingiz) yozgan xabar — savol, buyruq, ma'lumot.
- assistant
- Model javobiModelning avvalgi javobi. Suhbat tarixini qayta yuborayotganda buni ham qo'shasiz — birinchi bobda ko'rganimizdek.
response = client.responses.create(
model="gpt-4o-mini",
instructions="Sen — do'stona dasturlash o'qituvchisisan. Faqat o'zbek tilida, sodda misollar bilan tushuntirasan.",
input="Python'da ro'yxat (list) nima?",
)instructions — bu developer rolining qulay yo'li: uni alohida
parametr sifatida bir marta belgilaysiz, u butun so'rovga tatbiq etiladi.
2. Nega alohida instructions parametri bor#
Texnik jihatdan instructions'ni input massivining boshiga
{"role": "developer", "content": "..."} sifatida qo'shish bilan bir xil
natija beradi. Lekin instructions alohida parametr sifatida ajratilgan
sababi bor: u suhbat tarixi qayta yozilganda ham o'zgarmas holda
qoladi va model uni har doim eng yuqori ustuvorlikdagi ko'rsatma sifatida
ko'radi. Amaliyotda: instructions'ga xatti-harakat qoidalarini
("qanday ohangda gapirish", "nimani hech qachon qilmaslik"), input'ga
esa haqiqiy suhbat mazmunini joylashtiring.
3. Suhbatni davom ettirishning ikki usuli#
1-usul — butun tarixni o'zingiz saqlaysiz:
history = [{"role": "user", "content": "Python'da ro'yxat nima?"}]
response = client.responses.create(model="gpt-4o-mini", input=history)
history.append({"role": "assistant", "content": response.output_text})
history.append({"role": "user", "content": "Unga qanday element qo'shaman?"})
response = client.responses.create(model="gpt-4o-mini", input=history)Bu usul — to'liq nazorat: tarixni bazaga saqlashingiz, kerak bo'lsa eski xabarlarni olib tashlashingiz yoki tahrirlashingiz mumkin.
2-usul — serverga saqlashni topshirasiz, previous_response_id orqali:
r1 = client.responses.create(model="gpt-4o-mini", input="Python'da ro'yxat nima?")
r2 = client.responses.create(
model="gpt-4o-mini",
previous_response_id=r1.id,
input="Unga qanday element qo'shaman?",
)Bu holda OpenAI server tomonida oldingi javobni "eslaydi" — siz faqat
yangi xabarni yuborasiz. Kodingiz qisqaradi, lekin tarix ustidan
nazoratingiz kamayadi (masalan, eski xabarni o'chira olmaysiz, va
store parametri false'ga o'rnatilgan bo'lsa bu usul umuman
ishlamaydi — pastda ko'ramiz).
- Har bir foydalanuvchining tarixini bazada alohida boshqarasiz
- Eski xabarni tahrirlash yoki o'chirish mumkin
- Tarixni xulosalash yoki qisqartirish strategiyasini qo'llash oson
- Kamroq kod — tezkor prototip uchun qulay
- Tarix ustidan nazorat yo'q — faqat 'davom ettirish' bor
- store=false bo'lsa ishlamaydi
Ko'p foydalanuvchili real ilova (veb-sayt, mobil ilova) qurayotgan bo'lsangiz — 1-usulni tanlang. Shaxsiy skript yoki tezkor prototip uchun — 2-usul tezroq natija beradi.
4. store parametri — maxfiylik va qonuniy talablar#
Standart holatda OpenAI so'rovingizni va javobni bir muddat serverida
saqlaydi (bu previous_response_id'ning ishlashi uchun kerak). Agar
loyihangiz maxfiy ma'lumot bilan ishlasa (tibbiy, moliyaviy, shaxsiy
ma'lumot), buni o'chirish mumkin:
response = client.responses.create(
model="gpt-4o-mini",
input="Maxfiy ma'lumot bor xabar",
store=False, # server hech narsani saqlamaydi
)5. Javobni boshqaruvchi parametrlar#
| Parametr | Nima qiladi | Odatiy holat |
|---|---|---|
temperature | Tanlov tasodifiyligi — 0 aniq/takrorlanuvchi, 1+ ijodiy | 1 |
max_output_tokens | Javobning maksimal uzunligi (token hisobida) | Model chegarasi |
top_p | temperature'ga muqobil — ehtimollik massasining qaysi qismidan tanlash | 1 |
metadata | So'rovga o'zingiz biriktiradigan kalit-qiymat juftlik (masalan, user_id) | Yo'q |
temperature va top_p'ni birga o'zgartirmang — ikkalasi ham bir xil
muammoni (tasodifiylik) boshqaradi, ikkalasini birga sozlash natijani
bashorat qilib bo'lmaydigan qiladi. Birini tanlang.
# Klassifikatsiya, ma'lumot ajratish — bir xil kirishga bir xil javob kerak
response = client.responses.create(
model="gpt-4o-mini",
temperature=0,
input="Bu sharh ijobiymi yoki salbiy? Faqat 'ijobiy' yoki 'salbiy' deb javob ber: 'Xizmat juda yomon edi.'",
)
# Ijodiy yozish — xilma-xillik kerak
response = client.responses.create(
model="gpt-4o-mini",
temperature=1.2,
input="Bahor haqida to'rt qatorlik she'r yoz.",
)metadata esa modelning javobiga ta'sir qilmaydi — u faqat sizning
tomoningizda kuzatuv (analytics) va debug qilish uchun foydali:
response = client.responses.create(
model="gpt-4o-mini",
input="Salom!",
metadata={"user_id": "12345", "sahifa": "bosh-sahifa"},
)6. max_output_tokens — kesilib qolgan javob#
Agar max_output_tokens juda kichik bo'lsa, javob yarim yo'lda
kesiladi — bu xato emas, lekin natija chala bo'ladi. Buni
response.status orqali tekshirish mumkin:
response = client.responses.create(
model="gpt-4o-mini",
max_output_tokens=20,
input="Python haqida uzun, batafsil insho yoz.",
)
if response.status == "incomplete":
print("Javob kesildi:", response.incomplete_details.reason) # "max_output_tokens"7. Nima noto'g'ri ketishi mumkin#
| Belgi | Sabab | Yechim |
|---|---|---|
| Model "eslamayapti" ko'rinadi | Tarix qayta yuborilmagan | 1 yoki 2-usuldan foydalanib, tarixni to'g'ri uzating |
| Har safar butunlay boshqa uslubda javob | temperature juda yuqori | temperature'ni pasaytiring yoki 0 qiling |
| Javob to'satdan kesiladi | max_output_tokens kichik | Qiymatni oshiring, status'ni tekshiring |
previous_response_id xato beradi | Oldingi so'rov store=False bilan yuborilgan edi | Tarixni o'zingiz saqlash usuliga o'ting |
Ikki usulni solishtiring
Uch bosqichli oddiy suhbat yozing: (1) "Salom, mening ismim bor",
(2) "Men dasturchiman", (3) "Ismim va kasbim nima edi?" — bu suhbatni
avval 1-usul (o'zingiz saqlangan tarix), keyin 2-usul
(previous_response_id) bilan amalga oshiring. Ikkala natija bir xil
chiqishi kerak.
Maslahatni ko'rsatish
Bir xil uch xabarli suhbatni ikkala usulda ham (o'zingiz saqlagan tarix va previous_response_id) amalga oshiring. Kodning uzunligini va o'qilishini solishtiring — qaysi biri sizning loyihangizga mosroq bo'lardi va nega?