Savol berish va "buni qila olmayman"
Ikki ko'nikma
Tezning modeli ikki xil javob beradi: plan yoki savol. 2-bobda ko'rdik, savol ikki xil vaziyatda kerak:
- So'rov noaniq. "Hisobot", "Tahlil qil" — nima, qaysi ustun bo'yicha? To'g'ri javob — aniqlashtiruvchi savol, jadvalning haqiqiy ustunlarini taklif qilib.
- So'rov aniq, lekin bajarib bo'lmaydi. "Keyingi oy savdosini bashorat qil" — Tezda bashorat tooli yo'q. To'g'ri javob — "buni qila olmayman" va o'rniga nima qilish mumkinligini aytish.
7-bobda ko'rdik: o'qitilmagan modellar ikkalasini ham deyarli qilmaydi. Hech bir model noaniq so'rovda o'zi savol bermadi. Bu ikki ko'nikmani alohida o'rgatish kerak edi, va ikkalasi ham oxirgi bobdagi ma'lumot fabrikasidan farqli yo'l bilan yasaladi: bu yerda plan yo'q — demak DuckDB bilan tekshiriladigan narsa ham yo'q.
Noaniq so'rovlar
Noaniq so'rovlar ro'yxatini biz qo'lda yozganmiz — ular qisqa va har qanday jadvalga mos:
import json from collections import Counter noaniq = json.load(open(TEZ / "training/vague_requests.json", encoding="utf-8")) qisqa = json.load(open(TEZ / "training/vague_requests_short.json", encoding="utf-8")) davomli = json.load(open(TEZ / "training/vague_followups.json", encoding="utf-8")) print(f"noaniq so'rovlar: {len(noaniq)}, qisqa noaniq: {len(qisqa)}, suhbat ichidagi noaniq: {len(davomli)}") print("tillar:", dict(Counter(s["language"] for s in noaniq))) print("misollar:", [s["text"] for s in noaniq[::6]])
noaniq so'rovlar: 31, qisqa noaniq: 40, suhbat ichidagi noaniq: 19
tillar: {'uz_latin': 10, 'ru': 9, 'en': 8, 'mixed': 4}
misollar: ['Hisobot', "Buni o'zgartir", 'Проанализируй', 'Отсортируй', 'Change it', 'Hammasini посчитай']
Har bir noaniq so'rov har bir jadval bilan juftlanadi, va o'qituvchi (Gemma) savolni yozadi.
Uning prompti — training/teacher_ask.txt. Asosiy qoida: savolda jadvalda haqiqatan bor ikki-uch
variantni, biznes so'zlari bilan taklif qilish. "Qaysi ustunni nazarda tutyapsiz?" — yomon savol.
"Filiallar bo'yicha jami summami yoki oylik dinamikami?" — yaxshi savol.
Bu juftliklarning qanchasi trainingga kirgan? tez8 ning fayli:
from pathlib import Path tez8 = [json.loads(q) for q in open(Path.home() / "tez_runs/tez8/data/train.jsonl", encoding="utf-8")] savollar = [q for q in tez8 if q["messages"][-1]["content"].startswith('{"ask"')] print(f"tez8: {len(tez8):,} qator, ulardan savol javoblari: {len(savollar):,} ({len(savollar) / len(tez8):.1%})") for q in savollar[:3]: print(f" {q['messages'][-2]['content'].split(chr(10))[0][:40]:40s} -> {q['messages'][-1]['content'][:110]}")
tez8: 19,886 qator, ulardan savol javoblari: 980 (4.9%)
Ma'lumotlarni ko'rib chiq -> {"ask":"Qaysi ma'lumotni ko'rib chiqishni xohlaysiz: masalan, 'Oziq-ovqat' kategoriyasidagi savdolarni, 'Toshk
Срвани -> {"ask":"Уточните, пожалуйста, что именно нужно сравнить: общую сумму продаж по магазинам (например, \"Yunusobo
Давом эттир -> {"ask":"Қолган қаторлар бўйича қандай таҳлилни давом эцам бўлади: умумий савдо ҳажмини ҳисоблаш, чегирма миқдо
Har yigirmanchi qator — savol. Qolganining hammasi — plan. Bu muvozanat muhim: savol ko'p bo'lsa, model aniq so'rovlarda ham savol bera boshlaydi. 6-qismdagi o'lchovda tez8 aniq so'rovlarning 670 tasidan faqat bittasida ortiqcha savol bergan.
"Qila olmayman" — qiyinroq
Noaniq so'rovni tanib olish oson: unda harakat ham, ma'lumot ham yo'q. Bajarib bo'lmaydigan so'rov esa aniq ko'rinadi: "har bir bankning kredit-depozit nisbati". Unda harakat bor (nisbat), ustunlar bor (kredit, depozit). Model toollar ro'yxatini bilishi va "nisbat" degan tool yo'qligini sezishi kerak.
tez8 bunday qatorlarni umuman ko'rmagan — uning ma'lumotida "qila olmayman" juftliklari nol. Ular
tez9 track ida qo'shildi: training/cannot.py. Bu yerda o'qituvchi ham so'rovni, ham javobni
yozadi — ma'lum bir tur bo'yicha:
sozlama = json.load(open(TEZ / "training/settings.json", encoding="utf-8"))["cannot"] for tur, tavsif in sozlama["kinds"].items(): print(f"{tur:15s} {tavsif[:105]}") print() print("hakam tekshiradigan turlar:", sozlama["judged_kinds"])
ratio dividing one column by a different column for each row or group, such as one amount per another amount; n column_math a new value computed from two different columns in each row, such as their difference, sum or product forecast a forecast or prediction of future values why the cause or reason behind a change: the worker asks why a number went up or down, not how much it change other_file comparing with, merging or looking up another file or table that is not open outside facts that are not in this table, such as inflation, the official exchange rate, news or market prices coded rows chosen by a meaning word such as women, married people or higher education, never by a code number, missing_column rows or totals chosen by a property this table does not have in any column, such as ownership type, regio no_history how a value changed over time, over a year or between months, while this table has no dates or only one d hakam tekshiradigan turlar: ['why', 'outside', 'forecast', 'other_file', 'missing_column']
Etti tur 12-partiyada ishlatilgan. Ro'yxatning oxirgi ikkitasi — missing_column (jadvalda yo'q xususiyat)
va no_history (sanasi yo'q jadvalda vaqt bo'yicha o'zgarish) — bu kitob yozilgan kuni qo'shildi,
real testdagi xatolar tahlilidan keyin. Ular hali hech bir ma'lumotga kirmagan.
Hakam xatosi
Bu yerda tekshiruv muammosi bor. Plan yo'q — demak 14-bobdagi qaytish tekshiruvi ishlamaydi. O'qituvchi "bajarib bo'lmaydigan" deb yozgan so'rov aslida bajarilishi mumkin bo'lsa-chi? Unda model bajarish mumkin bo'lgan so'rovga "qila olmayman" deyishni o'rganadi — bu ham yolg'on.
Shuning uchun ikkinchi model — hakam — har bir so'rovni tekshiradi: "bu so'rovni shu toollar bilan bajarish mumkinmi?" Hakam "mumkin" desa, juftlik tashlanadi.
Lekin hakamni ham tekshirish kerak edi, va bu birinchi marta qilinmadi. Xatolar jurnalida 10-raqam: hakam hamma nisbat va ustunlar orasidagi hisob so'rovlarini "mumkin" deb belgilagan — garchi Tezda bunday tool yo'q bo'lsa ham. Natijada eng muhim tur deyarli butunlay tashlanib ketardi. Tuzatish: hakam faqat ba'zi turlarni tekshiradi (yuqoridagi ro'yxat — nisbat va ustunlar hisobi unda yo'q, chunki ular ta'rif bo'yicha bajarib bo'lmaydi), va hakam prompti aniqroq yozildi. Qoida: har qanday hakam yoki tekshiruvchini avval kichik, qo'lda belgilangan namunada o'lchash.
Natija: 858 qator
12-partiyada 858 ta "qila olmayman" qatori yasaldi. Ulardan bir nechtasi:
rad = [json.loads(q) for q in open("/mnt/d/Tez_spikes/batch12/cannot.jsonl", encoding="utf-8")] print(f"qatorlar: {len(rad)}, tillar: {dict(Counter(q['language'] for q in rad))}") for q in rad[::200][:4]: print(f"\n[{q['language']}] {q['text'][:100]}") print(f" -> {q['plan']['ask'][:150]}")
qatorlar: 858, tillar: {'uz_latin': 138, 'uz_cyrillic': 138, 'ru': 211, 'en': 224, 'mixed': 147}
[uz_latin] Filial bo'yicha mijozlarning o'rtacha summa/komissiya nisbatini hisoblashim kerak.
-> Bu hisoblash mavjud vositalar bilan amalga oshirilmaydi. Siz filial bo'yicha jami summa yoki mijoz ismi bo'yicha eng ko'p tranzaksiya sonini hisoblash
[mixed] Kelgusi chorakda 'Uzcard' turidagi kartalarning oylik aylanmasi qanday bo'lishi haqida bashorat bera
-> Bu ma'lumot mavjud vositalar bilan amalga oshirib bo'lmaydi. Siz 'Humo' turidagi kartalarning oylik aylanmasini hisoblashingiz yoki 'Mirobod' filialid
[mixed] Nima sababdan 'Kartalar soni' bo'yicha 'Mirobod' filialining 'fakt' ko'rsatkichi tushib ketdi?
-> Ushbu ma'lumotni aniqlash imkoni mavjud emas. Lekin siz 'filial' bo'yicha 'fakt'ni saralashingiz yoki 'korsatkich' bo'yicha 'fakt'ni aniqlashingiz mum
[mixed] Iltimos, har bir yozuv uchun kutilgan summa va ehtimollik foizining ko'paytmasini hisoblab bera olas
-> Bu amalni mavjud vositalar bilan bajara olmayman. Buning o'rniga, men "kompaniya" bo'yicha umumiy yig'indini hisoblashim yoki "mahsulot" bo'yicha eng
Har bir javob ikki qismdan iborat: bu ishni qila olmasligini aytadi, va o'rniga shu jadvalda haqiqatan
bajarish mumkin bo'lgan ikki narsani taklif qiladi. Bu qoida sozlamalarda (reply).
Ishladimi?
tez9 ana shu 858 qator bilan o'qitildi (va yana ko'p boshqa o'zgarishlar bilan). tez10 — faqat shu qatorlar bilan, tez8 ning ma'lumotiga qo'shib. tez10 hali o'qitilmoqda, shuning uchun bu yerda tez8 va tez9 ni solishtiramiz — real jadvallar ustidagi testda, tuzoq turlari bo'yicha:
import glob tuzoqlar = {} for fayl in sorted(glob.glob(str(TEZ / "accuracy/suites/real_*/questions.json"))): toplam = Path(fayl).parent.name savol = {s["id"]: s for s in json.load(open(fayl, encoding="utf-8"))} for model in ("tez8g", "tez9g"): for javob in map(json.loads, open(TEZ / f"results/{model}_cpu_{toplam}.jsonl", encoding="utf-8")): tur = savol[javob["id"]].get("trap", "oddiy") hisob = tuzoqlar.setdefault(tur, {"savollar": 0, "tez8g": 0, "tez9g": 0}) hisob["savollar"] += model == "tez8g" hisob[model] += javob["correct"] for tur in ("tool_gap", "vague", "codes", "groups"): h = tuzoqlar[tur] print(f"{tur:10s} savollar {h['savollar']}: tez8 {h['tez8g']}, tez9 {h['tez9g']}")
tool_gap savollar 6: tez8 1, tez9 5 vague savollar 6: tez8 5, tez9 4 codes savollar 3: tez8 1, tez9 1 groups savollar 1: tez8 0, tez9 0
tool_gap — bajarib bo'lmaydigan so'rovlar: tez8 oltidan bitta, tez9 oltidan beshta. "Qila
olmayman" qatorlari ishladi. Ularning javoblarini yonma-yon ko'raylik:
for fayl in sorted(glob.glob(str(TEZ / "accuracy/suites/real_*/questions.json"))): toplam = Path(fayl).parent.name savol = {s["id"]: s for s in json.load(open(fayl, encoding="utf-8"))} t8 = {j["id"]: j for j in map(json.loads, open(TEZ / f"results/tez8g_cpu_{toplam}.jsonl", encoding="utf-8"))} t9 = {j["id"]: j for j in map(json.loads, open(TEZ / f"results/tez9g_cpu_{toplam}.jsonl", encoding="utf-8"))} for i, s in savol.items(): if s.get("trap") == "tool_gap": print(f"{s['text']}") print(f" tez8: {t8[i]['output'][:100]}") print(f" tez9: {t9[i]['output'][:100]}")
har bir bankning kredit depozit nisbati
tez8: {"steps":[{"tool":"group_and_total","args":{"group_by":["Banknomi"],"value_column":"Depozitsumma","a
tez9: {"ask":"Bu ma'lumotlar mavjud vositalar bilan hisoblash imkoni yo'q. Siz banklar bo'yicha kredit sum
to'lamaslik ehtimolini bashorat qil
tez8: {"steps":[{"tool":"group_and_total","args":{"group_by":["PAY_0","PAY_2","PAY_3","PAY_4","PAY_5","PAY
tez9: {"ask":"Bu ma'lumotlar bilan amalga oshirilmaydi. Siz 'limit' bo'yicha filtrlash yoki 'to'lov miqdor
dollar kursi bir yilda qanday o'zgargan
tez8: {"steps":[{"tool":"filter_dates","args":{"column":"G5","period":"last_year"}},{"tool":"period_compar
tez9: {"steps":[{"tool":"period_compare","args":{"date_column":"G5","value_column":"G4","period":"year","c
2023 va 2024 ulushlari farqini hisobla
tez8: {"steps":[{"tool":"period_compare","args":{"date_column":"01122023mlrdsom","value_column":"01122024u
tez9: {"ask":"Bu hisoblash mavjud vositalar bilan amalga oshirilmaydi. Siz 2023 yilgi miqdorni yoki 2024 y
har bir viloyatda kredit depozitdan necha barobar ko'p
tez8: {"steps":[{"tool":"group_and_total","args":{"group_by":["Regions"],"value_column":"Total loan portfo
tez9: {"ask":"Bu ma'lumotni mavjud vositalar bilan hisoblash mumkin emas. Buning o'rniga, siz viloyatlar b
keyingi oy savdosini bashorat qil
tez8: {"ask":"Qaysi ma'lumotlar bo'yicha savdo hajmini bashorat qilish kerak: barcha mijozlar, faqat \"Uni
tez9: {"ask":"Bu ma'lumotlar bilan amalga oshirilmaydi. Siz 'United Kingdom' mamlakatidagi savdolarni filt
tez9 ning javoblari aynan o'rgatilgan shaklda: "bu mavjud vositalar bilan hisoblanmaydi", keyin taklif. tez8 esa eng yaqin toolni oladi va boshqa savolga javob beradi.
Lekin jadvalning qolgan qatorlari muhim. vague — noaniq so'rovlar — tez9 da bittaga kamaydi.
Va umumiy natijada tez9 tez8 dan yutmadi (21-bob). Bitta ko'nikma qo'shildi, boshqa joyda nimadir
yo'qoldi — va tez9 da bir vaqtda juda ko'p narsa o'zgargani uchun, nima sababdan ekanini bilib
bo'lmaydi. tez10 aynan shu savolga javob berish uchun yasalgan: faqat "qila olmayman" qatorlari, boshqa
hech narsa.
Hali hal qilinmagan: kodlar
Jadvalning codes qatori — ikkala modelda ham uchtadan bitta. Bu kodli ustunlar haqidagi
savollar: "ayol mijozlar", "turmush qurgan mijozlar". Real kredit jadvalida jins SEX ustunida 1 va 2
bilan saqlangan, va jadvalda qaysi raqam nimani bildirishi yozilmagan. To'g'ri javob — so'rash.
Ikkala model ham SEX = 2 deb taxmin qildi.
Bu kitob yozilgan kuni bir sabab taxmin qilindi: tez9 ning training ma'lumotida bitta sintetik jadval
inglizcha sarlavhalarda aynan SEX, EDUCATION, MARRIAGE nomlarini ishlatgan, va o'sha jadvalning
lug'atida "ayol = 2" deb yozilgan. Lekin bu sabab tekshiruvdan o'tmadi: tez8 bu jadvalni hech qachon
ko'rmagan va xuddi shu javobni bergan. Demak sabab boshqa — ehtimol modelning umumiy bilimi (bu ochiq
ma'lumotlar to'plami internetda mashhur), ehtimol oddiy taxmin. Buni bilmaymiz. Xatolar jurnalida bu
20-raqam: sababni aytishdan oldin, o'sha sababi yo'q holatni tekshirish.
Keyingi ma'lumot partiyasi uchun tayyorlangan o'zgarishlarda sarlavhalar baribir almashtirildi — boshqa sabab bilan: test jadvalining nomlari trainingda bo'lmasligi kerak. Va kodli savollar soni to'rt barobar oshirildi. Bu o'zgarishlar hali qo'llanmagan: ular joriy benchmark tugagandan keyin kiritiladi.
Ballning chegarasi
Bir texnik nozik nuqta. Test to'plamlarida "savol berish kerak" va "qila olmayman deyish kerak" — bir
xil yozilgan: "ask". Hisoblagich ularni farqlamaydi. Natijada chakana savdo jadvalidagi "keyingi
oy savdosini bashorat qil" so'roviga tez8 ning javobi to'g'ri hisoblangan — u savol bergan: "qaysi
mijozlar bo'yicha bashorat qilay?" (2-bob). Bu savol go'yo bashorat qila oladigandek. To'g'ri javob
emas, lekin ball oldi.
Planda: "qila olmayman" — alohida javob turi, hisoblagich uni savoldan farqlaydi.
Xulosa
- Noaniq so'rovlar — qo'lda yozilgan ro'yxat; o'qituvchi jadvalga mos savol yozadi. tez8 da har yigirmanchi qator — savol.
- "Qila olmayman" juftliklarini o'qituvchi tur bo'yicha yozadi, hakam tekshiradi. Hakam birinchi versiyada eng muhim turni "mumkin" deb tashlagan — har qanday hakamni avval o'lchash kerak.
- 858 ta "qila olmayman" qatori bajarib bo'lmaydigan so'rovlarni oltidan birdan oltidan beshga ko'tardi (tez9). tez10 bu ta'sirni boshqa o'zgarishlarsiz o'lchaydi.
- Kodli ustunlar hali hal qilinmagan; sabab haqidagi birinchi taxmin noto'g'ri chiqdi.
- Hisoblagich savol va "qila olmayman" ni farqlamaydi — bu planda.
To'rtinchi qism tugadi. Beshinchi qismda trainingning o'zi: run1 dan tez10 gacha, har bir model va uning saboqlari.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.