Tez nima va nima emas
Bir gapda
Loyihaning birinchi kunida biz Tezni bitta gapga sig'dirdik:
Katta Excel faylni tashlang, u bilan o'zbek, rus yoki ingliz tilida gaplashing va toza ma'lumot, tekshirilgan raqamlar, jonli grafiklar va toza Excel faylni qaytarib oling — internetsiz.
Bu — maqsad. Bugun shu gapning qaysi qismi ishlaydi, qaysi qismi hali planda — bob oxirida halol jadval bilan ko'rsatamiz. Avval esa Tezni boshqarib turadigan bitta qoida.
Asosiy qoida
AI hal qiladi. Tekshirilgan kod bajaradi. Odam tasdiqlaydi.
Uchta qism, uchta ega:
- AI faqat qaror qiladi: "Sana ustunidagi sanalarni bir xil formatga keltir", "Toshkentni qoldir, filiallar bo'yicha jamla". U jadvalga tegmaydi.
- Kod — biz yozgan va test qilgan funksiyalar — qarorni bajaradi. Filtr, jamlash, tozalash — hammasi DuckDB ichida, har safar bir xil natija bilan.
- Odam natijani ko'radi va qabul qiladi yoki rad etadi. Asl fayl hech qachon o'zgarmaydi.
Nega bunchalik qattiq? Chunki kichik model xato qiladi. Bu taxmin emas — 7-bobda o'lchaymiz. Agar model raqamni o'zi yozsa, uning xatosi hisobotga kiradi va hech kim sezmaydi. Agar model faqat plan yozsa, xato plan ko'rinib turadi: noto'g'ri ustun, noto'g'ri filtr. Uni tekshirish mumkin.
Model nima qila oladi
Model erkin gapira olmaydi. U faqat ro'yxatdagi tools (toollar) dan birini tanlay oladi.
Ro'yxat bitta faylda turadi — prompt/tools.json. Keling, uni Tezning o'z papkasidan o'qiymiz:
import json import pandas as pd asboblar = json.load(open(TEZ / "prompt/tools.json", encoding="utf-8")) print(f"asboblar soni: {len(asboblar)}") show(pd.DataFrame([ {"asbob": a["name"], "nima qiladi": a["description"].split(". ")[0]} for a in asboblar ]))
asboblar soni: 15
| asbob | nima qiladi |
|---|---|
| filter | Keep only rows where a column matches a condition |
| remove_rows | Delete rows where a column matches a condition |
| filter_dates | Keep only rows whose date is in a period relative to today (last_month is the previous calendar month), or between two dates written YYYY-MM-DD |
| group_and_total | Group rows by columns and aggregate a value column |
| period_compare | Compare a value per period with the previous period or the same period last year |
| top_n | Keep the top or bottom N rows by a column |
| fix_dates | Convert a text column with mixed date formats into real dates |
| fix_numbers | Convert a text column with numbers written as text into real numbers |
| unify_spelling | Merge different spellings of the same value in a text column, including Latin and Cyrillic |
| remove_duplicates | Remove rows that repeat on the given columns |
| fill_empty | Fill empty cells in a column with a value |
| make_chart | Draw a chart of y by x |
| sort | Order the rows by a column |
| select_columns | Keep only the listed columns |
| export_xlsx | Save the current result as an Excel file |
Mana Tezning butun "aqli". O'n besh tool: qatorlarni tanlash va o'chirish, sana bo'yicha filtr, guruhlash va jamlash, davrlarni solishtirish, eng katta N ta, to'rt xil tozalash, grafik, saralash, ustun tanlash va Excelga saqlash.
Ro'yxatda yo'q narsaga e'tibor bering: "SQL yoz", "Python yoz", "javobni o'zing hisobla" degan tool yo'q. Model o'ylab topa oladigan eng xavfli narsa — noto'g'ri tool yoki noto'g'ri ustun. U yangi formula ixtiro qila olmaydi. Bu tasodif emas, bu dizayn: 8-bobda bu ro'yxat qanday qilib grammar ga aylanishini va model undan tashqariga bir harf ham chiqa olmasligini ko'ramiz.
Plan qanday bajariladi
Model yozadigan plan — oddiy JSON: qadamlar ro'yxati. Har bir qadam — tool nomi va uning argumentlari. Quyidagi planni biz qo'lda yozdik, model yozadigan shaklda: "ipoteka kreditlarini filiallar bo'yicha jamla va ustunli grafik chiz". Uni 1-bobdagi bir million qatorli jadvalda (xuddi o'sha kod, xuddi o'sha seed) haqiqiy Tez engine bilan bajaramiz:
import duckdb from accuracy.execute import run_plan sozlamalar = json.load(open(TEZ / "accuracy/settings.json", encoding="utf-8")) con = duckdb.connect() con.execute("select setseed(0.42)") con.execute(""" create table kreditlar as select i + 1 as kredit_id, ['Toshkent', 'Samarqand', 'Buxoro', 'Andijon', 'Farg''ona', 'Namangan', 'Qashqadaryo', 'Xorazm'][1 + cast(floor(random() * 8) as integer)] as filial, ['Iste''mol', 'Ipoteka', 'Avto', 'Biznes'][1 + cast(floor(random() * 4) as integer)] as turi, round(5000000 + random() * 495000000, 2) as summa, date '2023-01-01' + cast(i % 1000 as integer) as sana from range(1000000) t(i) """) reja = {"steps": [ {"tool": "filter", "args": {"column": "turi", "op": "=", "value": "Ipoteka"}}, {"tool": "group_and_total", "args": {"group_by": ["filial"], "value_column": "summa", "agg": "sum"}}, {"tool": "make_chart", "args": {"chart": "bar", "x": "filial", "y": "summa", "agg": "none"}}, ]} natija = run_plan(con, "kreditlar", reja["steps"], sozlamalar) show(pd.DataFrame(natija["rows"], columns=natija["columns"]).assign(summa=lambda d: (d.summa / 1e9).round(1)).rename(columns={"summa": "summa_mlrd"})) print("qo'shimcha natijalar:", natija["artifacts"])
qo'shimcha natijalar: [{'chart': 'bar', 'x': 'filial', 'y': 'summa'}]
| filial | summa_mlrd |
|---|---|
| Xorazm | 7 922.2 |
| Toshkent | 7 901.9 |
| Farg'ona | 7 831.9 |
| Samarqand | 7 941 |
| Buxoro | 7 819.8 |
| Namangan | 7 826.4 |
| Andijon | 7 867.2 |
| Qashqadaryo | 7 975.2 |
Uchta qadam, har biri oldingisining natijasi ustida ishlaydi. Jadvaldagi har bir raqamni DuckDB hisobladi. Planda bitta ham raqam yo'q — faqat ustun nomlari va amal.
Oxirgi qatorga qarang. make_chart grafik chizmadi. U faqat "bu yerda ustunli grafik
bo'lishi kerak, x — filial, y — summa" degan belgini qaytardi. export_xlsx ham hozircha xuddi
shunday: belgi qaytaradi, fayl yozmaydi. Grafikni chizish va faylni saqlash — ilovaning ishi, va
ilova hali qurilmagan. Buni bob oxiridagi jadvalda yana ko'ramiz.
Ikkinchi javob turi: savol
Model har doim ham plan yozmaydi. Ba'zan so'rov shunchalik noaniq-ki, har qanday plan taxmin
bo'lib qoladi. "Tahlil qil" — nimani? Qaysi ustun bo'yicha? Bunday paytda model qisqa savol
berishi kerak: {"ask": "..."}.
Bu bank uchun muhim. Noto'g'ri taxmin qilingan to'g'ri ko'rinadigan javob — eng xavfli javob. Savol esa bir soniya vaqt oladi, xolos.
Quyida tez8 modelining haqiqiy javoblari. Bu so'rovlar real ochiq jadvallar ustidagi testdan olingan va ularning hammasi ataylab noaniq yozilgan:
import glob from pathlib import Path def test(toplam): savollar = json.load(open(TEZ / f"accuracy/suites/{toplam}/questions.json", encoding="utf-8")) javoblar = {j["id"]: j for j in map(json.loads, open(TEZ / f"results/tez8g_cpu_{toplam}.jsonl", encoding="utf-8"))} return [(s, javoblar[s["id"]]) for s in savollar] real = sorted(Path(p).parent.name for p in glob.glob(str(TEZ / "accuracy/suites/real_*/questions.json"))) for toplam in real: for savol, javob in test(toplam): if savol.get("trap") == "vague": print(f"so'rov: {savol['text']}") print(f"tez8: {javob['output']}") print(f"natija: {javob['reason']}") print()
so'rov: banklarni tahlil qil
tez8: {"ask":"Qaysi ma'lumotlar bo'yicha tahlil qilish kerak: 'Aktivsumma', 'Kreditsumma' yoki 'Depozitsumma'?"}
natija: asked
so'rov: mijozlar haqida
tez8: {"ask":"Qaysi ma'lumotlar bo'yicha mijozlar haqida ma'lumot kerak: masalan, 'to'lov tarixi', 'qarz miqdori' yoki 'tug'ilgan yili'?"}
natija: asked
so'rov: kurslar
tez8: {"ask":"Qaysi valyutalar bo'yicha kurslarni ko'rsatishim kerak: masalan, AQSH dollari, EВРО yoki AQSH dollari?"}
natija: asked
so'rov: tahlil qil
tez8: {"ask":"Qaysi soha bo'yicha ma'lumot kerak: 'Moddiy va texnik ta'minoyni rivojlantirish', 'Qurilish sohasi' yoki 'Sanoat'?"}
natija: asked
so'rov: hududlar bo'yicha hisobot
tez8: {"steps":[{"tool":"group_and_total","args":{"group_by":["Regions"],"value_column":"Total loan portfolio","agg":"sum"}}]}
natija: guessed instead of asking
so'rov: savdoni tahlil qil
tez8: {"ask":"Qaysi ma'lumotlar bo'yicha tahlil qilishni xohlaysiz: mijozlar bo'yicha, davlatlar bo'yicha yoki mahsulotlar bo'yicha?"}
natija: asked
Oltita noaniq so'rovdan beshtasida model to'g'ri yo'l tutdi: savol berdi. "Banklarni tahlil qil" ga javobda u jadvalning haqiqiy ustun nomlarini taklif qildi — bu eng yaxshi savol turi. Lekin savollar har doim ham silliq emas: "kurslar" ga javobda AQSH dollari ikki marta takrorlangan va "EВРО" so'zi lotin va kirill harflari aralash yozilgan. Bittasida — "hududlar bo'yicha hisobot" — model umuman so'ramadi, taxmin qildi: jami kredit portfelini oldi. Bu javob to'g'ri bo'lishi ham mumkin, lekin model buni bilmaydi.
Eng qiyini: "buni qila olmayman"
Uchinchi holat bor. So'rov aniq, lekin o'n besh toolning birortasi ham uni bajara olmaydi. "Keyingi oy savdosini bashorat qil" — Tezda bashorat tooli yo'q. "Kredit depozitdan necha barobar ko'p" — ikki ustunni bir-biriga bo'lish tooli yo'q.
To'g'ri javob — buni ochiq aytish. Noto'g'ri javob — eng yaqin toolni olib, boshqa savolga javob berish. Tez8 bu yerda qanday?
for toplam in real: for savol, javob in test(toplam): if savol.get("trap") == "tool_gap": print(f"{savol['text']}") print(f" {javob['reason']}: {javob['output'][:110]}")
har bir bankning kredit depozit nisbati
guessed instead of asking: {"steps":[{"tool":"group_and_total","args":{"group_by":["Banknomi"],"value_column":"Depozitsumma","agg":"sum"}
to'lamaslik ehtimolini bashorat qil
guessed instead of asking: {"steps":[{"tool":"group_and_total","args":{"group_by":["PAY_0","PAY_2","PAY_3","PAY_4","PAY_5","PAY_6"],"valu
dollar kursi bir yilda qanday o'zgargan
guessed instead of asking: {"steps":[{"tool":"filter_dates","args":{"column":"G5","period":"last_year"}},{"tool":"period_compare","args":
2023 va 2024 ulushlari farqini hisobla
guessed instead of asking: {"steps":[{"tool":"period_compare","args":{"date_column":"01122023mlrdsom","value_column":"01122024ulushifoizd
har bir viloyatda kredit depozitdan necha barobar ko'p
guessed instead of asking: {"steps":[{"tool":"group_and_total","args":{"group_by":["Regions"],"value_column":"Total loan portfolio","agg"
keyingi oy savdosini bashorat qil
asked: {"ask":"Qaysi ma'lumotlar bo'yicha savdo hajmini bashorat qilish kerak: barcha mijozlar, faqat \"United Kingdo
Oltidan bittasi. Va o'sha bittasi ham to'liq g'alaba emas: "keyingi oy savdosini bashorat qil" ga model savol bilan javob berdi, shuning uchun test uni to'g'ri deb sanadi. Lekin savolining mazmuni — "qaysi mijozlar bo'yicha bashorat qilay?" — go'yo bashorat qila oladigandek. "Bu ishni qila olmayman" degan gap yo'q.
Qolgan beshtasida model so'ralmagan narsani hisobladi: nisbat so'ralganda — oddiy jami, bashorat so'ralganda — guruhlash. Natijada to'g'ri hisoblangan, lekin boshqa savolning javobi chiqadi. Bu tez8 ning eng katta zaif joyi, va biz uni yashirmaymiz.
Uni tuzatishga urinish — 17-bob ("cannot" qatorlari), 21-bob (tez9: tuzatdi, lekin boshqa joyda buzdi) va 22-bob (tez10) mavzusi.
Tez nima emas
Endi chegaralar. Har biri — ongli qaror.
- Suhbatdosh emas. Tez ob-havo, siyosat yoki she'r haqida gaplashmaydi. U faqat sizning jadvalingiz haqida gapiradi.
- Microsoft Excel ichida ishlamaydi. Tez faylning o'z nusxasi bilan ishlaydi va yangi fayl beradi. Asl fayl o'zgarmaydi.
- Cloud ga chiqmaydi (internetdagi serverlarga ma'lumot yubormaydi). Ishlash paytida bitta ham tarmoq so'rovi yo'q.
- Mijoz ma'lumotida o'qitilmaydi. Training ma'lumoti — faqat "so'rov → plan" juftliklari. Ularda bitta ham haqiqiy qator yo'q (4-qism).
- Hisoblamaydi. Model raqam yozmaydi. Buni yuqorida ko'rdik.
- "Excel katta faylni ko'tarolmaydi" degan gap ham to'liq to'g'ri emas. Windowsdagi Excelning Power Query va Data Model qismlari millionlab qatorni ko'taradi. Lekin ularni o'rganish qiyin, interfeysi inglizcha, chat yo'q, tozalash planini o'zi taklif qilmaydi. Tezning ustunligi qator sonida emas — qulaylik, til va ishonchda.
Oxirgi bandni biz loyiha boshida o'zimizga tuzatish sifatida yozganmiz. Birinchi g'oyada "Excel katta faylni ko'tarolmaydi, biz ko'taramiz" degan gap bor edi. Tekshirgach, bu gap mahsulotni noto'g'ri sotishini ko'rdik.
Atrofda nima bor
Biz Tezni bo'sh joyga qurmadik. Loyiha boshida o'xshash narsalarni ko'rib chiqdik:
| Nima | Bu nima | Tez nimani to'ldiradi |
|---|---|---|
| Excel Power Query / Data Model | Windows Excel ichida, millionlab qator | O'rganish qiyin, chat yo'q, tozalash plani yo'q |
| Power BI | Dashboardlar, asosan cloud | Cloud taqiqlangan; tahlilchining o'z grafiklari undan yaxshi chiqqan |
| ChatGPT / Claude fayl tahlili | Cloud AI | Bankda taqiqlangan |
| Umumiy offline AI ilovalari | O'z kompyuteringizda istalgan model | Modelni o'zingiz tanlaysiz va sozlaysiz; ma'lumot toollari yo'q |
| distil-text2sql kabi kichik modellar | Offline matndan SQL | Faqat model, mahsulot emas |
Bu jadvaldan bitta xulosa: kichik umumiy model hamma narsa haqida gapirganda kuchsiz ko'rinadi. Tez esa o'z modelini olib keladi va unga bitta tor ish o'rgatadi. Kichik model tor ishda kuchli bo'lishi mumkin — kitobning qolgan qismi shuni isbotlashga urinish.
Bugun nima bor, nima yo'q
Endi va'da qilingan halol jadval. Bob boshidagi gapni qismlarga bo'lamiz:
| Qism | Holat |
|---|---|
| Excel faylni o'qish (sarlavha, jami qatorlar, sarlavha ustidagi nomlar) | Bor, testlar bilan (11-bob) |
| O'n besh tool va DuckDB engine | Bor, testlar bilan (10-bob) |
| JSON schema va grammar | Bor (9-bob) |
| O'z modelimiz, CPU da | Bor: tez8, 745 savollik testda 707 to'g'ri (5- va 6-qism) |
| Uch tilda so'rov | Bor: o'zbek (lotin va kirill), rus, ingliz |
| Grafik chizish | Yo'q. make_chart faqat belgi qaytaradi |
| Excelga saqlash | Yo'q. export_xlsx faqat belgi qaytaradi |
| Ilova: oyna, fayl tashlash, oldindan ko'rish, bekor qilish | Yo'q, planda |
| Installer (o'rnatuvchi) | Yo'q, planda |
| 8 GB xotirali kompyuterda sinov | O'lchanmagan (26-bob) |
| Ikki faylni solishtirish | Yo'q, tahlilchi so'ragan, planda |
Ko'rinib turibdi: hozirgacha qilingan ishning katta qismi — ko'rinmaydigan qism. Engine, model va uni sinash. Sababi oddiy: chiroyli oyna ichidagi noto'g'ri raqam hech kimga kerak emas. Biz avval raqam to'g'ri chiqishini isbotlamoqchi bo'ldik, keyin oynani.
Bu tartib to'g'rimi?
Bahsli. Odatda mahsulotni foydalanuvchi qo'liga iloji boricha erta berish tavsiya qilinadi. Biz boshqa yo'lni tanladik, chunki birinchi foydalanuvchimiz bank: bitta yolg'on jami — va ishonch yo'qoladi. Lekin bu narxi bor qaror: tahlilchi hali Tezni o'z qo'lida ishlatib ko'rgani yo'q.
Xulosa
- Tez bir qoida bilan ishlaydi: AI hal qiladi, tekshirilgan kod bajaradi, odam tasdiqlaydi.
- Model faqat o'n besh tooldan plan tuzadi yoki savol beradi. Raqamni DuckDB hisoblaydi.
- Noaniq so'rovda tez8 oltidan beshida savol berdi. Bajarib bo'lmaydigan so'rovda esa oltidan faqat bittasida — bu uning eng katta zaif joyi.
- Tez suhbatdosh emas, cloud ga chiqmaydi, mijoz qatorlarida o'qitilmaydi.
- Engine va model bor. Grafik, Excelga saqlash va ilovaning o'zi — hali yo'q.
Keyingi bobda arxitekturani ochamiz: nega model hisoblamaydi, va plan yozuvchi model bilan hisoblovchi engine o'rtasida nimalar turadi.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.