Asosiy qismga o'tish

Bankdagi Excel: qotib qoladigan fayl va taqiqlangan cloud AI

1-bob 3 kod bloki 1653 so'z

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:

  1. Excel faylni qotmasdan ochish.
  2. Faylda nima borligini tushunish.
  3. Avtomatik tozalash — qayerda va qanday tozalaganini ko'rsatib.
  4. Ma'lumotni bazaga yuklash.
  5. Natijani tekshirish, toki birorta yolg'on raqam o'tib ketmasin.
  6. U bilan o'zbek, rus yoki ingliz tilida gaplashish.
  7. 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.

python19 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())
Chiqish
qatorlar: 1,000,000
fayl hajmi: 44.5 MB
kredit_idfilialturisummasana
1NamanganIpoteka95 369 530.352023-01-01
2NamanganIpoteka163 422 196.292023-01-02
3Farg'onaIpoteka246 812 138.392023-01-03
4XorazmBiznes268 275 245.242023-01-04
5Farg'onaIste'mol57 160 529.672023-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:

python17 qator
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)
Chiqish
kompyuter: Intel(R) Core(TM) i9-14900K, 8 oqim, Linux
faylni o'qish + guruhlash + jamlash: 0.22 soniya
filialportfel_mlrdkreditlar
Samarqand31 649125 231
Farg'ona31 647.7125 357
Qashqadaryo31 644.3125 041
Namangan31 565.7124 888
Toshkent31 552.6124 929
Buxoro31 536.7125 040
Xorazm31 530.3124 886
Andijon31 490.1124 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:

python9 qator
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()
Chiqish
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.

Telegramda yozish Narxlar