في عصر الذكاء الاصطناعي التوليدي والبحث الدلالي، تعد القدرة على استرجاع التضمينات ذات الصلة من مجموعات البيانات الضخمة بكفاءة أمراً بالغ الأهمية. بينما أصبحت التمثيلات المتجهة الكثيفة معيارية في معالجة اللغات الطبيعية (NLP) ورؤية الحاسوب، فإن توسيع نطاق هذه الأنظمة ليشمل مليارات المتجهات يطرح تحديات كبيرة تتعلق بزمن الاستجابة واستهلاك الذاكرة. يظل FAISS (بحث التشابه في الذكاء الاصطناعي من فيسبوك) المكتبة المفضلة لهذا الغرض، لكن البحث بالقوة الغاشمة الجاهز للاستخدام غالباً ما يكون غير كافٍ للتطبيقات ذات المستوى الإنتاجي. يستكشف هذا المنشور ثلاث استراتيجيات مختلفة لتحسين الاسترجاع: فهارس الملفات المقلوبة (IVF)، ورسوم بيانية للعالم الصغير القابل للملاحة الهرمي (HNSW)، وحلول التخزين القائمة على DiskANN.
فهم مقايضات الأداء
قبل الغوص في التنفيذ، من الضروري فهم أن تحسين البحث عن المتجهات هو عملية موازنة بين الدقة (Recall)، وزمن الاستجابة (Latency)، واستهلاك الذاكرة. يضمن البحث بالقوة الغاشمة دقة بنسبة 100٪، لكنه يتوسع خطياً مع حجم مجموعة البيانات ($O(N)$)، مما يجعله غير عملي للأنظمة واسعة النطاق. تحاول تقنيات الفهرسة تقريب البحث عن الجيران الأقربين (ANN) لتحقيق تعقيد لوغاريتمي، مما يضحي بنسبة صغيرة من الدقة لتحقيق مكاسب هائلة في السرعة.
الاستراتيجية 1: IVF (فهرس الملفات المقلوبة) للكفاءة في استخدام الذاكرة
يقسم فهرس IVF فضاء المتجهات إلى $k$ عناقيد باستخدام خوارزمية k-means. أثناء عملية الفهرسة، يتم تعيين كل متجه إلى أقرب مركز عنقودي. في وقت البحث، يتم فحص أقرب المراكز العنقدية فقط إلى متجه الاستعلام. هذا يقلل من مساحة البحث من $N$ إلى $N/k$، مما يسرع الاسترجاع بشكل كبير.
يتميز IVF بكفاءة عالية في استخدام الذاكرة مقارنة بالطرق القائمة على الرسوم البيانية، ويوفر أداءً قابلاً للتنبؤ، على الرغم من أنه يتطلب ضبطاً دقيقاً لعدد العناقيد ($nlist$) ومعاملات الاستكشاف ($nprobe$).
import faiss
import numpy as np
# Create a flat index for comparison (Brute Force)
d = 128 # Dimensionality
nlist = 100 # Number of clusters
k = 5 # Number of nearest neighbors
# Initialize IVF index
quantizer = faiss.IndexFlatL2(d)
index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
# Train on a subset of data
train_data = np.random.random((10000, d)).astype('float32')
index.train(train_data)
# Add vectors
index.add(train_data)
# Search with controlled probes
nprobe = 10 # Number of clusters to search
index.nprobe = nprobe
الاستراتيجية 2: HNSW لزمن استجابة منخفض للغاية
في السيناريوهات حيث يكون زمن الاستجابة دون المللي ثانية أمراً حاسماً، مثل محركات التوصية في الوقت الفعلي، غالباً ما يكون HNSW هو الخيار الأفضل. يبني HNSW بنية رسومية متعددة الطبقات حيث تمثل العقد المتجهات. توفر الطبقات العليا "مساراً سريعاً" للملاحة على المدى الطويل، بينما تقوم الطبقات السفلى بتحسين البحث محلياً.
الميزة الرئيسية لـ HNSW هي دقته العالية عند زمن استجابة منخفض. ومع ذلك، فإنه يأتي مع بصمة ذاكرة أعلى بسبب تخزين اتصالات الرسم البياني، وهو أكثر تكلفة من الناحية الحسابية أثناء مرحلة بناء الفهرس.
# Note: FAISS HNSW implementation is available in recent versions
# or via the faiss.contrib package
# HNSW index construction
M = 16 # Number of bi-directional links created for every new element
maxM = 16
efConstruction = 200 # Quality parameter
index_hnsw = faiss.IndexHNSWFlat(d, M, faiss.METRIC_L2)
index_hnsw.hnsw.efConstruction = efConstruction
index_hnsw.hnsw.M = M
# Build index (can be slow for large datasets)
index_hnsw.add(train_data)
# Query configuration
ef_search = 50 # Dynamic list size for searching
index_hnsw.hnsw.efSearch = ef_search
الاستراتيجية 3: DiskANN للنطاق الملياري
عندما تتجاوز أحجام مجموعات البيانات الذاكرة العشوائية المتاحة (RAM)، تفشل الفهارس التقليدية التي تعمل في الذاكرة مثل IVF و HNSW. هنا يبرز DiskANN (تسريع الأقراص للجيران الأقربين). يستفيد DiskANN من سرعة الوصول العشوائي لأقراص SSD الحديثة لتخزين الهياكل الرسومية على القرص مع الاحتفاظ ببيانات التعريف الحرجة فقط في الذاكرة. يستخدم نهج بحث مكون من مرحلتين: بحث خشن لتحديد كتل مرشحة على القرص، يليه بحث دقيق داخل تلك الكتل.
على الرغم من أن دمج DiskANN مباشرة مع FAISS يتطلب عمليات بناء متخصصة أو أغلفة برمجية، فإن هذه الاستراتيجية حيوية لقواعد بيانات المتجهات على مستوى المؤسسات التي تتعامل مع بيتابايت من بيانات التضمين.
الخاتمة
لا يعد تحسين FAISS حلاً يناسب الجميع. بالنسبة للتطبيقات العامة ذات قيود الذاكرة المعتدلة، يوفر IVF توازناً متيناً بين السرعة واستخدام الذاكرة. للمتطلبات عالية الأداء حيث يكون زمن الاستجابة هو الاختناق، يوفر HNSW نسب دقة إلى زمن استجابة متفوقة. وأخيراً، لمجموعات البيانات الضخمة التي لا تتسع للذاكرة العشوائية، يعد اعتماد بنية DiskANN أمراً ضرورياً. من خلال فهم مقايضات كل استراتيجية، يمكن للمطورين بناء أنظمة استرجاع تضمينات قابلة للتوسع وفعالة تدعم الجيل القادم من تطبيقات الذكاء الاصطناعي.