Asosiy qismga o'tish

Coverage gate (qamrov darvozasi): trainingdan oldin nima yetishmasligini topish

16-bob 3 kod bloki 1487 so'z

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:

python7 qator
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}")
Chiqish
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:

  1. Har bir amal ko'rinadimi? Toollarning har bir tanlov qiymati — agg=count_distinct, op=not_in, period=quarter — trainingda kamida min_rows marta uchrashi kerak.
  2. Har bir tool yolg'iz ishlatiladimi? Faqat boshqa toollar bilan birga ko'rilgan toolni model yolg'iz chaqirishni o'rganmaydi.
  3. 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_share qismi bo'lishi kerak.
  4. 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.
  5. Har bir tool har bir yozuvda. Har bir tool o'zbek kirill, rus va lotin yozuvidagi so'rovda kamida min_script_rows marta.
  6. Davomli suhbat. Har bir tool suhbatning ikkinchi so'rovi sifatida ham uchrashi kerak.
  7. 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:

python17 qator
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)
Chiqish
== 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:

python2 qator
for uslub, naqsh in qoidalar["column_styles"].items():
    print(f"{uslub:24s} {naqsh}")
Chiqish
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.

Telegramda yozish Narxlar