tez6 dan tez8 gacha: eng yaxshi model qanday chiqdi
Uchta model
19-bob saboq bilan tugadi: 200 savollik test bir necha savollik farqni ajrata olmaydi. Bu bobda shundan keyingi uchta model: tez6, tez7 va tez8. tez8 — bu kitob yozilayotgan kunga qadar Tezning mahsulot modeli.
Saqlangan training fayllari va loglaridan:
import json import re import subprocess import pandas as pd def eval_loss(model): log = (Path.home() / f"tez_runs/{model}/train.log").read_text(encoding="utf-8", errors="replace") return float(re.findall(r"'eval_loss': '([0-9.]+)'", log)[-1]) show(pd.DataFrame([ {"model": m, "o'qitish qatorlari": sum(1 for _ in open(Path.home() / f"tez_runs/{m}/data/train.jsonl", encoding="utf-8")), "oxirgi eval_loss": eval_loss(m)} for m in ("tez6", "tez7", "tez8") ])) farq = subprocess.run(["diff", str(Path.home() / "tez_runs/tez7/soup.yaml"), str(Path.home() / "tez_runs/tez8/soup.yaml")], capture_output=True, text=True).stdout print("tez7 va tez8 sozlamalaridagi farq:") print(farq)
tez7 va tez8 sozlamalaridagi farq: 11a12 > mask_history: true 14c15 < epochs: 2 --- > epochs: 1
| model | o'qitish qatorlari | oxirgi eval_loss |
|---|---|---|
| tez6 | 7 434 | 0.032 |
| tez7 | 8 366 | 0.024 |
| tez8 | 19 886 | 0.037 |
tez6 va tez7 — 19-bobdagi modellar bilan bir xil sozlama. tez8 da esa ikki qator o'zgargan, va ma'lumot ikki yarim barobar ko'p. Ya'ni tez8 da bir vaqtda uchta narsa o'zgargan. Bu keyinroq muhim bo'ladi.
tez6: ma'lumot sifati
tez6 ning ma'lumoti (to'rtinchi partiya) 19-bobdagi tahlildan kelib chiqqan aniq kamchiliklarni nishonga oldi: qisqa so'rovlar; "qoldir" va "olib tashla" o'rtasidagi muvozanat (avvalgi ma'lumotda biri ikkinchisidan ko'p edi); o'zbekcha saralash so'zlari ("kamayish tartibida", "o'sish tartibida"); va tekshiruvchi xatolarini tuzatish.
Natija — 200 savolda birinchi marta 183 dan sezilarli yuqori:
TOPLAMLAR = ("transactions", "loans", "deposits", "cash_desk") def ball(prefiks, toplamlar): javoblar = [json.loads(q) for t in toplamlar for q in open(TEZ / f"results/{prefiks}_{t}.jsonl", encoding="utf-8")] return f"{sum(j['correct'] for j in javoblar)}/{len(javoblar)}" for prefiks, izoh in (("tez6", "tez6, GPU"), ("tez6_cpu", "tez6, CPU"), ("tez7", "tez7, GPU"), ("tez7_cpu", "tez7, CPU"), ("tez8_cpu", "tez8, CPU")): print(f"{izoh:12s} {ball(prefiks, TOPLAMLAR)}")
tez6, GPU 191/200 tez6, CPU 189/200 tez7, GPU 188/200 tez7, CPU 189/200 tez8, CPU 197/200
GPU va CPU natijalari biroz farq qiladi — bir xil model, bir xil savollar. 6-bobda ko'rgan kvantlash va hisoblash farqlari chegaradagi bir-ikki savolni og'diradi. Shuning uchun mahsulot qarorlari CPU natijasi bo'yicha qilinadi: tahlilchining kompyuterida GPU yo'q.
tez7: aniq nishon, aniq natija yo'q
tez6 ning qolgan xatolarining eng katta guruhi bitta tur edi: "eng ko'p ... qilgan N ta odam". "Top 5
mijoz", "eng katta qoldig'i bor 10 ta qarzdor", "Топ 3 кассира" — tez6 bunday so'rovlarda odamlar bo'yicha
jamlash o'rniga alohida qatorlarni saralardi. tez7 ning ma'lumotiga shunday reytinglar qo'shildi va
jadvallarga "bu ustun — odam" degan belgi kiritildi (13-bobdagi roles.json).
Natija: GPU da 188 — tez6 dan uchta kam. CPU da 189 — bir xil. 19-bobdagi saboq bo'yicha, bu farqni ajratib bo'lmaydi: tez7 na yaxshiroq, na yomonroq ekanini isbotladi. tez6 mahsulot modeli bo'lib qoldi.
O'lchovni kattalashtirish
Shu nuqtada test to'plamlari kattalashtirildi. 200 savollik to'rtta to'plamga yana uchta "realistik" to'plam qo'shildi (haqiqiy hayotga o'xshash sarlavhalar bilan), va har bir to'plamning "shovqinli" nusxasi — xuddi o'sha savollar, harf xatolari va apostrofsiz yozuv bilan. Jami 14 to'plam, 640 savol.
tez8 shu kattaroq testda tez6 bilan solishtirildi. Natijalar qayta baholangan holda saqlangan:
TOZA = ["cash_desk", "deposits", "loans", "transactions", "realistic_cash", "realistic_deposits", "realistic_loans"] SHOVQINLI = [f"noisy_{t}" for t in TOZA] def hukmlar(prefiks, toplamlar): return {(t, j["id"]): j for t in toplamlar for j in map(json.loads, open(TEZ / f"results/{prefiks}_{t}.jsonl", encoding="utf-8"))} for nom, toplamlar in (("toza", TOZA), ("shovqinli", SHOVQINLI)): t6, t8 = hukmlar("tez6_cpu", toplamlar), hukmlar("tez8_cpu", toplamlar) tuzaldi = sum(1 for k in t6 if not t6[k]["correct"] and t8[k]["correct"]) buzildi = sum(1 for k in t6 if t6[k]["correct"] and not t8[k]["correct"]) print(f"{nom:10s} tez6 {sum(j['correct'] for j in t6.values())}/{len(t6)} tez8 {sum(j['correct'] for j in t8.values())}/{len(t8)}" f" tuzaldi {tuzaldi}, buzildi {buzildi}")
toza tez6 301/320 tez8 315/320 tuzaldi 17, buzildi 3 shovqinli tez6 293/320 tez8 311/320 tuzaldi 22, buzildi 4
Bu safar farq shovqindan ancha katta: toza to'plamlarda o'n to'rt savol, shovqinlilarda o'n sakkiz. Va tuzalganlar buzilganlardan ko'p marta ko'p — 19-bobdagi "oltita tuzaldi, oltita buzildi" emas.
Xato turlari bo'yicha:
from collections import Counter for prefiks in ("tez6_cpu", "tez8_cpu"): sabablar = Counter(j["reason"].split(":")[0] for j in hukmlar(prefiks, TOZA + SHOVQINLI).values() if not j["correct"]) print(f"{prefiks:9s} {dict(sabablar)}")
tez6_cpu {'different result': 34, 'asked on a clear request': 11, 'guessed instead of asking': 1}
tez8_cpu {'different result': 10, 'guessed instead of asking': 3, 'asked on a clear request': 1}
Eng katta o'zgarish — "different result" (noto'g'ri plan) uch barobar kamaydi va "asked on a clear request" (ortiqcha savol) deyarli yo'qoldi. Bitta joy yomonlashdi: "guessed instead of asking" — savol berish kerak bo'lgan joyda taxmin qilish — biroz oshdi. tez8 qat'iyroq bo'ldi: kamroq so'raydi, va ba'zan so'rash kerak bo'lgan joyda ham so'ramaydi. Bu narx keyingi boblarda yana qaytadi.
tez8 da nima o'zgardi
tez8 ning ma'lumoti va sozlamasida to'rtta o'zgarish bor edi:
- Ko'proq va tozaroq ma'lumot. tez7 ning hamma ma'lumoti, oltinchi partiya (qisqa "top N kassir",
yolg'iz "Excelga saqla", guruhli davr solishtirish) va qutqarilgan qatorlar (14-bob) — Gemma
noto'g'ri rad etgan, lekin to'g'ri bo'lgan 1 601 ta matn. Bundan tashqari, eski ma'lumotdan 122 ta
noto'g'ri belgili qator olib tashlandi: matnda "dan katta" (
>), planda esa>=— 14-bobdagi "different operator" qoidasi aynan shundan keyin paydo bo'lgan. mask_history: true. Davomli suhbatda model avval faqat oxirgi javobni emas, oldingi javoblarni ham o'rganardi — ular allaqachon promptda bor, va ularni "o'rganish" ma'nosiz. Endi faqat oxirgi javob.- Bitta epoch. Ma'lumot ikki yarim barobar ko'p bo'lgani uchun, ikki epoch o'n ikki soatdan ko'p davom etardi. Bitta epoch — taxminan olti soat, va qadamlar soni baribir tez7 nikidan ko'p edi.
- Qo'shimcha jadval uchun
roles.json(kreditlar) — "top 10 qarzdor" misollari uchun.
mask_history ni train qilish qatorida ko'raylik — tez8 faylidagi birinchi davomli suhbat:
tez8 = [json.loads(q) for q in open(Path.home() / "tez_runs/tez8/data/train.jsonl", encoding="utf-8")] suhbat = next(q for q in tez8 if len(q["messages"]) > 3) for xabar in suhbat["messages"][1:]: belgi = " <- shu javob o'rganiladi" if xabar is suhbat["messages"][-1] else "" print(f"{xabar['role']:9s} {xabar['content'].splitlines()[0][:90]}{belgi}") davomli = sum(1 for q in tez8 if len(q["messages"]) > 3) print(f"\ndavomli suhbatli qatorlar: {davomli:,} / {len(tez8):,}")
user After removing rows where fee is less than or equal to 25000, what is the total fee per cu
assistant {"steps": [{"tool": "remove_rows", "args": {"column": "Komissiya", "op": "<=", "value": 25
user Can you show the top 5 customers from this result?
assistant {"on":"result","steps":[{"tool":"top_n","args":{"by":"Komissiya","n":5,"descending":true}} <- shu javob o'rganiladi
davomli suhbatli qatorlar: 2,851 / 19,886
Oldingi so'rov va javob — kontekst. Model faqat oxirgi javobni yozishni o'rganadi.
Lug'atsiz ham ishlaydimi
15-bobda ko'rdik: training qatorlarining bir qismida lug'at va misollar ataylab olib tashlanadi, chunki tahlilchining yangi faylida ular bo'lmaydi. Buning foydasini o'lchash mumkin: tez8 ni xuddi o'sha toza to'plamlarda, lekin lug'atsiz va misollarsiz promptda sinashdi:
for prefiks, izoh in (("tez8_cpu", "lug'at va misollar bilan"), ("tez8_cpu_bare", "lug'at va misollarsiz")): print(f"{izoh:26s} {ball(prefiks, TOZA)}")
lug'at va misollar bilan 315/320 lug'at va misollarsiz 310/320
Farq — bir necha savol. Model asosan jadvalning o'ziga — ustun nomlari va qiymatlariga — tayanadi. Bu yaxshi belgi: tahlilchining faylida lug'at bo'lmaydi.
tez8 ning narxi: "bitta o'zgarish" emas
tez8 eng yaxshi model bo'lib chiqdi va mahsulot modeliga aylandi. Lekin bir narsani halol aytish kerak:
uning yutug'i qaysi o'zgarishdan ekanini bilmaymiz. Ma'lumot, mask_history va epoch soni — uchalasi
bir vaqtda o'zgargan. Ehtimol ma'lumot hal qilgan, ehtimol mask_history, ehtimol ikkalasi. Har birini
alohida sinash uch marta olti soat bo'lardi — va u qilinmadi.
Bu tez8 uchun muammo emas edi — u yutdi. Lekin keyingi model, tez9, xuddi shu yo'l bilan ko'p narsani bir vaqtda o'zgartirdi — va yutqazdi. Va o'shanda qaysi o'zgarish zarar qilganini bilib bo'lmadi. Bu 21-bob mavzusi, va undan chiqqan qoida tez10 ni yaratdi.
Xulosa
- tez6 — ma'lumot sifatini oshirish (qisqa so'rovlar, muvozanat, saralash so'zlari): 200 dan 191 (GPU), 189 (CPU). Birinchi marta 183 dan aniq yuqori.
- tez7 — "top N odam" ni nishonga oldi; natija tez6 dan farqlanmadi.
- Test 640 savolga kattalashtirildi: toza va shovqinli to'plamlar.
- tez8 — ko'proq va tozaroq ma'lumot,
mask_history, bitta epoch: toza 315/320, shovqinli 311/320, va noto'g'ri planlar uch barobar kamaydi. Narx — ba'zan so'rash kerak bo'lgan joyda taxmin qiladi. - tez8 lug'atsiz promptda ham deyarli bir xil ishlaydi.
- tez8 ning yutug'i bir nechta o'zgarishning yig'indisi; qaysi biri hal qilgani o'lchanmagan.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.