Asosiy qismga o'tish

tez14 dan tez17 gacha: sabab topilguncha o'qitmaslik

33-bob 8 kod bloki 4515 so'z

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):

python63 qator
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}")
Chiqish
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.

python28 qator
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()))
Chiqish
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):

python6 qator
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()))
Chiqish
                                   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.

python19 qator
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()})
Chiqish
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:

python8 qator
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}")
Chiqish
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.

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

  1. Hisoblangan ustun qadamlaridagi nomlar promptdagi nomlarga almashtirildi: 2 335 dan 0 ga. Boshqa hech bir qator o'zgarmadi.
  2. Bitta eng katta qator va guruh uchun yangi qatorlar: n = 1 bo'lgan 504 qadam.
  3. 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:

  1. 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.
  2. Bitta eng katta qator so'rovlarining 40% idan kami to'g'ri bo'lsa, ikkinchisi rad etiladi. Hozir: 16 tadan 1.
  3. 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):

python1 qator
print((DATA / "tez17" / "tez17_holat.txt").read_text(encoding="utf-8"))
Chiqish
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

python5 qator
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]}...")
Chiqish
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.

Telegramda yozish Narxlar