16-bo‘lim
Semantik qidiruv
Hujjatlardan indeks qurish, kosinus o'xshashlik bilan qidirish, kalit so'zli qidiruv bilan solishtirish va 10 000 hujjatda tezlik.
Ushbu bo‘lim mundarijasi
Embedding vektorlari tayyor. Endi ulardan ishlaydigan qidiruv tizimi quramiz - o'qitishsiz, bir necha o'n qator kod bilan.
Indeks #
Barcha hujjatlarni bir marta vektorga aylantiramiz:
hujjatlar = [
"Python - o'rganish oson bo'lgan dasturlash tili.",
"PyTorch chuqur o'rganish uchun kutubxona hisoblanadi.",
"Transformer arxitekturasi 2017-yilda taklif qilingan.",
"SQL ma'lumotlar bazasidan ma'lumot olish uchun ishlatiladi.",
"Docker dasturlarni konteynerda ishga tushiradi.",
"Git kod versiyalarini boshqarish tizimi.",
# ... jami 12 ta
]
H = vek(hujjatlar)
hujjatlar soni: 12
indeks qurildi: (12, 384) 53 ms
(12, 384) - har hujjat uchun bitta 384 o'lchamli qator. Bu bizning
indeksimiz.
Qidiruv #
def qidir(s, k=3):
q = vek([s])
ball = (q @ H.T)[0] # bitta matritsa ko'paytmasi
top = torch.topk(ball, k)
for b, i in zip(top.values.tolist(), top.indices.tolist()):
print(f" {b:.3f} {hujjatlar[i]}")
Butun qidiruv - bitta matritsa ko'paytmasi. Vektorlar normallangani uchun natija to'g'ridan-to'g'ri kosinus o'xshashlik (15-bo'lim).
so'rov: 'neyron tarmoqlar qanday ishlaydi'
0.573 Neyron tarmoq qatlamlardan tashkil topadi.
0.394 Git kod versiyalarini boshqarish tizimi.
0.379 Gradient tushish usuli yo'qotishni kamaytiradi.
so'rov: 'konteyner texnologiyasi'
0.630 Docker dasturlarni konteynerda ishga tushiradi.
0.481 Git kod versiyalarini boshqarish tizimi.
0.458 Konteynerlarni boshqarish uchun Kubernetes ishlatiladi.
so'rov: 'kod o'zgarishlarini saqlash'
0.584 Git kod versiyalarini boshqarish tizimi.
0.562 Ma'lumotlar bazasini zaxiralash muhim vazifa.
0.501 Konteynerlarni boshqarish uchun Kubernetes ishlatiladi.
Uchala so'rovda ham birinchi natija to'g'ri.
Eng qizig'i uchinchisi: «kod o'zgarishlarini saqlash» so'rovi Git hujjatini topdi. Ular orasida umumiy so'z faqat «kod» - qolgani butunlay boshqacha yozilgan.
Xato ham bo'ladi #
so'rov: 'bazani nusxalash kerak'
0.461 Neyron tarmoq qatlamlardan tashkil topadi.
0.402 Ma'lumotlar bazasini zaxiralash muhim vazifa.
0.389 Docker dasturlarni konteynerda ishga tushiradi.
To'g'ri javob - «Ma'lumotlar bazasini zaxiralash» - ikkinchi o'rinda. Birinchida esa umuman bog'liq bo'lmagan hujjat.
Muvaffaqiyatli so'rovlarda birinchi ball 0.57-0.63 edi va ikkinchidan sezilarli ajralib turardi.
Bu yerda esa birinchi ball atigi 0.461 va ikkinchisi juda yaqin (0.402). Farq kichik - demak model ishonchsiz.
Amaliy qoida: eng yuqori ball ma'lum chegaradan past bo'lsa yoki birinchi va ikkinchi orasida sezilarli farq bo'lmasa, natijani «topilmadi» deb ko'rsating. Yomon javob berishdan ko'ra hech nima bermaslik afzal.
Kalit so'zli qidiruv bilan solishtirish #
Endi eski usul - so'zlarning ustma-ust tushishini sanash:
so'rov: 'neyron tarmoqlar qanday ishlaydi'
0.250 Neyron tarmoq qatlamlardan tashkil topadi.
0.000 Gradient tushish usuli yo'qotishni kamaytiradi.
so'rov: 'konteyner texnologiyasi'
0.000 Gradient tushish usuli yo'qotishni kamaytiradi.
0.000 Konteynerlarni boshqarish uchun Kubernetes ishlatiladi.
so'rov: 'bazani nusxalash kerak'
0.000 Gradient tushish usuli yo'qotishni kamaytiradi.
0.000 Konteynerlarni boshqarish uchun Kubernetes ishlatiladi.
Deyarli hamma joyda 0.000. Kalit so'zli qidiruv hech nima topmadi.
Sabab o'zbek tilining tuzilishida:
| So'rovdagi shakl | Hujjatdagi shakl | Mos keladimi |
|---|---|---|
konteyner | konteynerda, konteynerlarni | Yo'q |
bazani | bazasini | Yo'q |
tarmoqlar | tarmoq | Yo'q |
O'zbek tili agglyutinativ - so'zga qo'shimchalar ketma-ket yopishadi. Aniq moslik qidiradigan tizim uchun bu falokat.
Ingliz tilida kalit so'zli qidiruv ancha yaxshi ishlaydi - u yerda
so'zlar kam o'zgaradi (container, containers).
O'zbek tilida esa bitta o'zakdan o'nlab shakl yasaladi. Shuning uchun semantik qidiruvning ustunligi bizda ingliz tilidagidan ham kattaroq.
Amalda ikkalasi birga ishlatiladi (gibrid qidiruv): kalit so'z aniq atamalarni (mahsulot kodi, ism) topadi, embedding esa ma'noni.
Tezlik #
katta = F.normalize(torch.randn(10000, 384), p=2, dim=1)
q = vek(["sinov so'rovi"])
torch.topk((q @ katta.T)[0], 5)
bitta qidiruv: 0.456 ms
indeks xotirasi: 14.6 MB
10 000 hujjat orasidan qidirish yarim millisekunddan kam. Indeks esa atigi 14.6 MB.
| Hujjatlar soni | Indeks hajmi | Yondashuv |
|---|---|---|
| 10 000 gacha | ~15 MB | Oddiy matritsa ko'paytmasi yetarli |
| 1 million | ~1.5 GB | FAISS kabi maxsus kutubxona |
| Undan ko'p | - | Vektor bazasi (Qdrant, Milvus) |
Kichik va o'rta loyihada hech qanday maxsus baza kerak emas - NumPy yoki PyTorch yetadi.
Hujjat qo'shilganda yoki o'zgartirilganda uning vektori qayta hisoblanishi kerak.
Ko'p loyihada shu unutiladi: hujjat tahrirlanadi, lekin indeksda eski vektor qoladi. Qidiruv eski matnga qarab ishlaydi va hech qanday xato chiqmaydi.
Indeksni hujjat bilan birga yangilaydigan qilib yozing.
- 10-15 ta hujjatdan iborat ro'yxat tuzib, indeks quring.
- Indeks shaklini chop etib, raqamlarni izohlang.
- Uchta so'rov yozib, natijalarni ko'ring.
- Bitta so'rov uchun to'g'ri javob ikkinchi o'rinda chiqishiga erishing.
- Ballar farqiga qarab «ishonchsiz» holatni aniqlang.
- Kalit so'zli qidiruv yozib, xuddi shu so'rovlarni sinang.
- O'zbekcha qo'shimchalar kalit so'zli qidiruvni nega buzishini tushuntiring.
- 10 000 ta tasodifiy vektorda qidiruv tezligini o'lchang.
- Indeks xotirasini hisoblab, 1 million hujjat uchun bashorat qiling.
- Hujjat o'zgarganda indeksni yangilaydigan funksiya yozing.
Xulosa #
- Indeks - barcha hujjatlarning vektorlari: bizda
(12, 384). - Qidiruv bitta matritsa ko'paytmasi va
topkdan iborat. - Uch so'rovda birinchi natija to'g'ri chiqdi, bittasida ikkinchi o'rinda.
- Ballar farqi kichik bo'lsa - model ishonchsiz, natijani ko'rsatmaslik afzal.
- Kalit so'zli qidiruv o'sha so'rovlarda deyarli 0.000 berdi.
- Sabab: o'zbek tili agglyutinativ -
konteynervakonteynerdamos kelmaydi. - Shuning uchun semantik qidiruvning foydasi o'zbek tilida ayniqsa katta.
- Amalda gibrid yondashuv ishlatiladi: kalit so'z aniq atamalar, embedding ma'no uchun.
- 10 000 hujjatda qidiruv 0.456 ms, indeks 14.6 MB.
- Million hujjatgacha maxsus baza shart emas - oddiy matritsa amali yetadi.
Keyingi bo'limda qidiruv natijalarini til modeliga berib, javob yozdiramiz - bu RAG deb ataladi.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.