Coverage gate (qamrov darvozasi): trainingdan oldin nima yetishmasligini topish
Nega darvoza kerak
Training — qimmat. tez9 yetti soat o'qitildi, tez10 olti soatdan ko'p. Agar training ma'lumotida biror narsa butunlay yo'q bo'lsa — masalan, model hech qachon qisqa so'rov ko'rmagan bo'lsa — buni train qilish tugagandan keyin, testda bilish juda kech. Yetti soat yo'qotildi, va yana yetti soat kerak.
Shuning uchun trainingdan oldin bir necha soniyalik tekshiruv bor: coverage gate (qamrov
darvozasi). U training faylini test to'plamlari bilan solishtiradi va training ma'lumoti hech
qachon o'rgatmaydigan narsalarni sanaydi. Kod — training/coverage.py, qoidalar — sozlamalarda:
import json import glob qoidalar = json.load(open(TEZ / "training/settings.json", encoding="utf-8"))["coverage"] for kalit, qiymat in qoidalar.items(): if kalit not in ("scripts", "number_words"): print(f"{kalit:22s} {qiymat}")
min_rows 60
length_edges [3, 5, 10]
min_length_share 0.75
max_ask_gap 0.2
column_styles {'snake_case': '^[a-z][a-z0-9_]*$', 'with_spaces_or_symbols': '[^A-Za-z0-9_]', 'upper_code': '^[A-Z][A-Z0-9_]*$', 'starts_with_digit': '^[0-9]', 'letter_digit': '^[A-Za-z]{1,2}[0-9]+$'}
min_style_share 0.5
allowed_missing ['remove_rows op=!=']
min_script_rows 60
min_followup_rows 30
min_number_word_rows 60
Darvoza nimani tekshiradi
Yettita savol:
- Har bir amal ko'rinadimi? Toollarning har bir tanlov qiymati —
agg=count_distinct,op=not_in,period=quarter— trainingda kamidamin_rowsmarta uchrashi kerak. - Har bir tool yolg'iz ishlatiladimi? Faqat boshqa toollar bilan birga ko'rilgan toolni model yolg'iz chaqirishni o'rganmaydi.
- Uzunlik. So'rovlar uzunligi bo'yicha guruhlar (1-3, 4-5, 6-10, 11+ so'z) — har bir guruhning
trainingdagi ulushi testdagi ulushning kamida
min_length_shareqismi bo'lishi kerak. - Savol berish ulushi har bir uzunlikda testdagidan juda farq qilmasin — aks holda model "qisqa so'rov — demak savol beraman" degan noto'g'ri qoidani o'rganadi.
- Har bir tool har bir yozuvda. Har bir tool o'zbek kirill, rus va lotin yozuvidagi so'rovda
kamida
min_script_rowsmarta. - Davomli suhbat. Har bir tool suhbatning ikkinchi so'rovi sifatida ham uchrashi kerak.
- So'z bilan yozilgan sonlar — "5 mln", "2 mlrd" kabi.
Bu kitob yozilgan kuni yana ikkitasi qo'shildi — ular haqida bob oxirida.
Darvozani haqiqiy fayllarda ishga tushiramiz
tez8 va tez10 ning training fayllarini ikki xil test to'plamlari bilan solishtiramiz: o'zimizning "toza" to'plamlar va real jadvallar:
from training.coverage import find_gaps asboblar = json.load(open(TEZ / "prompt/tools.json", encoding="utf-8")) toza_nomlar = ["loans", "deposits", "cash_desk", "transactions", "realistic_loans", "realistic_deposits", "realistic_cash"] toza = [s for n in toza_nomlar for s in json.load(open(TEZ / f"accuracy/suites/{n}/questions.json", encoding="utf-8"))] real = [s for f in sorted(glob.glob(str(TEZ / "accuracy/suites/real_*/questions.json"))) for s in json.load(open(f, encoding="utf-8"))] real_jadvallar = [json.load(open(f, encoding="utf-8")) for f in sorted(glob.glob(str(TEZ / "prompt/domains/real_*/table.json")))] for model in ("tez8", "tez10"): qatorlar = [json.loads(q) for q in open(Path.home() / f"tez_runs/{model}/data/train.jsonl", encoding="utf-8")] print(f"== {model}: {len(qatorlar):,} qator") print(f" toza to'plamlarga nisbatan ({len(toza)} savol):") for kamchilik in find_gaps(qatorlar, toza, asboblar, qoidalar): print(" -", kamchilik) print(f" real to'plamlarga nisbatan ({len(real)} savol):") for kamchilik in find_gaps(qatorlar, real, asboblar, qoidalar, real_jadvallar): print(" -", kamchilik)
== tez8: 19,886 qator
toza to'plamlarga nisbatan (320 savol):
- group_and_total agg=count_distinct: 0 rows
- top_n group.agg=count: 0 rows
- 4-5 words: 21% of training vs 41% of test
- 1-3 words: 16% of training vs 27% of test
real to'plamlarga nisbatan (105 savol):
- group_and_total agg=count_distinct: 0 rows
- top_n group.agg=count: 0 rows
- 4-5 words: 21% of training vs 45% of test
- 1-3 words: 16% of training vs 27% of test
- upper_code column names: 1% of training vs 51% of test
- starts_with_digit column names: 0% of training vs 6% of test
- letter_digit column names: 0% of training vs 14% of test
== tez10: 20,744 qator
toza to'plamlarga nisbatan (320 savol):
- group_and_total agg=count_distinct: 0 rows
- top_n group.agg=count: 0 rows
- 4-5 words: 20% of training vs 41% of test
- 1-3 words: 15% of training vs 27% of test
real to'plamlarga nisbatan (105 savol):
- group_and_total agg=count_distinct: 0 rows
- top_n group.agg=count: 0 rows
- 4-5 words: 20% of training vs 45% of test
- 1-3 words: 15% of training vs 27% of test
- upper_code column names: 2% of training vs 51% of test
- starts_with_digit column names: 0% of training vs 6% of test
- letter_digit column names: 0% of training vs 14% of test
Har bir qator — training ma'lumotidagi teshik. Ularni birma-bir o'qiymiz.
Eng katta teshik: uzunlik
Ikkala model ham bir xil kamchilik bilan o'qitilgan: qisqa so'rovlar yetishmaydi. Testda savollarning deyarli yarmi 4-5 so'zli, trainingda esa beshdan biri. 12-bobda sababini ko'rgan edik: o'qituvchi uzun yozadi.
Darvoza bu teshikni birinchi marta tez9 tayyorlanayotganda ushladi. Xatolar jurnalida bu ikki qator:
- 6-xato. 12-partiya va "qila olmayman" qatorlari deyarli faqat uzun so'rovlar qo'shdi (75 foizi 11 so'zdan uzun, 4-5 so'zlisi 2 foiz). Darvoza o'tmadi: 4-5 so'z trainingda 18 foiz, testda 41 foiz. Qisqa so'rovlar uchun alohida 13-partiya va qo'shimcha yasaldi — taxminan bir yarim soat.
- 7-xato. 13-partiyadan keyin ham darvoza 0.1 foiz bilan o'tmadi (20.50 foiz, kerak edi 20.60), chunki kerakli qatorlar soni oldindan hisoblanmagan edi. Yana bitta qo'shimcha — o'n besh daqiqa.
Qoidalar: yangi ma'lumot yasashdan oldin uning uzunlik aralashmasini testga solishtirish; va partiya hajmini darvoza formulasi bilan oldindan hisoblash.
Va baribir: tez8 ham, tez10 ham bu teshik bilan o'qitildi. Nega?
Darvoza — qaror, buyruq emas
Darvoza ma'lumotni o'zi tuzatmaydi. U faqat aytadi. Trainingni boshlash — baribir odamning qarori.
tez10 tayyorlanayotganda darvoza ikkita kamchilik ko'rsatdi (o'sha kungi qoidalar bilan):
count_distinct nol qator va 4-5 so'zli so'rovlar 20 foizga qarshi 41 foiz. Ikkalasi ham tez8 da
ham bor edi. tez10 ning maqsadi — tez8 bilan bitta farq ("qila olmayman" qatorlari). Teshiklarni
yopish uchun yangi ma'lumot qo'shilsa, bu ikkinchi o'zgarish bo'lardi, va tez10 natijasini hech narsa
bilan solishtirib bo'lmasdi (9-bobdagi saboq). Shuning uchun ikki kamchilik yozma ravishda qabul
qilindi.
Bu muhim farq: darvozani e'tiborsiz qoldirish va uning kamchiligini ongli ravishda qabul qilish — ikki xil narsa. Ikkinchisida biz natija qanday chiqishini taxminan bilamiz va uni teshik bilan izohlay olamiz.
Bugun qo'shilgan ikki tekshiruv
Bu kitob yozilgan kuni darvozaga ikkita yangi tekshiruv qo'shildi. Ikkalasi ham real testdagi xatolarni tahlil qilish paytida paydo bo'lgan (6-qism), va yuqoridagi natijada ular allaqachon ko'rinib turibdi.
1. Ichma-ich tanlovlar. Avvalgi darvoza faqat argumentning birinchi qavatidagi tanlovlarni
sanardi. top_n ning group ob'ekti ichidagi agg esa — ichkarida. Yangi tekshiruv ichkariga ham
kiradi, va darhol topdi: top_n group.agg=count: 0 rows. Ya'ni tez8 hech qachon "eng ko'p
tranzaksiya qilgan mijozlar" kabi soni bo'yicha reytingni ko'rmagan. 13-bobda generatorga shu
reytinglar qo'shildi.
2. Ustun nomlarining uslubi. Darvoza endi training promptlaridagi ustun nomlarini test jadvallaridagi nomlar bilan solishtiradi — uslub bo'yicha:
for uslub, naqsh in qoidalar["column_styles"].items(): print(f"{uslub:24s} {naqsh}")
snake_case ^[a-z][a-z0-9_]*$
with_spaces_or_symbols [^A-Za-z0-9_]
upper_code ^[A-Z][A-Z0-9_]*$
starts_with_digit ^[0-9]
letter_digit ^[A-Za-z]{1,2}[0-9]+$
Real jadvallarning yarmidan ko'p ustun nomi — PAY_0, LIMIT_BAL kabi katta harfli kodlar. tez8
promptlarida bunday nomlar — bir foiz. G1, G2 kabi harf-raqam nomlar va 01122023mlrdsom kabi
raqam bilan boshlanadigan nomlar — umuman yo'q. Model bunday jadvalni birinchi marta testda ko'radi.
Sarlavhalarni qayta nomlash bosqichiga (15-bob) shunday uslubdagi nomlar qo'shildi.
Va uzunlik qoidasi qattiqroq qilindi: guruh ulushi testdagining yarmi emas, to'rtdan uch qismi bo'lishi kerak. Shuning uchun yuqorida endi "1-3 so'z" ham kamchilik sifatida chiqadi.
Darvozaning chegarasi
Bir narsani tan olish kerak. Darvoza training ma'lumotini test to'plamlariga o'xshatadi. Test to'plamlarini esa biz yozganmiz. Agar bizning testlarimiz tahlilchining haqiqiy savollariga o'xshamasa, darvoza ma'lumotni noto'g'ri yo'nalishga tortadi — juda ishonchli ko'rinib.
Real jadvallar ustidagi to'plamlar bu xavfni kamaytiradi: jadvallar haqiqiy. Lekin ulardagi savollarni ham biz yozganmiz. Haqiqiy yechim — tahlilchining o'zi yozgan savollar, va ular hali yo'q. Ular paydo bo'lganda, darvozaning birinchi ishi — ularga nisbatan ishga tushish.
Xulosa
- Qamrov darvozasi trainingdan oldin training ma'lumotida hech qachon ko'rinmaydigan narsalarni topadi: amallar, uzunliklar, yozuvlar, suhbat, sonlar, ustun uslublari.
- Eng katta va eng uzoq yashagan teshik — qisqa so'rovlar: testda 4-5 so'zli savollar 41-45 foiz, trainingda 20-21 foiz.
- Darvoza qaror qilmaydi. tez10 ikkita ma'lum kamchilik bilan, yozma qaror bilan o'qitildi — chunki maqsad bitta o'zgarish edi.
- Bugun qo'shilgan tekshiruvlar yana ikkita teshikni topdi: soni bo'yicha reyting nol, va kod uslubidagi ustun nomlari deyarli yo'q.
- Darvoza ma'lumotni bizning testlarimizga o'xshatadi; tahlilchining haqiqiy savollari bo'lmaguncha bu chegara qoladi.
Keyingi bob — to'rtinchi qismning oxirgisi: modelga savol berishni va "buni qila olmayman" deyishni qanday o'rgatdik.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.