tez14 dan tez17 gacha: sabab topilguncha o'qitmaslik
Maqsad
31-bob tez14 rejasi bilan tugagan edi. Shundan keyin to'rt kun ichida uchta model o'qitildi (tez14-agent, tez15-agent, tez16-agent) va to'rtinchisi (tez17-agent) shu bob yozilayotgan paytda o'qimoqda. Bu bobda hammasi ochiq turadi: qaysi model nimaga yetdi, qaysi taxmin noto'g'ri chiqdi, mahsulot modeli qanday almashdi va eng qimmatga tushgan xato qayerda yashiringan ekan.
Qisqa javob oldindan: tez15-agent mahsulot modeli bo'ldi (tez8 o'rniga), tez16-agent nomzod bo'lib turibdi, tez17-agent esa uchta o'lchangan kamchilikni birdan tuzatishga urinadi. Shu jumladan 2026-yil 4-noyabrdan beri har bir agent modelida bo'lgan bitta eksport xatosini.
Hamma eski yozuvlar bitta engine bilan qayta baholanadi (31-bobdagi usul):
import json from collections import Counter from pathlib import Path from accuracy.run import open_data, expected_results, judge, load_json from runtime.client import parse_answer JADVALLAR = Path("/mnt/d/Tez_spikes/data") NATIJA = TEZ / "results" SUITES = TEZ / "accuracy" / "suites" SOZLAMA = load_json(TEZ / "accuracy" / "settings.json") QATOR = {"loans": "loans", "deposits": "deposits", "cash_desk": "cash_desk", "transactions": "bank", "realistic_loans": "loans", "realistic_deposits": "deposits", "realistic_cash": "cash_desk"} REAL = ("real_regions", "real_banks", "real_industry", "real_fx_rates", "real_credit_clients", "real_retail") ESKI = {**QATOR, **{f"noisy_{k}": v for k, v in QATOR.items()}, **{t: t for t in REAL}} MODELLAR = {"tez8": "tez8g", "churn8": "churn8g", "tez13-agent": "tez13a", "tez14-agent": "tez14a", "tez15-agent": "tez15a"} FRESH2_NOMI = {"tez8": "tez8", "churn8": "churn8"} def xavfsiz(con, savol, chiqish, kutilgan): try: return judge(con, savol, parse_answer(chiqish), kutilgan, SOZLAMA)[0] except ValueError: return False def soradi(yozuv): javob = parse_answer(yozuv["output"]) return isinstance(javob, dict) and "ask" in javob def baholash(toplam, savollar_fayli, fayl_nomi): natija = {} for suite, jadval in toplam.items(): savollar = load_json(SUITES / suite / f"{savollar_fayli}.json") idlar = {s["id"]: s for s in savollar} con = open_data(str(JADVALLAR / f"{jadval}.csv")) kutilgan = expected_results(con, savollar, SOZLAMA) for model in MODELLAR: fayl = NATIJA / fayl_nomi(model, suite) if not fayl.exists(): continue for qator in fayl.read_text(encoding="utf-8").splitlines(): yozuv = json.loads(qator) savol = idlar[yozuv["id"]] natija[(model, suite, yozuv["id"])] = (xavfsiz(con, savol, yozuv["output"], kutilgan), savol["expect"] == "ask", soradi(yozuv)) return natija eski = baholash(ESKI, "questions", lambda m, s: f"{MODELLAR[m]}_cpu_{s}.jsonl") fresh2 = baholash({t: t for t in REAL}, "fresh2", lambda m, s: f"fresh2{FRESH2_NOMI.get(m, MODELLAR[m])}_cpu_{s}.jsonl") def satr(natija, model): q = [v for (m, _, _), v in natija.items() if m == model] aniq = [v for v in q if not v[1]] return f"{sum(v[0] for v in q):3d}/{len(q)}", f"{sum(v[2] for v in aniq)}/{len(aniq)}", f"{sum(v[2] for v in q if v[1])}/{len(q) - len(aniq)}" print(f"{'model':12s} {'eski 745':>8s} {'aniq savolda so`radi':>21s} {'fresh2':>7s} {'aniq savolda so`radi':>21s} {'noaniqda so`radi':>17s}") for model in MODELLAR: (e, ea, _), (f, fa, fn) = satr(eski, model), satr(fresh2, model) print(f"{model:12s} {e:>8s} {ea:>21s} {f:>7s} {fa:>21s} {fn:>17s}")
model eski 745 aniq savolda so`radi fresh2 aniq savolda so`radi noaniqda so`radi tez8 707/745 1/673 59/92 0/79 3/13 churn8 700/745 3/673 61/92 0/79 3/13 tez13-agent 702/745 0/673 56/92 0/79 0/13 tez14-agent 710/745 8/673 70/92 7/79 9/13 tez15-agent 707/745 7/673 73/92 6/79 8/13
Jadvalni o'qish. tez14-agent va tez15-agent eski savollarda tez8 darajasida, fresh2 da esa undan ancha yuqori: odam yozgan, ko'rilmagan savollarda 59 dan 70 va 73 ga. tez13-agent umuman so'ramagan noaniq savollarda endi so'rash qaytdi. Lekin o'ng tomonda narxi ko'rinadi: ikkala model aniq savolda ham so'rab qo'yadi. Qoida (o'qitishdan oldin yozilgan) bunga ko'pi bilan 1% ruxsat berardi. tez14 shu qoidadan va grafiklar bo'yicha bitta savoldan o'tmadi, tez15 esa faqat shu qoidadan o'tmadi. Ikkalasi ham qabul qilinmadi.
Ikki marta noto'g'ri sabab
tez14 ning ortiqcha so'rashlarini ko'rib, sababni darrov yozib qo'ydim: "bajarib bo'lmaydi" qatorlaridagi valyuta kursi misoli. Bu o'lchanmagan edi va o'lchaganda noto'g'ri chiqdi (39-xato). Keyin ikkinchi sabab topildi, bu safar o'qitish faylida sanab: ikki turdagi 163 ta rad qatori oddiy so'rovlarni rad etishni o'rgatardi. tez15 aynan shu 163 qator olib tashlangan fayl bilan o'qitildi, boshqa hech narsa o'zgarmadi. Rejaga uni nima rad etishi ham oldindan yozildi: aniq savolda so'rash 1% dan tushmasa, sabab noto'g'ri.
Tushmadi. Yuqoridagi jadvalda tez15 ning o'ng ustunlari tez14 nikidan deyarli farq qilmaydi. O'chirish 15 ta noto'g'ri raddan 5 tasini javobga aylantirdi, 9 tasi qoldi, 3 tasi yangi paydo bo'ldi. Sabab o'z raqami bilan rad etildi (40-xato). Saboq: namunaga o'xshashlik sabab emas. Sababni faqat oldindan yozilgan rad raqami tekshiradi.
Modelni emas, mahsulotni baholash
Shu paytgacha qoidalar yalang'och modelni baholardi. Foydalanuvchi esa modelni emas, mahsulotni ishlatadi: model, ustiga validator va confidence gate (29-bob). Bu stack bilan tez8 ning o'zi ham aniq savollarda so'raydi. Demak "1%" qoidasi mahsulotga emas, modelga yozilgan ekan.
Yangi qoidalar yozildi, keyin yangi to'plam: fresh3, olti haqiqiy jadvalda 92 so'rov, 14 tasi noaniq. Qoidalar to'plamdan oldin, to'plam esa modellar ishga tushishidan oldin muzlatildi. To'rt qoida: aniqlik kamida 90%, noaniq so'rovlarning kamida 80% i ushlanishi, aniq savolda so'rash tez8 nikidan ko'pi bilan 3 taga ortiq, jim xato tez8 nikidan ko'p emas. "Jim xato" bu kitobning eng muhim o'lchovi: model so'ramasdan bajardi va noto'g'ri bajardi. Foydalanuvchi buni ko'rmaydi, shuning uchun u eng xavfli.
def yozuvlar(fayl_boshi, toplam, papka): for jadval in REAL: savollar = {s["id"]: s for s in load_json(SUITES / jadval / f"{toplam}.json")} for qator in (papka / f"{fayl_boshi}_cpu_{jadval}.jsonl").read_text(encoding="utf-8").splitlines(): yozuv = json.loads(qator) yield savollar[yozuv["id"]], yozuv def hisob(fayl_boshi, toplam, papka): h = Counter() for savol, y in yozuvlar(fayl_boshi, toplam, papka): aniq = savol["expect"] != "ask" soralgan = y["reason"] == "asked on a clear request" h["aniq"] += aniq h["noaniq"] += not aniq h["togri"] += y["correct"] h["aniq_togri"] += aniq and y["correct"] h["aniqda_soradi"] += soralgan h["jim_xato"] += aniq and not y["correct"] and not soralgan h["noaniq_ushlandi"] += (not aniq) and y["correct"] return h f3 = {"tez8 + stack": hisob("fresh3tez8s", "fresh3", NATIJA), "tez15 + stack": hisob("fresh3tez15a", "fresh3", NATIJA)} print(f"{'fresh3':28s}" + "".join(f"{m:>16s}" for m in f3)) for nom, kalit in (("aniq savolda to'g'ri", "aniq_togri"), ("aniq savolda so'radi", "aniqda_soradi"), ("jim xato", "jim_xato"), ("noaniq ushlandi", "noaniq_ushlandi")): print(f"{nom:28s}" + "".join(f"{h[kalit]:16d}" for h in f3.values())) print(f"{'aniqlik (javob berganda)':28s}" + "".join(f"{h['aniq_togri'] / (h['aniq'] - h['aniqda_soradi']):16.1%}" for h in f3.values()))
fresh3 tez8 + stack tez15 + stack aniq savolda to'g'ri 57 61 aniq savolda so'radi 12 13 jim xato 9 4 noaniq ushlandi 11 14 aniqlik (javob berganda) 86.4% 93.8%
tez15 to'rt qoidadan o'tdi, tez8 aniqlik qoidasidan o'tmadi. Oldindan yozilgan qaror bo'yicha tez15-agent mahsulot modeli bo'ldi. Jim xato ikki baravardan ko'proq kamaydi, noaniq so'rovlarning hammasi ushlandi. tez8 ning jim xatolari qayerdaligi ham ko'rindi: 9 tadan 6 tasi oddiy jami yoki o'rtachaga hech kim so'ramagan guruhlash qo'shilgani.
tez16: bitta shakl, o'lchangan sabab
Bu safar sabab avval sanaldi, keyin gapirildi. tez15 ning fresh2 va fresh3 dagi 34 xatosidan 13 tasi guruhsiz
jami: "jami depozit", "o'rtacha limit". O'qitish faylida bunday qator deyarli yo'q edi. Uchta faylni bitta
skript bilan o'lchaymiz (o'lchov build ichida emas: fayllar 280 MB dan, natija datasets/tez17/fayllar.json da,
skript yonida fayllar_olchash.py):
fayllar = json.loads((DATA / "tez17" / "fayllar.json").read_text(encoding="utf-8")) ustunlar = (("qatorlar", "qatorlar"), ("so'rash qatorlari", "sorash"), ("jami qadamlari", "jami"), ("shundan guruhsiz", "jami_guruhsiz"), ("top_n qadamlari", "top_n"), ("shundan n = 1", "top_bitta"), ("hisoblangan ustun qadamlari", "hisob"), ("jadvalda yo'q ustun nomi bilan", "hisob_yoq_ustun")) print(f"{'':32s}" + "".join(f"{nom:>14s}" for nom in fayllar)) for nom, kalit in ustunlar: print(f"{nom:32s}" + "".join(f"{f[kalit]:14d}" for f in fayllar.values()))
tez15-agent tez16-agent tez17-agent qatorlar 35366 36950 38258 so'rash qatorlari 2750 2750 2750 jami qadamlari 5232 6816 6820 shundan guruhsiz 114 1594 1598 top_n qadamlari 4344 4344 4848 shundan n = 1 0 0 504 hisoblangan ustun qadamlari 3363 3363 3363 jadvalda yo'q ustun nomi bilan 2335 2335 0
tez15 faylida 5 232 jami qadamidan atigi 114 tasi guruhsiz. Model "jami" so'zini ko'rsa, guruhlashni o'rgangan, chunki deyarli har bir misol shunday edi. tez16 fayliga 1 584 yangi qator qo'shildi (bir qismi rad etilgan tez9 dan qolgan, hech qachon ishlatilmagan qatorlar: 45-xato). Qolgan ikki qatorga keyinroq qaytamiz, ular bu bobning asosiy topilmasi.
Test to'plami yana oldindan muzlatildi: fresh4, 128 so'rov, toifalarga bo'lingan. Asosiy qoida: guruhsiz jami oilasidagi 85 so'rovdan kamida 68 tasi to'g'ri va tez15 dan kamida 20 taga ko'p.
YOZUV = DATA / "tez17" / "yozuvlar" OILA = ("plain", "filter_total", "followup_total") def toifalar(fayl_boshi, toplam): h = Counter() for savol, y in yozuvlar(fayl_boshi, toplam, YOZUV): h[savol["category"], "n"] += 1 h[savol["category"], "togri"] += y["correct"] return h t15, t16 = toifalar("fresh4tez15b", "fresh4"), toifalar("fresh4tez16a", "fresh4") print(f"{'fresh4 toifasi':18s} {'soni':>5s} {'tez15':>6s} {'tez16':>6s}") for toifa in sorted({k for k, _ in t15}): print(f"{toifa:18s} {t15[toifa, 'n']:5d} {t15[toifa, 'togri']:6d} {t16[toifa, 'togri']:6d}") print(f"{'guruhsiz oila':18s} {sum(t15[t, 'n'] for t in OILA):5d} {sum(t15[t, 'togri'] for t in OILA):6d} {sum(t16[t, 'togri'] for t in OILA):6d}") jim = {m: sum((hisob(f"{t}{m}", t, YOZUV) for t in ("fresh2", "fresh3")), Counter()) for m in ("tez15b", "tez16a")} print("fresh2 va fresh3 birga, jim xato:", {m: h["jim_xato"] for m, h in jim.items()}, " aniq savolda so'radi:", {m: h["aniqda_soradi"] for m, h in jim.items()})
fresh4 toifasi soni tez15 tez16
ask 12 7 8
filter_total 24 2 18
followup_grouped 4 4 4
followup_total 24 2 23
grouped 12 10 10
neighbor 15 12 12
plain 37 21 31
guruhsiz oila 85 25 72
fresh2 va fresh3 birga, jim xato: {'tez15b': 9, 'tez16a': 10} aniq savolda so'radi: {'tez15b': 24, 'tez16a': 19}
Asosiy qoida katta farq bilan bajarildi: 85 tadan 25 edi, 72 bo'ldi, birorta ham to'g'ri javob buzilmadi. Guruhli jamilar joyida qoldi. Olti qoidadan beshtasi o'tdi. Oltinchisi oxirgi satrda: eski to'plamlarda jim xato tez15 nikidan ko'p bo'lmasligi kerak edi, 9 edi, 10 bo'ldi. Bitta javob. Qoida oldindan yozilgan, shuning uchun tez16 qabul qilinmadi.
Bu yerda xato qoidaning o'zida edi (49-xato). Chegaraga hech qanday zaxira qo'yilmagan, holbuki xuddi shu o'lchov tez8 ni faqat boshqa seed bilan qayta o'qitganda 13 dan 7 ga siljigan. Ya'ni bitta javoblik farq hech narsani isbotlamaydi: na tez16 xavfliroq ekanini, na xavfsiz ekanini. Lekin natijani ko'rgandan keyin qoidani o'zgartirish bundan ham yomon. Hukm o'z joyida qoldi, saboq esa keyingi qoidaga yozildi.
Sababni izlash: 1 194 javob
Egasi shunday dedi: "haqiqiy sababni top, qancha vaqt ketsa ham". Yangi o'qitish o'rniga ikkala modelning 1 194 tadan saqlangan javobi o'qitish fayli bilan birma-bir solishtirildi. GPU ishlatilmadi. Beshta sabab chiqdi, har biri o'z raqami bilan.
Birinchisi kod xatosi bo'lib chiqdi (51-xato). Eksport paytida jadval ustunlari qayta nomlanadi, model har xil sarlavhalarni ko'rsin deb. Rejadagi ustun nomlari ham shunga mos almashtiriladi. Ikki ustundan yangi ustun hisoblaydigan tool lar 4-noyabrda qo'shilgan edi va ularning argumentlari boshqa belgi bilan yozilgan, almashtirish kodi esa bu belgini bilmasdi. Natija yuqoridagi jadvalning oxirgi satrida: 3 363 hisoblash qadamidan 2 335 tasi promptdagi jadvalda umuman yo'q ustun nomini yozadi. Model shundan "ustun nomini jadvaldan emas, so'rovdan yasab yoz" degan qoidani o'rgandi.
Haqiqiy jadvalda grammatika uni to'g'ri nomga majburlaydi, javob to'g'ri chiqadi, lekin o'sha majburlangan token ishonchni tushirib yuboradi va gate to'g'ri javobni ushlab qoladi. Buni yangi to'plamdagi yozuvlarda ko'rish mumkin:
ishonch = {} for model in ("fresh5tez15c", "fresh5tez16b"): for savol, y in yozuvlar(model, "fresh5", YOZUV): if savol["expect"] != "ask" and not soradi(y): ishonch.setdefault((model, savol["category"] == "compute"), []).append((y["confidence"], y["held"] == "low confidence")) for (model, hisoblash), q in sorted(ishonch.items()): median = sorted(c for c, _ in q)[len(q) // 2] print(f"{model[6:]:7s} {'hisoblangan ustun' if hisoblash else 'boshqa so`rovlar':18s} {len(q):4d} javob, median ishonch {median:.3f}, gate ushladi {sum(u for _, u in q):3d}")
tez15c boshqa so`rovlar 136 javob, median ishonch 0.995, gate ushladi 7 tez15c hisoblangan ustun 13 javob, median ishonch 0.719, gate ushladi 11 tez16b boshqa so`rovlar 136 javob, median ishonch 0.996, gate ushladi 4 tez16b hisoblangan ustun 13 javob, median ishonch 0.765, gate ushladi 11
Hisoblangan ustun so'rovlarida ishonch boshqa hamma so'rovlardagidan ancha past va gate ularning ko'pini ushlaydi. Bu xato tez12 dan beri har bir agent modelida bor edi. Besh model shu bilan o'qitildi va hech bir tekshiruv uni ko'rmadi, chunki hech biri "rejadagi har bir ustun nomi promptda bormi" deb so'ramagan. Endi shunday tekshiruv bor va har bir tool ni qamraydi.
Qolgan sabablar:
- Bitta eng katta qator. "Eng katta bank qaysi" degan so'rovning javobi
top_n, n = 1. Jadvalda ko'rinadi: 4 344 ta top_n qadamidan 0 tasi n = 1, chunki generator faqat 3, 5, 10 va 20 ni tanlardi. Modellar bunday so'rovda bitta sonni yoki guruhli maksimumni qaytaradi. - Validator teshiklari. Filtrdan keyingi foydasiz guruhlashni va nol qatordan hisoblangan jamini validator o'tkazib yuborardi. Ikkinchisini tashqi tekshiruvchi topdi.
- Qiymatni tarjima qilish. O'qitishda filtr qiymatlarining 97% i so'rovda aynan jadvaldagidek yozilgan. Haqiqiy so'rovda esa "Samarqand viloyati" deyiladi, jadvalda "Samarkand region" turadi. Bunday so'rovlarda model rad etadi: 41 tadan 11 tasida.
- Nom bo'yicha filtr. Har bir qatori bitta bank yoki viloyat bo'lgan jadvallarda nom bo'yicha filtr qatori umuman yo'q edi, chunki generator nom ustunini identifikator deb belgilagan.
Validator darhol tuzatildi, chunki bu kod, o'qitish kerak emas. Saqlangan javoblarda o'lchandi: tez16 ning jim xatosi 39 dan 32 ga, tez15 niki 84 dan 62 ga tushdi, birorta to'g'ri javob ushlanmadi. Birinchi variantim to'g'ri, so'ralgan guruhlashni ham ushlab qo'yardi. Buni ham tashqi tekshiruvchi topdi va qoida toraytirildi.
Ikkinchi fikr: boshqa model tekshiradi
tez16 dan beri har bir reja, test to'plami va natija ikkinchi modelga (GPT) mustaqil tekshiruvga beriladi. U fayllarni o'zi o'qiydi va raqamlarni o'zi qayta sanaydi. Uning topganlari: test to'plamidagi noto'g'ri yorliqlar, o'qitish faylida o'lchovi aytilmagan so'rov, o'qitish qatorlari ichidagi himoyalangan test so'rovlari, noto'g'ri ustun bilan "to'g'ri" deb baholangan javob (50-xato), validatorning ortiqcha ushlashi, mening noto'g'ri bir da'vom (52-xato) va noto'g'ri bir sonim. Har biri bajarishdan oldin tuzatildi va rejada sanasi bilan yozilgan. Bitta modelning o'z ishini o'zi tekshirishi yetmaydi: shu ro'yxat buning o'lchovi.
fresh5: tez16 nomzod bo'ldi
Yangi taqqoslash yana oldindan muzlatildi. fresh5: 176 so'rov, 15 toifa, hamma tool lar. Yonida fresh6: 73 so'rov, muhrlangan, unda hali hech bir model ishlamagan va keyingi qarorgacha ishlamaydi. Bu safar har bir kutilgan reja uchun eng yaqin noto'g'ri rejalar ham tekshirildi: ustun almashtirilsa, taqqoslash teskari qilinsa, natija farq qilishi shart. Jim xato qoidasiga endi zaxira qo'yildi va uni egasi tanladi: har 100 aniq so'rovga ko'pi bilan 2 ta ortiq jim xato, ya'ni 159 tada ko'pi bilan 3 ta. Bu statistik baho emas, mahsulot egasining qarori, va shunday deb yozilgan.
f5 = {"tez15": hisob("fresh5tez15c", "fresh5", YOZUV), "tez16": hisob("fresh5tez16b", "fresh5", YOZUV)} a, b = f5["tez15"], f5["tez16"] print(f"fresh5: {a['aniq'] + a['noaniq']} so'rov, {a['aniq']} aniq, {a['noaniq']} noaniq") print(f"1. jim xato: {a['jim_xato']:3d} -> {b['jim_xato']:3d} (ko'pi bilan {a['jim_xato'] + 3})") print(f"2. to'g'ri javob: {a['togri']:3d} -> {b['togri']:3d} (kamaymasligi kerak)") print(f"3. noaniq ushlandi: {a['noaniq_ushlandi']:3d} -> {b['noaniq_ushlandi']:3d} (ko'pi bilan 2 ta kam)") print(f" aniq savolda so'radi:{a['aniqda_soradi']:3d} -> {b['aniqda_soradi']:3d} (ko'pi bilan {a['aniqda_soradi'] + 3})") t15, t16 = toifalar("fresh5tez15c", "fresh5"), toifalar("fresh5tez16b", "fresh5") print(f"{'4. toifa':14s} {'soni':>5s} {'tez15':>6s} {'tez16':>6s}") for toifa in sorted({k for k, _ in t15}): print(f" {toifa:11s} {t15[toifa, 'n']:5d} {t15[toifa, 'togri']:6d} {t16[toifa, 'togri']:6d}")
fresh5: 176 so'rov, 159 aniq, 17 noaniq 1. jim xato: 16 -> 16 (ko'pi bilan 19) 2. to'g'ri javob: 116 -> 125 (kamaymasligi kerak) 3. noaniq ushlandi: 17 -> 17 (ko'pi bilan 2 ta kam) aniq savolda so'radi: 44 -> 35 (ko'pi bilan 47) 4. toifa soni tez15 tez16 ask 17 17 17 chart 9 8 7 compute 13 2 2 entity 16 3 1 export 8 8 8 filter_name 24 16 16 filter_num 15 15 15 followup 17 7 10 grouped 4 4 4 policy 4 0 1 remove 10 10 10 select 10 7 7 sort 3 3 3 topn 4 4 4 total 22 12 20
tez16 to'rt qoidaning hammasidan o'tdi va nomzod bo'ldi. Mahsulotga qo'yish alohida qaror, uni egasi beradi, va u
tez17 ni kutishni tanladi. Jadvalning o'zi nega ekanini ko'rsatadi. total toifasi tuzaldi, lekin uchta toifa
ikkala modelda ham past: compute (hisoblangan ustun, gate ushlaydi), entity (bitta eng katta qator) va
filter_name (nom bo'yicha filtr). Bular aynan yuqorida topilgan uchta sabab, endi hech qachon ko'rilmagan
so'rovlarda tasdiqlandi.
tez17: uch tuzatish, uch rad raqami
tez17 fayli uchta o'zgarishdan iborat va yuqoridagi fayllar jadvalining oxirgi ustunida ko'rinadi:
- Hisoblangan ustun qadamlaridagi nomlar promptdagi nomlarga almashtirildi: 2 335 dan 0 ga. Boshqa hech bir qator o'zgarmadi.
- Bitta eng katta qator va guruh uchun yangi qatorlar: n = 1 bo'lgan 504 qadam.
- Nom va qiymat bo'yicha filtr uchun yangi qatorlar: 813 qadam, qiymat so'rov tilida aytilgan.
Yo'lda to'rtinchi kamchilik ham topildi: o'zbek kirillidagi so'rovlarda qiymat hech qachon kirillda yozilmagan, chunki konvertor reja qiymatlarini himoya qilardi. Yangi qatorlarda bu tuzatildi (184 tadan 178 tasida qiymat kirillda).
Har bir o'zgarishni nima rad etishi o'qitishdan oldin yozildi, fresh5 da stack bilan o'lchanadi:
- Model to'g'ri rejalashtirgan hisoblangan ustun so'rovlarining yarmidan kami gate dan o'tsa, birinchi tuzatish rad etiladi. Hozir: tez16 da 11 tadan 2 tasi.
- Bitta eng katta qator so'rovlarining 40% idan kami to'g'ri bo'lsa, ikkinchisi rad etiladi. Hozir: 16 tadan 1.
- Nom bo'yicha filtrlarning 20% i yoki ko'prog'i rad etilsa, uchinchisi rad etiladi. Hozir: 24 tadan 6.
Halol cheklovlar ham oldindan yozilgan. Uch o'zgarish bitta o'qitishda, bir kechani tejash uchun, shuning uchun yutuq yoki yo'qotishni bittasiga bog'lab bo'lmaydi. Yangi qatorlar sonidagi maqsadlarga 15 dan 45% gacha yetilmadi. O'zbek va ingliz so'rovlarida teacher qiymatni baribir jadvaldagidek ko'chiradi, ya'ni haqiqiy jadvallardagi bo'shliq faqat qisman yopildi.
O'qitish 2026-yil 10-noyabr 11:49 da boshlandi, retsept tez15 va tez16 niki bilan bir xil. Bob qurilgan paytdagi holat (log dan olingan nusxa):
print((DATA / "tez17" / "tez17_holat.txt").read_text(encoding="utf-8"))
olingan vaqt: 2026-11-10 14:46:20 TRAIN 11:49:53 490/2272 [2:48:02<10:13:51, 20.67s/it]
Natija shu bobga, shu jadvallar yoniga qo'shiladi: to'rt qoida, uch rad raqami va har bir yangi jim xato birma-bir. Yomon chiqsa ham.
Xatolar jurnalidagi yangi qatorlar
jurnal = (TEZ.parents[1] / "12-mistakes-and-lessons.md").read_text(encoding="utf-8").splitlines() for satr in jurnal: qism = [q.strip() for q in satr.split("|")] if len(qism) > 4 and qism[1].isdigit() and 39 <= int(qism[1]) <= 52: print(f"{qism[1]}. {qism[2]}: {qism[3][:150]}...")
39. 2026-11-08: Wrote the cause of tez14's over-asks into the run note (section 15: the "outside" kind's exchange-rate example, and cannot rows answerable from their ... 40. 2026-11-09: tez15 was trained on a cause matched by pattern: 163 cannot rows of two kinds resembled tez14's wrong refusals and section 16 called it the shape ever... 41. 2026-11-09: Told the user two causes I had not checked. (a) In chat and in a handoff sent to another model: the three gate holds on real_fx_rates in fresh3 are co... 42. 2026-11-09: Joined the fresh2 records with accuracy/suites/*/fresh.json in an offline audit; each folder holds fresh.json, fresh2.json and fresh3.json, and fresh2... 43. 2026-11-09: Described SpreadsheetBench's released instructions as human-authored without reading its construction method. They come from human forum posts, but GP... 44. 2026-11-09: Collected public table-question and text-to-SQL benchmarks and reported their record count as progress toward the human requests Tez needs, without fi... 45. 2026-11-09: Tez9's 441 plain-total rows (255 one-step, 154 after a filter) were dropped with tez9 when it was rejected. The rejection came from the grammar key-or... 46. 2026-11-09: Told the owner and another model, without counting training rows per plan shape, that the remaining failures were not training-shaped, that added rows... 47. 2026-11-09: Reported that no new training request was in a protected suite after checking only the final user turn of each row, and built fresh4 checking its text... 48. 2026-11-09: Gave another model a log command and a logging interval for the tez16 run without running the command or reading the logged steps. The note said loss ... 49. 2026-11-10: Wrote the second part of tez16's rule 5 (silent wrong on fresh2 and fresh3 not above tez15) with no margin, copied from section 18 rule 4, without mea... 50. 2026-11-10: Froze fresh4 after checking that every expected plan executes, without checking that a plausible wrong column gives a different result. In real_indust... 51. 2026-11-10: `training/rename.py` renames a plan's column arguments only for `ref: column` and `columns`. The computed-column tools added on 2026-11-04 mark `left`... 52. 2026-11-10: Wrote into the test-set note and told another model that the judge cannot fail a sort request on its column or direction, after reading only `compare....
Xulosa
To'rt kunda o'n to'rtta yangi xato yozildi va ularning aksariyati bitta turga kiradi: o'lchamasdan aytilgan gap. Ishlagan usul esa har safar bir xil bo'ldi:
- Qoida va rad raqami natijadan oldin yoziladi. Natija yoqmasa ham hukm o'zgarmaydi; o'zgaradigani keyingi qoida.
- Test to'plami modeldan oldin muzlatiladi va bir marta ko'rilgandan keyin dalil bo'lmay qoladi. Shuning uchun har safar yangisi kerak, bittasi esa doim muhrlangan turadi.
- Sabab o'qitish faylida sanaladi. "O'xshaydi" degan sabab bilan o'qitilgan tez15 sababini o'zi rad etdi; sanalgan sabab bilan o'qitilgan tez16 asosiy qoidani 25 dan 72 ga ko'tardi.
- Eng qimmat xato modelda ham, ma'lumot g'oyasida ham emas, eksport kodining bitta shartida edi va besh model davomida yashadi. Uni yangi o'qitish emas, saqlangan javoblarni birma-bir o'qish topdi.
- Ikkinchi, mustaqil tekshiruvchi har safar nimadir topdi.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.