Asosiy qismga o'tish

Base modellar: o'qitilmagan model nimani biladi

7-bob 9 kod bloki 2100 so'z

Savol

6-bobda tezlikni o'lchadik. Endi undan muhimroq savol: model to'g'ri javob beradimi?

Spike 3 ning savoli:

Hech qanday trainingsiz, har bir model qanchalik tez-tez to'g'ri tool va to'g'ri argumentni tanlaydi — har bir tilda?

O'qitilmagan, "qutidan chiqqan" modelni base model deymiz (aniqrog'i, bu yerda — instruct model, lekin bizning vazifamizga o'qitilmagan). Uni o'lchash ikki narsani aytadi: qaysi modelni train qilishga arziydi va training qanchalik kerak.

Bu bobning hamma raqamlari saqlangan natijalardan. Har bir javob o'sha kuni engine bilan bajarilgan va baholangan; biz o'sha baholarni (reason maydoni) o'zgartirmasdan o'qiymiz.

40 ta savol

Spike uchun bitta sintetik bank tranzaksiyalari jadvali (20 000 qator, 30 ustun) va qo'lda yozilgan 40 ta so'rov tayyorlandi:

python11 qator
import json
import collections

savollar = {s["id"]: s for s in json.load(open(TEZ / "accuracy/suites/transactions/questions.json", encoding="utf-8"))}
print("tillar:", dict(collections.Counter(s["language"] for s in savollar.values())))
print()
for i in (1, 12, 21, 36, 38):
    s = savollar[i]
    kutilgan = "savol berish kerak" if s["expect"] == "ask" else json.dumps(s["expect"][0], ensure_ascii=False)
    print(f"{i:>2} [{s['language']}] {s['text']}")
    print(f"   kutilgan: {kutilgan[:140]}")
Chiqish
tillar: {'uz_latin': 10, 'uz_cyrillic': 8, 'ru': 10, 'en': 8, 'mixed': 4}

 1 [uz_latin] Filiallar bo'yicha jami summani hisobla
   kutilgan: {"steps": [{"tool": "group_and_total", "args": {"group_by": ["filial"], "value_column": "summa_uzs", "agg": "sum"}}]}
12 [uz_cyrillic] Бекор қилинган операцияларни олиб ташла
   kutilgan: {"steps": [{"tool": "filter", "args": {"column": "holat", "op": "!=", "value": "Bekor qilindi"}}]}
21 [ru] Сумма по филиалам
   kutilgan: {"steps": [{"tool": "group_and_total", "args": {"group_by": ["filial"], "value_column": "summa_uzs", "agg": "sum"}}]}
36 [en] Do the usual thing
   kutilgan: savol berish kerak
38 [mixed] Удали дубликаты по tranzaksiya_id va bekor qilinganlarni ham olib tashla
   kutilgan: {"steps": [{"tool": "remove_duplicates", "args": {"columns": ["tranzaksiya_id"]}}, {"tool": "filter", "args": {"column": "holat", "op": "!="

To'rttasi ataylab noaniq: "Ko'rsat", "Буни кўрсат", "Сделай это" va yana bittasi. Ular uchun to'g'ri javob — plan emas, savol. To'rttasi aralash tilda — bir gapda ruscha va o'zbekcha, xuddi bank xodimlari yozgandek.

Baholash 3-bobdagi usul bilan: model plani bajariladi va natijasi kutilgan natija bilan solishtiriladi. Noaniq savolda model savol bersagina to'g'ri hisoblanadi.

Birinchi raund

To'rtta model: Qwen3.5 ning 0.8B, 2B, 4B versiyalari va Qwen2.5-Coder-1.5B.

python15 qator
import pandas as pd

TILLAR = ["uz_latin", "uz_cyrillic", "ru", "en", "mixed"]

def jadval(fayl):
    xom = pd.read_json(fayl, lines=True)
    ball = xom.pivot_table(index="model", columns="language", values="correct", aggfunc="sum")[TILLAR]
    soni = xom.pivot_table(index="model", columns="language", values="correct", aggfunc="count")[TILLAR]
    natija = ball.astype(int).astype(str) + "/" + soni.astype(str)
    natija["jami"] = xom.groupby("model")["correct"].sum().astype(str) + "/40"
    natija["o'rtacha_s"] = xom.groupby("model")["seconds"].mean().round(2)
    return xom, natija.sort_values("jami").reset_index()

raund1, natija1 = jadval(TEZ / "accuracy_raw.jsonl")
show(natija1)
modeluz_latinuz_cyrillicruenmixedjamio'rtacha_s
qwen3.5-0.8b3/103/82/104/80/412/401.04
qwen2.5-coder-1.5b7/101/85/104/80/417/401.63
qwen3.5-2b5/105/85/104/81/420/401.92
qwen3.5-4b9/107/88/107/83/434/404.36

Farq katta. 0.8B — har uch savoldan biriga ham yetmaydi. 4B — 34. Va bir narsaga e'tibor bering: 4B da o'zbek kirill lotindan zaif emas.

Lekin "to'g'ri" sonidan ko'ra qanday xato qilgani muhimroq:

python2 qator
sabab = raund1.assign(sabab=raund1["reason"].str.split(":").str[0])
show(sabab.pivot_table(index="model", columns="sabab", values="id", aggfunc="count", fill_value=0).reset_index())
modelaskeddifferent resultguessed instead of askingplan failedsame result
qwen2.5-coder-1.5b2192215
qwen3.5-0.8b01341112
qwen3.5-2b0144220
qwen3.5-4b024034

Ustunlar:

  • same result — to'g'ri.
  • different result — plan bajarildi, lekin boshqa natija berdi.
  • plan failed — plan umuman bajarilmadi. 0.8B da bu o'n bir marta: masalan, matn ustunini jamlashga urindi (sum(VARCHAR)).
  • guessed instead of asking — noaniq savolga savol bermasdan taxmin qildi.
  • asked — savol berdi.

4B ning xatolari: to'rtta noaniq savolning hammasida taxmin qildi va ikkita boshqa natija. Hech bir model noaniq so'rovlarning birortasida ham savol bermadi — butun raundda ikkita savol bor, ikkalasi ham 1.5B dan.

Bitta savol, to'rtta bir xil xato

38-savolni ko'raylik: "Удали дубликаты по tranzaksiya_id va bekor qilinganlarni ham olib tashla" — takrorlarni o'chir va bekor qilinganlarni ham olib tashla.

python4 qator
print(savollar[38]["text"])
print()
for qator in raund1[raund1["id"] == 38].itertuples():
    print(f"{qator.model:20s} {qator.output[:150]}")
Chiqish
Удали дубликаты по tranzaksiya_id va bekor qilinganlarni ham olib tashla

qwen3.5-0.8b         {"steps": [{"tool": "filter", "args": {"column": "holat", "op": "=", "value": "Bekor qilindi"}}, {"tool": "filter", "args": {"column": "tranzaksiya_id
qwen2.5-coder-1.5b   {"steps": [{"tool": "filter", "args": {"column": "holat", "op": "=", "value": "Bekor qilindi"}}, {"tool": "remove_duplicates", "args": {"columns": ["t
qwen3.5-2b           {"steps": [{"tool": "remove_duplicates", "args": {"columns": ["tranzaksiya_id"]}}, {"tool": "filter", "args": {"column": "holat", "op": "=", "value": 
qwen3.5-4b           {"steps": [{"tool": "filter", "args": {"column": "holat", "op": "=", "value": "Bekor qilindi"}}, {"tool": "remove_duplicates", "args": {"columns": ["t

To'rtala model ham filter(holat = "Bekor qilindi") yozdi — ya'ni bekor qilinganlarni qoldirdi, olib tashlash o'rniga. To'rtta har xil model, bitta xato.

Bu model xatosi emas — tool dizayni xatosi. O'sha paytda o'chirish uchun alohida tool yo'q edi: "olib tashla" ni faqat filter ning != amali bilan ifodalash mumkin edi. Model esa "olib tashla" so'zini ko'rib, eng yaqin toolni oldi. Xulosa: tool nomi foydalanuvchi so'zi bilan mos kelishi kerak. Shu kuni Tezga remove_rows tooli qo'shildi (D-17) — 2-bobdagi ro'yxatda u ikkinchi o'rinda turibdi.

Ikkinchi shunday topilma: 4B "filiallar bo'yicha summa ustunli grafigi" so'rovida grafikni xom qatorlardan chizdi — avval jamlamasdan. Tuzatish: make_chart ga majburiy agg argumenti qo'shildi va tool o'zi jamlaydigan bo'ldi.

Ikkinchi raund: tool va prompt tuzatildi

Shu kunning o'zida uchta o'zgarish kiritildi: remove_rows tooli, make_chart ning agg argumenti va promptdagi "taxmin qilish o'rniga so'ra" qoidasi. Savollar va ma'lumot — o'sha-o'sha.

python2 qator
raund2, natija2 = jadval(TEZ / "accuracy_raw_v2.jsonl")
show(natija2)
modeluz_latinuz_cyrillicruenmixedjamio'rtacha_s
qwen3.5-0.8b3/102/83/104/80/412/401.02
qwen2.5-coder-1.5b5/100/86/105/80/416/401.73
qwen3.5-2b5/104/84/104/81/418/401.96
qwen3.5-4b10/108/89/108/84/439/404.71

4B — 39/40. U endi to'rtta noaniq so'rovning hammasida savol beradi, o'z tilida, va aniq so'rovlarning birortasida ham ortiqcha savol bermaydi:

python2 qator
for qator in raund2[(raund2["model"] == "qwen3.5-4b") & raund2["id"].isin([i for i, s in savollar.items() if s["expect"] == "ask"])].itertuples():
    print(f"{savollar[qator.id]['text']:12s} -> {qator.output[:130]}")
Chiqish
Ko'rsat      -> {"ask": "Qanday ko'rsatish kerak: filiallar bo'yicha, oylik yoki yillik, va qaysi ko'rsatkich (summa, miqdor, miqdor soni)?"}
Буни кўрсат  -> {"ask": "Qanday ma'lumotni ko'rsatish kerak: qaysi ko'rsatkich (jami, o'rtacha, eng katta/kichik) va qaysi kesimda (filial, oy, va
Сделай это   -> {"ask": "Пожалуйста, уточните, что именно нужно сделать: какой расчет, фильтрация или группировка данных?"}
Do the usual thing -> {"ask": "What specific calculation do you want: sum, count, or average, and for which column? Also, do you want to group by any co

Kichik modellar esa yaxshilanmadi — 1.5B va 2B hatto bir-ikki ball yo'qotdi. Ular uzunroq ko'rsatmalarga amal qilmaydi. Xulosa: kichik modelga promptni yaxshilash yordam bermaydi — uni training kerak.

39/40 ga ishonish mumkinmi?

Yo'q, to'liq emas. Ikkinchi raunddagi o'zgarishlar birinchi raunddagi xatolarni shu 40 ta savolda o'qib chiqib qilingan. Demak 39/40 qisman shu savollarga moslangan bo'lishi mumkin. Haqiqiy tekshiruv — prompt hech qachon ko'rmagan yangi savollar. Spike hisobotida aynan shu ogohlantirish yozilgan.

Yangi savollarda

Ogohlantirish to'g'ri chiqdimi? Keyingi raundda ikkinchi test to'plami qo'shildi: boshqa jadval (kreditlar), boshqa 40 ta savol. Shu kunning uchinchi raundida 4B ikkala to'plamda:

python4 qator
for toplam in ("transactions", "loans"):
    xom = pd.read_json(TEZ / f"results/round3_{toplam}.jsonl", lines=True)
    ball = xom.groupby("model")["correct"].sum()
    print(f"{toplam:13s} " + "   ".join(f"{m}: {b}/40" for m, b in ball.items()))
Chiqish
transactions  gemma-4-e4b: 38/40   qwen3.5-2b: 22/40   qwen3.5-4b: 37/40
loans         gemma-4-e4b: 33/40   qwen3.5-2b: 25/40   qwen3.5-4b: 30/40

Tanish tranzaksiyalar to'plamida 4B — 37. Yangi kreditlar to'plamida — 30. Yetti savol farq. Ogohlantirish o'zini oqladi: tanish savollardagi natija yangi savollarga to'liq ko'chmaydi. Bu saboq kitobning 6-qismida katta mavzuga aylanadi — real hayotdan olingan, trainingda hech qachon ishlatilmaydigan test to'plamlari.

Bu raundda uchinchi model ham bor — Gemma 4 E4B. U Qwen 4B dan ham kuchliroq chiqdi, lekin ancha sekin va kattaroq. Gemma Tezga hech qachon kirmaydi — lekin u boshqa ish oldi: training uchun ma'lumot yozish va tekshirish. Bu 12-bob mavzusi.

Boshqa modellar

Qwen dan tashqari yana to'rtta ochiq model shu 40 ta savolda, ikkinchi raund sharoitida sinaldi:

python2 qator
_, boshqalar = jadval(TEZ / "accuracy_raw_v2_others.jsonl")
show(boshqalar)
modeluz_latinuz_cyrillicruenmixedjamio'rtacha_s
granite-4.2-3b3/102/83/103/81/412/404.12
phi-4-mini3/102/87/104/82/418/405.62
ministral-3-3b5/102/87/106/83/423/407.1
gemma-4-e4b8/106/88/106/84/432/408.2

Hech biri Qwen3.5-4B ning 39 tasiga yetmadi. Undan tezrog'i faqat bittasi — granite, va u 40 tadan atigi 12 tasini to'g'ri bajardi. Qolganlari ham zaifroq, ham sekinroq.

Va yana bitta qiziq tajriba. O'zbek tiliga moslab o'qitilgan jamoat modeli bor — NeuronAI. Uning 2B versiyasi o'zi asoslangan Qwen3.5-2B bilan bir xil sharoitda solishtirildi:

python4 qator
for toplam in ("transactions", "loans"):
    xom = pd.read_json(TEZ / f"results/round4b_{toplam}.jsonl", lines=True)
    ball = xom.groupby("model")["correct"].sum()
    print(f"{toplam:13s} " + "   ".join(f"{m}: {b}/40" for m, b in ball.items()))
Chiqish
transactions  neuronai-2b: 19/40   qwen3.5-2b: 20/40
loans         neuronai-2b: 24/40   qwen3.5-2b: 25/40

O'zbek tilini yaxshiroq bilish bu vazifada yordam bermadi — natija deyarli bir xil. Bizning vazifamiz "o'zbekcha gapirish" emas, "o'zbekcha so'rovni aniq planga aylantirish". Bu boshqa ko'nikma, va uni umumiy til bilimi bermaydi.

Spike nimani hal qildi

Topilma Qaror
Faqat 4B trainingsiz ishlatsa bo'ladigan darajaga yaqin Trainingsiz versiya uchun — 4B (D-16)
Kichik modellar promptdan yaxshilanmaydi Ularni train qilish kerak; maqsad — 2B ni 4B darajasiga olib chiqish
Hech bir model o'zi savol bermaydi Savol berish — alohida o'qitiladigan ko'nikma
"Olib tashla" filtrga aylanadi remove_rows tooli (D-17)
Grafik jamlanmasdan chiziladi make_chart o'zi jamlaydi (D-17)
Tanish savoldagi ball yangi savolga ko'chmaydi Yangi, ko'rilmagan test to'plamlari kerak

Spike hisobotining o'zi ham ehtiyot bilan yozilgan: bitta jadval, biz yozgan 40 ta savol, har model bir marta. 2–3 savollik farq — tasodif chegarasida. Bu natijalar yo'nalish beradi, yakuniy ball emas.

Xulosa

  • O'qitilmagan modellar: 0.8B 12/40, 1.5B 17/40, 2B 20/40, 4B 34/40.
  • Eng qimmat xatolar tool dizaynidan chiqdi: "olib tashla" uchun tool yo'q edi — to'rtala model bir xil xato qildi. Tool nomi foydalanuvchi so'ziga mos bo'lishi kerak.
  • Prompt tuzatilgach 4B 39/40 ga chiqdi va noaniq so'rovda savol beradigan bo'ldi. Kichik modellar o'zgarmadi — ularni train qilish kerak.
  • 39/40 tanish savollarda edi. Yangi to'plamda 4B 30/40 ko'rsatdi: test savollari training va sozlashdan ajratilgan bo'lishi shart.
  • O'zbekchaga moslangan model bu vazifada yordam bermadi.

Bu bilan ikkinchi qism tugadi. Uchinchi qismda Tez engine ga kiramiz: toollar va JSON plan qanday qurilgan.

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar