16-bo‘lim

Semantik qidiruv

Hujjatlardan indeks qurish, kosinus o'xshashlik bilan qidirish, kalit so'zli qidiruv bilan solishtirish va 10 000 hujjatda tezlik.

🕑 8 daqiqa o‘qish 📄 633 so‘z 👁 2 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Indeks
  2. Qidiruv
  3. Xato ham bo'ladi
  4. Kalit so'zli qidiruv bilan solishtirish
  5. Tezlik
  6. Xulosa

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:

Python
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)
Natija
hujjatlar soni: 12
indeks qurildi: (12, 384)  53 ms

(12, 384) - har hujjat uchun bitta 384 o'lchamli qator. Bu bizning indeksimiz.

Qidiruv #

Python
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).

Natija
  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 #

Natija
  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.

Ballarning o'zi ham ogohlantirish beryapti

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:

Natija
  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 shaklHujjatdagi shaklMos keladimi
konteynerkonteynerda, konteynerlarniYo'q
bazanibazasiniYo'q
tarmoqlartarmoqYo'q

O'zbek tili agglyutinativ - so'zga qo'shimchalar ketma-ket yopishadi. Aniq moslik qidiradigan tizim uchun bu falokat.

So'rov: «konteyner texnologiyasi» Kalit so'zli qidiruv so'zlar aynan mos kelishi kerak "konteyner" != "konteynerda" "konteyner" != "konteynerlarni" Natija: 0.000 hech nima topilmadi Semantik qidiruv ma'no vektorlari solishtiriladi Docker ... konteynerda 0.630 Kubernetes ... konteynerlarni 0.458 Ikkalasi ham topildi qo'shimchalar to'sqinlik qilmadi O'zbek tili agglyutinativ - shuning uchun bu farq ayniqsa katta
Qo'shimchalar aniq moslikni buzadi, ma'no vektorlariga esa ta'sir qilmaydi
Bu o'zbek tili uchun asosiy foyda

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 #

Python
katta = F.normalize(torch.randn(10000, 384), p=2, dim=1)
q = vek(["sinov so'rovi"])
torch.topk((q @ katta.T)[0], 5)
Natija
  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 soniIndeks hajmiYondashuv
10 000 gacha~15 MBOddiy matritsa ko'paytmasi yetarli
1 million~1.5 GBFAISS 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.

Indeksni yangilashni unutmang

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.

Amaliy topshiriq
  1. 10-15 ta hujjatdan iborat ro'yxat tuzib, indeks quring.
  2. Indeks shaklini chop etib, raqamlarni izohlang.
  3. Uchta so'rov yozib, natijalarni ko'ring.
  4. Bitta so'rov uchun to'g'ri javob ikkinchi o'rinda chiqishiga erishing.
  5. Ballar farqiga qarab «ishonchsiz» holatni aniqlang.
  6. Kalit so'zli qidiruv yozib, xuddi shu so'rovlarni sinang.
  7. O'zbekcha qo'shimchalar kalit so'zli qidiruvni nega buzishini tushuntiring.
  8. 10 000 ta tasodifiy vektorda qidiruv tezligini o'lchang.
  9. Indeks xotirasini hisoblab, 1 million hujjat uchun bashorat qiling.
  10. Hujjat o'zgarganda indeksni yangilaydigan funksiya yozing.

Xulosa #

  • Indeks - barcha hujjatlarning vektorlari: bizda (12, 384).
  • Qidiruv bitta matritsa ko'paytmasi va topk dan 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 - konteyner va konteynerda mos 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.

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.