Vector Databases

فهرسة الحمولة في Qdrant: تحسين البحث المتجهي المفلتر للبيانات الوصفية عالية التنوع

مع انتقال قواعد البيانات المتجهية من المطابقة البسيطة إلى خطوط أنابيب توليد المعزز بالاسترجاع (RAG) المعقدة، أصبحت القدرة على تصفية المتجهات بكفاءة بناءً على البيانات الوصفية عنق زجاجي حاسم. يواجه العديد من المطورين تدهور الأداء عند الاستعلام عن Qdrant باستخدام فلاتر صارمة على حقول عالية التنوع، مثل معرّفات المستخدمين، أو الطوابع الزمنية، أو وسوم المستندات المحددة. على الرغم من أن Qdrant مصممة للسرعة، إلا أن الجمع بين البحث المتجهي الخام والتصفية غير المحسنة يمكن أن يؤدي إلى استجابات استعلام بطيئة وتكاليف حسابية غير ضرورية. المفتاح لفتح البحث المفلتر عالي الإنتاجية ومنخفض الكمون يكمن في فهم واستغلال فهرسة الحمولة.

لماذا تبطئ التصفية عالية التنوع البحث؟

بشكل افتراضي، يقوم Qdrant بأداء البحث في تشابه المتجهات أولاً ثم يطبق فلاتر الحمولة على المرشحين الناتجين. هذا النهج "ابحث ثم صفِّ" فعال للحقول منخفضة التنوع (مثل الأعلام المنطقية أو مجموعات صغيرة من الفئات) لأن التصفية تستبعد جزءًا صغيرًا من النتائج. ومع ذلك، بالنسبة للحقول عالية التنوع - حيث قد تطابق التصفية جزءًا ضئيلًا فقط من مجموعة البيانات بأكملها، أو حيث يحتوي الحقل على ملايين القيم الفريدة - يجب على النظام مسح المزيد من المتجهات للعثور على ما يكفي منها لتلبية المعايير.

بدون فهرس، يجب على Qdrant فحص حمولة كل متجه يدخل في مجموعة المرشحين Top-K لتحديد ما إذا كان يلبي شروط التصفية. إذا كانت تصفيتك مقيدة (مثلاً، user_id == 12345 في مجموعة بيانات تحتوي على 10 ملايين متجه)، فقد يحتاج النظام إلى استرجاع آلاف المتجهات فقط للعثور على حفنة منها تكون متشابهة ومرتبطة في نفس الوقت. يؤدي هذا إلى تكاليف إدخال/إخراج عالية وكمون متزايد.

قوة فهارس الحمولة

تسمح فهارس الحمولة لـ Qdrant بحساب مسبق وتخزين هياكل بيانات فعالة لحقول البيانات الوصفية المحددة. عند إنشاء فهرس لحقل، يمكن لـ Qdrant عكس منطق البحث. بدلاً من "اعثر على المتجهات المتشابهة، ثم تحقق مما إذا كانت تطابق التصفية"، يمكنها بشكل فعال "اعثر على المتجهات التي تطابق التصفية، ثم تحقق من التشابه داخل تلك المجموعة الفرعية".

للحقول عالية التنوع، يستخدم Qdrant أنواع الفهارس INTEGER أو KEYWORD أو DATETIME. تتيح هذه الفهارس للمحرك تحديد موقع المجموعة الفرعية من المتجهات التي تحقق الشرط بسرعة، مما يقلل بشكل كبير من مساحة البحث قبل بدء العمل الشاق المتمثل في حساب تشابه المتجهات.

إنشاء فهرس في Qdrant

إنشاء فهرس الحمولة أمر بسيط عبر واجهة برمجة تطبيقات Qdrant. إليك كيفية فهرسة حقل user_id عالي التنوع في مجموعة اسمها docs:

import qdrant_client

client = qdrant_client.QdrantClient(host="localhost", port=6333)

# Create an index for the 'user_id' field
# Use 'integer' for numeric IDs, 'keyword' for strings
client.create_payload_index(
    collection_name="docs",
    field_name="user_id",
    field_schema="integer"
)

# For string-based high-cardinality fields, use keyword
client.create_payload_index(
    collection_name="docs",
    field_name="document_hash",
    field_schema="keyword"
)

أفضل الممارسات للحقول عالية التنوع

لا تتطلب جميع الحقول نفس استراتيجية الفهرسة. ضع في اعتبارك أفضل الممارسات التالية:

  • تحديد التنوع: قبل الفهرسة، قَدّر عدد القيم الفريدة. إذا كان الحقل منخفض التنوع (مثلاً، "status": ["active", "inactive"]), فغالباً ما تكون تصفية الحمولة القياسية كافية وأسرع بسبب تكاليف صيانة الفهرس المنخفضة. احجز فهارس الحمولة للحقول التي تحتوي على آلاف أو ملايين القيم الفريدة.
  • استخدام نوع المخطط الصحيح: حدد دائماً field_schema الصحيح. استخدام keyword للنصوص الطويلة أو السلاسل غير المهيكلة سيؤدي إلى أداء ضعيف. استخدم integer أو float للبيانات الرقمية وdatetime للتصفية السلاسل الزمنية.
  • مراقبة حجم الفهرس: تستهلك فهارس الحمولة مساحة تخزين إضافية. للمجموعات الكبيرة جداً التي تحتوي على العديد من الحقول عالية التنوع، راقب حجم الفهرس الإجمالي للتأكد من أنه يظل قابلاً للإدارة مقارنة ببنيتك التحتية.
  • الدمج مع المتجهات المتناثرة: في أنظمة RAG المعقدة، يمكن أن يتفوق أحياناً الجمع بين البحث المتجهي الكثيف والبحث المتجهي المتناثر (لمطابقة الكلمات الرئيسية) وتصفية الحمولة على النهج الكثيف + التصفية البحت، خاصة عندما تكون التصفية مقيدة للغاية.

مثال عملي: التصفية حسب المستخدم والوقت

تخيل ذكاء اصطناعي لدعم العملاء يخزن متجهات سجلات الدردشة. تحتاج إلى استرجاع تفاعلات الماضي الخمس الأكثر تشابهاً لـ معرّف المستخدم 999 التي حدثت في آخر 7 أيام.

بدون فهارس، سيقوم Qdrant بالبحث عن متجهات متشابهة عالمياً ثم تصفيتها واحدة تلو الأخرى. مع وجود فهارس على user_id (عدد صحيح) وtimestamp (تاريخ ووقت)، يمكن لـ Qdrant أولاً تضييق نطاق البحث إلى المتجهات التابعة للمستخدم 999 فقط التي تقع ضمن النطاق الزمني، ثم تنفيذ ترتيب التشابه فقط على تلك المجموعة المصغرة.

from qdrant_client import models
import time

# Define the filter condition
filter_query = models.Filter(
    must=[
        models.FieldCondition(
            key="user_id",
            match=models.MatchValue(value=999)
        ),
        models.FieldCondition(
            key="timestamp",
            range=models.Range(
                gte=time.time() - (7 * 24 * 60 * 60), # 7 days ago
                lte=time.time()
            )
        )
    ]
)

# Execute search
results = client.search(
    collection_name="chat_history",
    query_vector=[0.1, 0.2, 0.3, ...], # Your embedding
    query_filter=filter_query,
    limit=5
)

# Results are now guaranteed to be both similar and filtered
for point in results:
    print(f"Score: {point.score}, ID: {point.id}")

الخلاصة

تحسين البحث المتجهي المفلتر في Qdrant لا يتعلق فقط بكتابة الاستعلام الصحيح؛ بل يتعلق بتحضير هيكل البيانات لدعم ذلك الاستعلام بكفاءة. من خلال تحديد حقول البيانات الوصفية عالية التنوع وتطبيق فهارس الحمولة المناسبة، تحول عمليات المسح الشاملة البطيئة المحتملة إلى عمليات بحث مستهدفة وسريعة. بالنسبة للمطورين من المستوى المتوسط إلى المتقدم الذين يبنيون أنظمة RAG بمستوى الإنتاج، فإن إتقان فهرسة الحمولة أمر أساسي لتقديم تجارب استرجاع دقيقة ومنخفضة الكمون على نطاق واسع. قم دائماً بتحليل أداء استعلاماتك مع الفهارس وبدونها لفهم الأثر، وتذكر أن الهدف هو تقليل مساحة البحث قبل بدء حساب تشابه المتجهات.

Share: