دليل لمطوري البرمجيات: بناء أنظمة بحث دلالي عالية الأداء باستخدام Faiss و Milvus وأفضل الممارسات
تحتاج التطبيقات الحديثة إلى القدرة على الاستجابة لاستفسارات المستخدم المعقدة ليس فقط بالكلمات المفتاحية، بل دلاليًا. من توصيات المنتجات إلى البحث عن المستندات، ومن روبوتات الدردشة إلى تصفية المحتوى، يتجاوز البحث الدلالي الأساليب التقليدية لتقديم نتائج أكثر صلة وثراءً. في هذا الدليل، سنستكشف قواعد بيانات المتجهات، وهي أدوات رئيسية تدعم قدرات البحث المدفوعة بالذكاء الاصطناعي هذه، وتطبيقاتها العملية.
البحث الدلالي وتمثيلات المتجهات
في صميم البحث الدلالي تكمن فكرة إنشاء تمثيلات عددية (تضمينات) للبيانات (نص، صور، صوت، إلخ) في مساحات متجهات عالية الأبعاد. تلتقط هذه المتجهات المحتوى الدلالي للبيانات؛ البيانات القريبة دلاليًا سيكون لها متجهات قريبة من بعضها البعض في هذه المساحة. تتضمن عملية البحث حساب التشابه بين تمثيل متجه للاستعلام والمتجهات الأخرى في قاعدة البيانات.
عادة ما تستخدم نماذج التعلم العميق المدربة مسبقًا لإنشاء تمثيلات المتجهات. بالنسبة للنصوص، تتوفر خيارات مثل SBERT (Sentence-BERT) أو نماذج تضمين OpenAI. فيما يلي مثال بسيط لتضمين SBERT باستخدام Python:
from sentence_transformers import SentenceTransformer
import numpy as np
# تحميل نموذج SBERT مدرب مسبقًا
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# جمل أمثلة
sentences = [
"كيف يتم تدريب نماذج الذكاء الاصطناعي؟",
"خوارزميات التعلم الآلي",
"هندسة التعلم العميق",
"كيف تعمل أجهزة الكمبيوتر؟"
]
# تحويل الجمل إلى متجهات
embeddings = model.encode(sentences)
print("بعد المتجه للجملة الأولى:", embeddings[0].shape)
print("تشابه جيب التمام بين متجهات أول جملتين:", np.dot(embeddings[0], embeddings[1]) / (np.linalg.norm(embeddings[0]) * np.linalg.norm(embeddings[1])))
لماذا قواعد بيانات المتجهات؟
لم يتم تصميم قواعد البيانات العلائقية أو NoSQL التقليدية لإجراء عمليات بحث التشابه بكفاءة بين المتجهات عالية الأبعاد. يتطلب العثور على أقرب جار (Nearest Neighbor Search - NNS) أو أقرب جار تقريبي (Approximate Nearest Neighbor - ANN) بين ملايين أو حتى مليارات المتجهات خوارزميات وهياكل فهرسة متخصصة. تقدم قواعد بيانات المتجهات هياكل محسّنة مصممة خصيصًا لحل هذا التحدي.
الحلول المحلية وفي الذاكرة: Faiss
Faiss (Facebook AI Similarity Search) هي مكتبة طورتها Facebook AI للبحث والتجميع عالي الأداء بناءً على التشابه. تم تحسينها خصيصًا لعمليات البحث السريع عن أقرب جار تقريبي على ملايين المتجهات. تعمل في الذاكرة (in-memory) وهي مصممة عمومًا للاستخدام على خادم واحد أو من جانب العميل.
فيما يلي مثال بسيط لإنشاء فهرس Faiss والبحث فيه:
import faiss
# بعد المتجه وعدد نقاط البيانات
d = embeddings.shape[1] # 384
nb = embeddings.shape[0] # 4 (في المثال)
# التحويل إلى Float32 هو مطلب شائع لـ Faiss
xb = embeddings.astype('float32')
# إنشاء فهرس Faiss (على سبيل المثال، IndexFlatL2)
# يخزن هذا الفهرس كل متجه ويقوم ببحث دقيق (NNS، وليس ANN)
index = faiss.IndexFlatL2(d)
print("هل الفهرس مدرب؟", index.is_trained) # يجب أن يكون True لأن IndexFlatL2 لا يحتاج إلى تدريب
# إضافة المتجهات إلى الفهرس
index.add(xb)
print("عدد المتجهات في الفهرس:", index.ntotal)
# إنشاء متجه استعلام (على سبيل المثال، متجه الجملة الأولى)
xq = np.array([model.encode("معلومات حول تدريب الذكاء الاصطناعي")])
xq = xq.astype('float32')
# البحث عن أقرب جارين
k = 2
distances, indices = index.search(xq, k)
print("مسافات أقرب الجيران (L2):", distances)
print("فهارس أقرب الجيران:", indices)
print("أقرب الجمل:", [sentences[i] for i in indices[0]])
يقدم Faiss أنواع فهرس مختلفة (IndexFlatL2، IndexIVFFlat، IndexHNSWFlat، إلخ) مما يتيح لك الموازنة بين الأداء والدقة. بالنسبة لمجموعات البيانات الأكبر، يعد استخدام خوارزميات ANN مثل IndexIVFFlat أو IndexHNSWFlat أكثر كفاءة.
الحلول الموزعة والقابلة للتطوير: Milvus
عندما تحتاج إلى العمل مع مليارات المتجهات أو تتطلب توفرًا عاليًا وقابلية للتطوير على نظام موزع، تدخل قواعد بيانات المتجهات السحابية الأصلية مثل Milvus حيز التنفيذ. Milvus هو نظام مفتوح المصدر مصمم للبحث عن المتجهات على نطاق واسع ويمكن نشره على منصات مثل Kubernetes.
فيما يلي مثال لإنشاء مجموعة وإضافة متجهات والبحث باستخدام Milvus (بافتراض تشغيل مثيل Milvus على Docker):
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility
import random
# الاتصال بخادم Milvus
connections.connect("default", host="localhost", port="19530")
# تعريف مخطط المجموعة
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=d), # d = 384 from SBERT
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512)
]
schema = CollectionSchema(fields, "هذه مجموعة أمثلة للبحث الدلالي.")
# تعريف اسم المجموعة
collection_name = "semantic_search_collection"
# إذا كانت المجموعة موجودة بالفعل، فاحذفها (للتطوير)
if utility.has_collection(collection_name):
utility.drop_collection(collection_name)
# إنشاء المجموعة
collection = Collection(collection_name, schema)
# إعداد المتجهات والنص المرتبط بها
data = [
model.encode(s).tolist() for s in sentences
]
text_data = sentences
# إدخال البيانات في Milvus
mr = collection.insert([data, text_data])
# انتظار مزامنة البيانات في Milvus
collection.flush()
print("عدد المتجهات المضافة:", collection.num_entities)
# إنشاء فهرس (على سبيل المثال، IVFFlat)
index_params = {
"metric_type": "L2",
"index_type": "IVF_FLAT",
"params": {"nlist": 128}
}
collection.create_index(field_name="embedding", index_params=index_params)
# تحميل المجموعة إلى الذاكرة للبحث
collection.load()
# إعداد متجه الاستعلام
search_vector = model.encode("طرق تعلم الذكاء الاصطناعي").tolist()
# معلمات البحث
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
# إجراء البحث
results = collection.search(
data=[search_vector],
anns_field="embedding",
param=search_params,
limit=2, # استرداد أقرب نتيجتين
expr=None,
output_fields=["text"]
)
print("نتائج البحث:")
for hit in results[0]:
print(f"المسافة (L2): {hit.distance}, النص: {hit.entity.get('text')}")
# تحرير المجموعة من الذاكرة
collection.release()
في المثال أعلاه، رأينا كيفية إنشاء مجموعة بحث دلالي وإضافة المتجهات والاستعلام عنها باستخدام الميزات الأساسية لـ Milvus. يدعم Milvus أنواع فهارس مختلفة مثل FLAT و IVF_FLAT و HNSW، وبفضل بنيته الموزعة، يمكنه بسهولة إدارة أحمال البيانات والاستعلامات الكبيرة.
أفضل الممارسات
- بعد المتجه وجودته: يؤثر نموذج التضمين الذي تستخدمه، وبالتالي بعد المتجه، بشكل مباشر على دقة البحث والأداء. اختر النموذج وبعد المتجه الأنسب لتطبيقك.
- اختيار نوع الفهرس: يعد اختيار نوع فهرس Faiss أو Milvus الصحيح (مثل
IVFFlat،HNSW) أمرًا بالغ الأهمية بناءً على حجم بياناتك ومتطلبات الدقة/السرعة. - التصفية المسبقة: استخدم إمكانيات التصفية في قواعد بيانات المتجهات (مثل معلمة
exprفي Milvus) لتضييق نطاق عمليات البحث الدلالي بناءً على بيانات تعريف محددة. يزيد هذا من السرعة والصلة. - البحث المختلط: في بعض الأحيان، يقدم الجمع بين البحث بالكلمات المفتاحية والبحث الدلالي أفضل النتائج. يمكنك تطوير قدرات بحث مختلطة عن طريق دمج قواعد بيانات المتجهات مع محركات البحث التقليدية (مثل Elasticsearch).
- التحديثات والحذف: بالنسبة لمجموعات البيانات الديناميكية، افهم تمامًا واستخدم بفعالية آليات التحديث والحذف في قواعد بيانات المتجهات.
الخلاصة
تعتبر قواعد بيانات المتجهات أحد أحجار الزاوية في تطبيقات الذكاء الاصطناعي الحديثة. إنها توفر مجموعة واسعة من الأدوات، من الحلول المحلية مثل Faiss إلى الأنظمة الموزعة مثل Milvus، مما يمكّن المطورين من بناء أنظمة بحث وتوصية وتحليل بيانات قابلة للتطوير وذكية. باستخدام هذا الدليل العملي، تكون قد اتخذت الخطوة الأولى لتمكين قدرات البحث الدلالي الخاصة بك. استمر في استكشاف قوة قواعد بيانات المتجهات في تطبيقاتك!
التعليقات (0)
لا توجد تعليقات بعد. كن أول من يعلق!