Asosiy qismga o'tish

tez6 dan tez8 gacha: eng yaxshi model qanday chiqdi

20-bob 6 kod bloki 1787 so'z

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:

python18 qator
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)
Chiqish
tez7 va tez8 sozlamalaridagi farq:
11a12
>   mask_history: true
14c15
<   epochs: 2
---
>   epochs: 1
modelo'qitish qatorlarioxirgi eval_loss
tez67 4340.032
tez78 3660.024
tez819 8860.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:

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

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

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

  1. 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.
  2. 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.
  3. 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.
  4. 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:

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

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

Telegramda yozish Narxlar