Asosiy qismga o'tish

Tez nima va nima emas

2-bob 4 kod bloki 2253 so'z

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:

python9 qator
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
]))
Chiqish
asboblar soni: 15
asbobnima qiladi
filterKeep only rows where a column matches a condition
remove_rowsDelete rows where a column matches a condition
filter_datesKeep 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_totalGroup rows by columns and aggregate a value column
period_compareCompare a value per period with the previous period or the same period last year
top_nKeep the top or bottom N rows by a column
fix_datesConvert a text column with mixed date formats into real dates
fix_numbersConvert a text column with numbers written as text into real numbers
unify_spellingMerge different spellings of the same value in a text column, including Latin and Cyrillic
remove_duplicatesRemove rows that repeat on the given columns
fill_emptyFill empty cells in a column with a value
make_chartDraw a chart of y by x
sortOrder the rows by a column
select_columnsKeep only the listed columns
export_xlsxSave 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:

python25 qator
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"])
Chiqish
qo'shimcha natijalar: [{'chart': 'bar', 'x': 'filial', 'y': 'summa'}]
filialsumma_mlrd
Xorazm7 922.2
Toshkent7 901.9
Farg'ona7 831.9
Samarqand7 941
Buxoro7 819.8
Namangan7 826.4
Andijon7 867.2
Qashqadaryo7 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:

python16 qator
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()
Chiqish
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?

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

Telegramda yozish Narxlar