Bankdagi Excel: qotib qoladigan fayl va taqiqlangan cloud AI
Juma, soat besh
Juma. Soat besh. Boshliqdan xabar keldi: "Filiallar bo'yicha kredit portfeli, dushanbagacha."
Faylni ochasiz. Excel o'ylaydi. Oyna tepasida "Не отвечает" yozuvi chiqadi. Kutasiz.
Ochildi. Endi filtr qo'shasiz — yana kutasiz. Ustunni saralaysiz — yana. Har bir harakatdan keyin kompyuter o'ylab qoladi, siz esa ekranga qarab o'tirasiz.
Yonidagi hamkasbingiz aytadi: "ChatGPT ga tashla, u bir zumda qilib beradi."
Mumkin emas. Bankda cloud AI (bulutli sun'iy intellekt — internetdagi serverlarda ishlaydigan xizmatlar) taqiqlangan.
Shunday qilib, siz yana Excelga qaytasiz. Kutasiz. Va dushanba kuni ertalab hisobotni qo'lda yig'asiz.
Bu kitob shu muammo haqida. Aniqrog'i — uni hal qilish uchun qurilgan Tez degan dastur haqida, birinchi kundan to bugungacha: nima qildik, qanday qildik, qayerda yiqildik va nima o'rgandik.
Birinchi foydalanuvchi
Loyiha bitta odamdan boshlandi: bizning o'quvchimiz, bankda tahlilchi bo'lib ishlaydi.
Uning ismini ham, bankning nomini ham bu kitobda yozmaymiz. Sababi oddiy: bu loyihada maxfiylik birinchi o'rinda, va bu qoida muallifning o'ziga ham tegishli.
U aytgan narsalar:
- Bankda cloud AI vositalari taqiqlangan: ChatGPT, Claude, Codex — hammasi. Har qanday yordam kompyuterning o'zida ishlashi kerak.
- Fayllari shunchalik katta-ki, oddiy filtr qo'shsa ham Excel qotadi. Eng kuchli kompyuterda ham.
- Ishda bu borada yordam beradigan odam yo'q.
- U o'zi live grafiklar yasagan va ularni Power BI versiyasi bilan solishtirishgan. Bank xodimlari uning grafiklarini afzal ko'rishgan. Shunga qaramay jamoa hamon Excelda ishlaydi va kutadi.
Oxirgi gapga e'tibor bering. Muammo bilimda emas. Bu odam grafikni Power BI dan yaxshi qila oladi. Muammo — vaqt va vosita: har hafta bir xil tozalash, bir xil hisobot, qo'lda, sekin.
U nima so'radi
Tahlilchi Tezdan yetti narsa kutadi. Uning so'zlari bilan:
- Excel faylni qotmasdan ochish.
- Faylda nima borligini tushunish.
- Avtomatik tozalash — qayerda va qanday tozalaganini ko'rsatib.
- Ma'lumotni bazaga yuklash.
- Natijani tekshirish, toki birorta yolg'on raqam o'tib ketmasin.
- U bilan o'zbek, rus yoki ingliz tilida gaplashish.
- Kuchli, aniq, jonli grafiklar.
Beshinchi bandni alohida belgilab qo'ying. Bank uchun "taxminan to'g'ri" degan narsa yo'q. Bitta noto'g'ri jami — va odam dasturga boshqa hech qachon ishonmaydi. Bu talab kitobning har bir bobida qaytib keladi.
Nega shunchaki ChatGPT emas
Bankda eng qimmat narsa — mijoz ma'lumoti. Kredit summasi, depozit, ism, hisob raqami. Bularning bittasi ham bank tashqarisiga chiqmasligi kerak. Shuning uchun "faylni saytga yukla, AI javob bersin" degan yo'l yopiq.
Demak AI kompyuterning ichida ishlashi kerak. Internetsiz. Kichik kompyuterda. Va bu talab — bu loyihadagi eng og'ir cheklov. Kitobdagi deyarli har bir qaror shu bitta gapdan kelib chiqadi:
- Model kichik bo'lishi kerak — chunki u oddiy kompyuterda, ko'pincha videokartasiz ishlaydi.
- Model raqamlarni hisoblamasligi kerak — chunki kichik model hisobda xato qiladi.
- Training ma'lumotida bitta ham haqiqiy mijoz qatori bo'lmasligi kerak.
Uchalasini keyingi boblarda batafsil ochamiz.
"Katta fayl" qanchalik katta
"Excel qotadi" — bu his. Biz his bilan ishlamaymiz, o'lchaymiz.
Keling, katta kredit fayli yasaymiz. Haqiqiy bank ma'lumoti emas — butunlay o'ylab topilgan, kompyuter yasagan raqamlar. Bir million qator.
import duckdb 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) """) fayl = ISH / "kreditlar.csv" con.execute(f"copy kreditlar to '{fayl}' (header)") print(f"qatorlar: {con.execute('select count(*) from kreditlar').fetchone()[0]:,}") print(f"fayl hajmi: {fayl.stat().st_size / 1024 / 1024:.1f} MB") show(con.execute("select * replace (strftime(sana, '%Y-%m-%d') as sana) from kreditlar limit 5").df())
qatorlar: 1,000,000 fayl hajmi: 44.5 MB
| kredit_id | filial | turi | summa | sana |
|---|---|---|---|---|
| 1 | Namangan | Ipoteka | 95 369 530.35 | 2023-01-01 |
| 2 | Namangan | Ipoteka | 163 422 196.29 | 2023-01-02 |
| 3 | Farg'ona | Ipoteka | 246 812 138.39 | 2023-01-03 |
| 4 | Xorazm | Biznes | 268 275 245.24 | 2023-01-04 |
| 5 | Farg'ona | Iste'mol | 57 160 529.67 | 2023-01-05 |
Bir million qator. Excel varag'iga sig'adigan eng ko'p qator soni — 1 048 576. Bizning faylimiz shu chegaraning yonida turibdi. Bankning haqiqiy fayllari esa bundan ham katta bo'lishi mumkin, va ularda besh emas, o'nlab ustun bo'ladi.
Endi boshliqning savoliga javob beramiz: filiallar bo'yicha jami portfel. Faylni noldan o'qiymiz va vaqtni o'lchaymiz:
import os import platform import time protsessor = next(line.split(":", 1)[1].strip() for line in open("/proc/cpuinfo") if line.startswith("model name")) print(f"kompyuter: {protsessor}, {os.cpu_count()} oqim, {platform.system()}") t0 = time.perf_counter() javob = duckdb.connect().execute(f""" select filial, round(sum(summa) / 1e9, 1) as portfel_mlrd, count(*) as kreditlar from read_csv('{fayl}') group by filial order by portfel_mlrd desc """).df() vaqt = time.perf_counter() - t0 print(f"faylni o'qish + guruhlash + jamlash: {vaqt:.2f} soniya") show(javob)
kompyuter: Intel(R) Core(TM) i9-14900K, 8 oqim, Linux faylni o'qish + guruhlash + jamlash: 0.22 soniya
| filial | portfel_mlrd | kreditlar |
|---|---|---|
| Samarqand | 31 649 | 125 231 |
| Farg'ona | 31 647.7 | 125 357 |
| Qashqadaryo | 31 644.3 | 125 041 |
| Namangan | 31 565.7 | 124 888 |
| Toshkent | 31 552.6 | 124 929 |
| Buxoro | 31 536.7 | 125 040 |
| Xorazm | 31 530.3 | 124 886 |
| Andijon | 31 490.1 | 124 628 |
Bir million qatorli faylni o'qish, sakkiz filialga ajratish va har birini jamlash — yuqorida o'lchangan vaqt, soniyalar bilan o'lchanadi. Bu vaqt har safar biroz o'zgaradi: fayl Windows diskida turibdi va WSL uni ko'prik orqali o'qiydi. Lekin bizning o'lchovlarimizda u bir necha soniyadan oshmadi.
Bu yerda halol bo'lish kerak: bu raqam bizning kompyuterimizda o'lchandi, u kuchli (WSL ichida 32 oqimdan 8 tasi berilgan). Bankdagi kompyuter sekinroq bo'lishi aniq. Kuchsiz kompyuterda qancha bo'lishini biz hali o'lchamaganmiz — buni 26-bobda alohida qilamiz va o'shanda haqiqiy raqamni yozamiz. Hozircha faqat bitta xulosa: muammo ma'lumot hajmida emas. Muammo vositada. To'g'ri engine bu ishni bir zumda qiladi.
Unda AI nimaga kerak
Agar DuckDB hammasini bir zumda hisoblasa, AI ning nima keragi bor?
Chunki tahlilchi SQL yozmaydi. U shunday yozadi:
filiallar bo'yicha kredit portfeli, eng kattasidan
Yoki ruscha. Yoki ikki tilni aralashtirib. Yoki xato bilan, shoshib, uch so'z bilan.
Kimdir bu gapni engine tushunadigan aniq planga aylantirishi kerak. Tezda bu ishni model qiladi — va faqat shu ishni. Hisoblashni emas, faqat planni.
Mana haqiqiy misol. Quyidagi javoblarni bizning hozirgi modelimiz — tez8 — test paytida yozgan. Biz ularni fayldan o'qiymiz, hech narsani o'zgartirmaymiz:
import json savollar = {q["id"]: q for q in json.load(open(TEZ / "accuracy/suites/loans/questions.json", encoding="utf-8"))} javoblar = [json.loads(line) for line in open(TEZ / "results/tez8g_cpu_loans.jsonl", encoding="utf-8")] for j in javoblar[:3]: print(f"so'rov ({j['language']}): {savollar[j['id']]['text']}") print(f"model rejasi: {j['output']}") print(f"natija: {j['reason']}, {j['seconds']:.1f} soniya") print()
so'rov (uz_latin): Kredit turlari bo'yicha jami qoldiqni chiqar
model rejasi: {"steps":[{"tool":"group_and_total","args":{"group_by":["kredit_turi"],"value_column":"qoldiq_uzs","agg":"sum"}}]}
natija: same result, 28.1 soniya
so'rov (uz_latin): Yopilgan kreditlarni olib tashla
model rejasi: {"steps":[{"tool":"remove_rows","args":{"column":"holat","op":"=","value":"Yopilgan"}}]}
natija: same result, 2.5 soniya
so'rov (uz_latin): Eng katta qoldig'i bor 10 ta qarzdor
model rejasi: {"steps":[{"tool":"top_n","args":{"by":"qoldiq_uzs","n":10,"descending":true,"group":{"columns":["qarzdor_id"],"agg":"sum"}}}]}
natija: same result, 3.9 soniya
Birinchi javobdagi uzoq vaqtga qarang. Bu modelning o'ylashi emas: birinchi so'rovda model butun promptni — toollar ro'yxati, jadval tavsifi, qoidalar — noldan o'qiydi. Keyingi so'rovlarda bu qism keshdan olinadi va javoblar bir necha soniyaga tushadi. Buni 6-bobda server logi bilan alohida ko'ramiz.
Endi asosiysi: model raqam yozmadi. U faqat qaysi tool, qaysi ustun, qanday amal ekanini yozdi. Qolganini — filtrlash, jamlash, saralashni — DuckDB qiladi, aniq va har safar bir xil.
Bu Tezning asosiy g'oyasi, va uni bir gapda yozib qo'yamiz:
Tez bir gapda
Model plan yozadi. Hisoblashni engine qiladi. Model hech qachon raqam o'ylab topmaydi.
Bu kitob qanday yozilgan
Bu kitob — darslik emas, kundalik. Unda loyiha qanday bo'lsa, shunday yozilgan:
- Har bir raqam o'lchangan. Kitobdagi kod haqiqatan ishga tushadi va chiqish undan olinadi. Training kabi ishga tushirib bo'lmaydigan narsalar uchun haqiqiy log fayllaridan iqtibos olamiz va qaysi fayldan ekanini yozamiz. O'lchay olmagan joyimizda ochiq aytamiz: "o'lchanmagan".
- Muvaffaqiyatsizliklar qoladi. Masalan, tez9 modeli yetti soat o'qitildi va eskisidan yomonroq chiqdi. Bu kitobda bor — nega bo'lgani, qanday topilgani va qanday qoida qo'shilgani bilan.
- Maxfiylik. Kitobda bitta ham haqiqiy bank qatori yo'q. Hamma jadvallar yo o'ylab topilgan, yo ochiq manbadan olingan.
Kitob yetti qismdan iborat:
| Qism | Nima haqida |
|---|---|
| 1. Muammo | Kim, nima og'riydi, Tez nima va nima emas |
| 2. Kod yozishdan oldin o'lchash | Excel o'qish, tezlik, birinchi modellar |
| 3. Engine | Toollar, JSON plan, grammar, DuckDB, Excel o'quvchi |
| 4. Ma'lumot fabrikasi | Training uchun ma'lumotni qanday yasadik va tekshirdik |
| 5. Training | run1 dan tez10 gacha: har bir model va uning saboqlari |
| 6. Halol benchmark | Modelni qanday sinadik va qanday aldanmadik |
| 7. Production | Kuchsiz kompyuter, maxfiylik, yangilash sikli |
Bitta ogohlantirish
Bu kitobdagi ba'zi qarorlar keyinchalik noto'g'ri chiqqan. Biz ularni o'chirmadik. Qaror qabul qilingan paytdagi holat qanday bo'lsa, shunday qoldirdik, va keyin qayerda xato qilganimizni ko'rsatdik. Haqiqiy loyiha aynan shunday ketadi.
Xulosa
- Bank tahlilchisining muammosi — bilim emas, vosita: katta fayl, sekin Excel, taqiqlangan cloud AI.
- Bir million qatorni to'g'ri engine soniyalar ichida jamlaydi (bizning kompyuterda o'lchandi; kuchsiz kompyuter 26-bobda).
- AI faqat bitta ish qiladi: odam gapini aniq planga aylantiradi. Hisoblashni DuckDB qiladi.
- Hamma narsa kompyuterning ichida, internetsiz.
Keyingi bobda Tez nima qilishini va — undan ham muhimi — nima qilmasligini aniq chizib olamiz.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.