Base modellar: o'qitilmagan model nimani biladi
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:
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]}")
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.
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)
| model | uz_latin | uz_cyrillic | ru | en | mixed | jami | o'rtacha_s |
|---|---|---|---|---|---|---|---|
| qwen3.5-0.8b | 3/10 | 3/8 | 2/10 | 4/8 | 0/4 | 12/40 | 1.04 |
| qwen2.5-coder-1.5b | 7/10 | 1/8 | 5/10 | 4/8 | 0/4 | 17/40 | 1.63 |
| qwen3.5-2b | 5/10 | 5/8 | 5/10 | 4/8 | 1/4 | 20/40 | 1.92 |
| qwen3.5-4b | 9/10 | 7/8 | 8/10 | 7/8 | 3/4 | 34/40 | 4.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:
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())
| model | asked | different result | guessed instead of asking | plan failed | same result |
|---|---|---|---|---|---|
| qwen2.5-coder-1.5b | 2 | 19 | 2 | 2 | 15 |
| qwen3.5-0.8b | 0 | 13 | 4 | 11 | 12 |
| qwen3.5-2b | 0 | 14 | 4 | 2 | 20 |
| qwen3.5-4b | 0 | 2 | 4 | 0 | 34 |
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.
print(savollar[38]["text"]) print() for qator in raund1[raund1["id"] == 38].itertuples(): print(f"{qator.model:20s} {qator.output[:150]}")
Удали дубликаты по 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.
raund2, natija2 = jadval(TEZ / "accuracy_raw_v2.jsonl") show(natija2)
| model | uz_latin | uz_cyrillic | ru | en | mixed | jami | o'rtacha_s |
|---|---|---|---|---|---|---|---|
| qwen3.5-0.8b | 3/10 | 2/8 | 3/10 | 4/8 | 0/4 | 12/40 | 1.02 |
| qwen2.5-coder-1.5b | 5/10 | 0/8 | 6/10 | 5/8 | 0/4 | 16/40 | 1.73 |
| qwen3.5-2b | 5/10 | 4/8 | 4/10 | 4/8 | 1/4 | 18/40 | 1.96 |
| qwen3.5-4b | 10/10 | 8/8 | 9/10 | 8/8 | 4/4 | 39/40 | 4.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:
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]}")
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:
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()))
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:
_, boshqalar = jadval(TEZ / "accuracy_raw_v2_others.jsonl") show(boshqalar)
| model | uz_latin | uz_cyrillic | ru | en | mixed | jami | o'rtacha_s |
|---|---|---|---|---|---|---|---|
| granite-4.2-3b | 3/10 | 2/8 | 3/10 | 3/8 | 1/4 | 12/40 | 4.12 |
| phi-4-mini | 3/10 | 2/8 | 7/10 | 4/8 | 2/4 | 18/40 | 5.62 |
| ministral-3-3b | 5/10 | 2/8 | 7/10 | 6/8 | 3/4 | 23/40 | 7.1 |
| gemma-4-e4b | 8/10 | 6/8 | 8/10 | 6/8 | 4/4 | 32/40 | 8.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:
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()))
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.