التضمينات والبحث المتجهي: خارطة طريق للمبتدئين
تريد إضافة بحث دلالي إلى تطبيقك - حيث يكتب المستخدمون استعلامًا ويحصلون على نتائج بناءً على المعنى، وليس الكلمات المفتاحية الدقيقة. لكنك لست متأكدًا من أين تبدأ: ما هي التضمينات؟ هل تحتاج إلى قاعدة بيانات متجهية؟ كيف تقيس التشابه؟ تجيب خارطة الطريق هذه على تلك الأسئلة بخطوات عملية وكود يمكنك تشغيله اليوم.
ما هي التضمينات؟
التضمين هو متجه كثيف من أرقام الفاصلة العائمة يمثل معنى المدخل - نص، صورة، صوت، إلخ. بالنسبة للنص، يقوم نموذج مثل text-embedding-3-small أو بديل مفتوح المصدر (مثل all-MiniLM-L6-v2) بتحويل الجملة إلى، على سبيل المثال، متجه من 384 بعدًا. الكلمات أو الجمل ذات المعاني المتشابهة تنتهي قريبة من بعضها البعض في فضاء المتجهات هذا.
مثال: "قطة" و"هريرة" سيكون لهما متجهات أقرب من "قطة" و"طائرة". هذه الخاصية تمكن البحث الدلالي: تقوم بتضمين مستنداتك والاستعلام، ثم تجد أقرب متجهات المستندات.
كيف يعمل البحث المتجهي
البحث المتجهي (يُسمى أيضًا بحث التشابه) يجد المتجهات في مجموعة بياناتك الأكثر تشابهًا مع متجه الاستعلام. يُقاس التشابه عادةً باستخدام تشابه جيب التمام أو الضرب النقطي. بالنسبة للمتجهات المعيارية، تشابه جيب التمام والضرب النقطي متكافئان.
البحث بالقوة الغاشمة يقارن الاستعلام بكل متجه - جيد لآلاف المتجهات، بطيء جدًا للملايين. هنا تأتي خوارزميات الجار الأقرب التقريبي (ANN)، مثل HNSW (العالم الصغير القابل للملاحة الهرمي) أو IVF (فهرس الملف المقلوب). إنها تقايض القليل من الدقة مقابل مكاسب هائلة في السرعة.
خطوة بخطوة: بناء نموذج بحث دلالي
- اختر نموذج تضمين. للنص الإنجليزي، ابدأ بنموذج صغير وسريع مثل
all-MiniLM-L6-v2(384 بعدًا) من Sentence Transformers. للإنتاج، فكر فيtext-embedding-3-smallمن OpenAI (1536 بعدًا) أوtext-embedding-3-large(3072 بعدًا). - ضمّن مستنداتك. قسّم النصوص الطويلة إلى أجزاء (مثلاً 200-500 كلمة) بحيث يلتقط كل جزء فكرة متماسكة. خزّن النص الأصلي بجانب المتجه.
- اختر مخزن متجهات. للبدء السريع، استخدم مكتبة في الذاكرة مثل FAISS أو مصفوفة NumPy بسيطة. للإنتاج، اختر قاعدة بيانات متجهية مخصصة (انظر الجدول أدناه).
- ضمّن الاستعلام. استخدم نفس النموذج لتضمين استعلام بحث المستخدم.
- ابحث. احسب التشابه بين متجه الاستعلام وجميع متجهات المستندات (أو استخدم فهرس ANN) وأعد أفضل k نتائج.
- كرر. قيّم النتائج، اضبط حجم الجزء، النموذج، أو مقياس التشابه.
مثال Python بسيط مع Sentence Transformers و FAISS
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# 1. Load model
model = SentenceTransformer('all-MiniLM-L6-v2')
# 2. Sample documents
docs = [
"The cat sat on the mat.",
"A kitten is playing with yarn.",
"The stock market crashed today.",
"Investors are worried about inflation."
]
# 3. Create embeddings
embeddings = model.encode(docs, convert_to_numpy=True)
# 4. Build FAISS index
dim = embeddings.shape[1]
index = faiss.IndexFlatL2(dim) # L2 distance; for cosine, normalize first
index.add(embeddings)
# 5. Search
query = "feline resting"
query_vec = model.encode([query], convert_to_numpy=True)
D, I = index.search(query_vec, k=2)
print([docs[i] for i in I[0]])
# Output likely: ['The cat sat on the mat.', 'A kitten is playing with yarn.']
اختيار قاعدة بيانات متجهية
للمشاريع الصغيرة، يمكنك تخزين المتجهات في ملف بسيط أو فهرس في الذاكرة. مع توسعك، توفر قاعدة بيانات متجهية مخصصة الاستمرارية والتصفية وفهارس ANN. إليك مقارنة سريعة:
| قاعدة البيانات | النوع | الأفضل لـ |
|---|---|---|
| FAISS | مكتبة | النماذج الأولية، التجارب المحلية |
| Chroma | مدمجة / عميل-خادم | التطبيقات الصغيرة والمتوسطة، إعداد سهل |
| Pinecone | سحابي مُدار | الإنتاج، التوسع بدون خادم |
| Weaviate | مفتوح المصدر / سحابي | البحث الهجين، واجهة GraphQL |
| Qdrant | مفتوح المصدر / سحابي | أداء عالٍ، تصفية |
| pgvector | امتداد PostgreSQL | حزمة Postgres الحالية |
أفضل الممارسات والمزالق الشائعة
- طبّع المتجهات إذا كنت تستخدم تشابه جيب التمام - تفترض العديد من المكتبات متجهات وحدة للضرب النقطي.
- قسّم بحكمة: كبير جدًا تفقد التحديد؛ صغير جدًا تفقد السياق. جرب التداخل.
- استخدم نفس النموذج للمستندات والاستعلامات. خلط النماذج يكسر التشابه.
- فكر في تقليل الأبعاد (مثل PCA) فقط إذا كان التخزين أو السرعة حرجة؛ قد يضر بالدقة.
- البحث الهجين (الجمع بين الكلمات المفتاحية والمتجهات) غالبًا يحسن النتائج للمطابقات الدقيقة.
الأسئلة الشائعة
هل أحتاج إلى قاعدة بيانات متجهية لمشروع صغير؟
لا. لما يصل إلى بضعة آلاف من المتجهات، يمكنك استخدام مكتبة في الذاكرة مثل FAISS أو حتى مصفوفة NumPy. تصبح قاعدة البيانات المتجهية مفيدة عندما تحتاج إلى الاستمرارية أو التصفية أو التوسع خارج الذاكرة.
كيف أختار نموذج تضمين؟
ابدأ بنموذج صغير وسريع مثل all-MiniLM-L6-v2 للنماذج الأولية. إذا كنت بحاجة إلى دقة أعلى ويمكنك تحمل تكاليف API، جرب text-embedding-3-small من OpenAI أو text-embedding-3-large. قيّم دائمًا على بياناتك الخاصة.
ما الفرق بين تشابه جيب التمام والمسافة الإقليدية؟
يقيس تشابه جيب التمام الزاوية بين المتجهات، متجاهلاً المقدار. تقيس المسافة الإقليدية المسافة المستقيمة. بالنسبة للمتجهات المعيارية، يعطيان نفس الترتيب. تشابه جيب التمام شائع لتضمينات النص لأنه يركز على الاتجاه (المعنى) بدلاً من الطول.
الخطوات التالية
الآن بعد أن فهمت الأساسيات، حاول بناء بحث دلالي صغير على ملاحظاتك أو وثائقك. جرب أحجام الأجزاء والنماذج. مع نموك، انتقل إلى قاعدة بيانات متجهية مُدارة وأضف البحث الهجين. المجال يتطور بسرعة، لكن هذه الأساسيات ستبقى ذات صلة.
عندما تحتاج إلى تنسيق استجابات API أو تصحيح حمولات JSON من خدمات التضمين، يمكن أن يساعدك منسق JSON في فحص البيانات والتحقق من صحتها بسرعة.