الـ Embeddings والبحث الدلالي· الدرس 5 من 7
قواعد بيانات الفيكتور
في سطر واحد · قاعدة بيانات الفيكتور بتخزّن ملايين الـ embeddings وبتلاقي أقرب النتايج لاستعلامك في أجزاء من الثانية — من غير ما تقارن واحد واحد.
لو دوّرت بالطريقة الساذجة على مليون فيكتور هتموت من البطء؛ قواعد الفيكتور بتستخدم فهرسة ذكية (ANN) عشان البحث يفضل سريع وإنت بتكبّر.
بدل ما تفتّش كل رفّ في المخزن، الفهرس بيوصّلك على طول للرفّ اللي فيه اللي بتدوّر عليه تقريبًا — بتضحّي بشوية دقة عشان سرعة رهيبة.
زي ما تدوّر على كلمة في قاموس: مش بتقرأ كل صفحة، بتنطّ على الحرف الصح على طول. الفهرس بيعمل نفس النطّة مع ملايين الفيكتورات — بيقرّبك من المكان الصح من غير ما يفحص كل واحد.
على Cloudflare بتستخدم Vectorize: بتحطّ فيه فيكتورات الـ chunks بتاعتك مرة، وبعدين كل استعلام بيرجّعلك أقرب ٥ نتايج جاهزة تبعتها للموديل.
البحث الدقيق 100% (exact k-NN) معناه مقارنة الاستعلام بكل فيكتور — O(n) ومش عملي مع الملايين. فقواعد الفيكتور بتبني فهرس ANN (Approximate Nearest Neighbor)، وأشهر خوارزمية هي HNSW: بتبني رسم بياني متعدد الطبقات، الطبقات العليا فيها «طرق سريعة» بين مناطق بعيدة، والسفلى فيها الروابط الدقيقة. الاستعلام بينزل من فوق لتحت وبيقرّب في كل خطوة — بيفحص جزء صغير جدًا من الفيكتورات وبيلاقي الأقرب «تقريبًا». التقريب ده هو الثمن: ممكن يفوّت الجار الأقرب الحقيقي أحيانًا (recall أقل من 100%)، وتقدر تظبط البارامترات لتوازن السرعة والدقة اللي يناسبك.
🧪 جرّب بنفسك: خزّن فيكتورات ٢٠–٣٠ قطعة نص في فهرس فيكتور (Vectorize مثلًا)، وبعدين استعلم بـ ٣ أسئلة مختلفة وشوف الـ top-5 وقيم التشابه بتاعتهم. بعدين احسب نفس الاستعلامات بالمقارنة المباشرة (cosine مع كل فيكتور) وقارن الترتيبين — على الحجم الصغير ده هيطلعوا متطابقين، وده بيوضّحلك إيه اللي الفهرس «بيقرّبه» لما الحجم يكبر.
أشهر غلطة: تفتكر النتايج مضمونة 100% — الـ ANN تقريبي بطبيعته، ولما جار قريب يختفي أحيانًا دي مش bug دي الصفقة نفسها. غلطة تانية: تشغّل قاعدة فيكتور كاملة (بتكلفتها وتعقيدها) لعشرة آلاف فيكتور — دول بيتحسبوا بالمقارنة المباشرة في مللي ثواني. وتالتة: تنسى الـ metadata filtering — بتفلتر بعد البحث بدل ما تخلّي القاعدة تفلتر جوّه الاستعلام، فبترجع بنتايج أقل من المطلوب.
استخدمها لما فيكتوراتك بالمئات الآلاف أو الملايين، أو لما محتاج تحديث مستمر للفهرس، فلترة بالـ metadata، أو بنية تحتية managed زي Vectorize بدل ما تدير الفهرسة بنفسك.
تحت ~١٠٠ ألف فيكتور، المقارنة المباشرة في الذاكرة (أو امتداد pgvector في قاعدة بياناتك الموجودة) غالبًا أبسط وكفاية جدًا — وكمان بتدّيك دقة 100% من غير تقريب. متضيفش نظام جديد للـ stack قبل ما تحتاجه فعلًا.