• نبذة عن ميلفوس
  • ابدأ الآن
  • المفاهيم
  • دليل المستخدم
  • استيراد البيانات
  • أدوات الذكاء الاصطناعي
  • دليل الإدارة
  • الأدوات
  • عمليات الدمج
  • البرامج التعليمية
  • الأسئلة الشائعة
  • API Reference

HNSW_PRQ

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

نظرة عامة

يجمع HNSW_PRQ بين تقنيتين للفهرسة: HSNW للتنقل السريع القائم على الرسم البياني و PRQ لضغط المتجهات بكفاءة.

HNSW

ينشئ HNSW رسمًا بيانيًا متعدد الطبقات حيث تتوافق كل عقدة مع متجه في مجموعة البيانات. في هذا الرسم البياني، ترتبط العُقد في هذا الرسم البياني بناءً على تشابهها، مما يتيح التنقل السريع عبر فضاء البيانات. يسمح الهيكل الهرمي لخوارزمية البحث بتضييق نطاق الجيران المرشحين، مما يسرّع عملية البحث بشكل كبير في المساحات عالية الأبعاد.

لمزيد من المعلومات، راجع HNSW.

PRQ

PRQ هو نهج ضغط متجه متعدد المراحل يجمع بين تقنيتين متكاملتين: PQ وRQ. من خلال تقسيم متجه عالي الأبعاد أولاً إلى متجهات فرعية أصغر (عن طريق PQ) ثم تكميم أي فرق متبقٍ (عن طريق RQ)، يحقق PRQ تمثيلًا مضغوطًا ودقيقًا في الوقت نفسه للبيانات الأصلية.

يوضح الشكل التالي كيفية عمله.

Hnsw Prq Hnsw Prq

  1. تكميم المنتج (PQ)

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

  2. التكميم الكمي المتبقي (RQ)

    بعد مرحلة PQ، تقوم RQ بتقدير الكمية المتبقية - الفرق بين المتجه الأصلي وتقريبه القائم على PQ - باستخدام دفاتر رموز إضافية. ولأن هذا المتبقي عادةً ما يكون أصغر بكثير، يمكن ترميزه بدقة أكبر دون زيادة كبيرة في التخزين.

    وتحدد المعلمة nrq عدد المرات التي يتم فيها تكميم هذا المتبقي بشكل متكرر، مما يسمح لك بضبط التوازن بين كفاءة الضغط والدقة.

  3. تمثيل الضغط النهائي

    بمجرد انتهاء RQ من تكميم المتبقي، يتم دمج الرموز الصحيحة من كل من PQ و RQ في فهرس مضغوط واحد. من خلال التقاط التفاصيل الدقيقة التي قد يفوتها PQ وحده، يعزز RQ الدقة دون التسبب في زيادة كبيرة في التخزين. هذا التآزر بين PQ وRQ هو ما يميز PRQ.

HNSW + PRQ

من خلال الجمع بين HNSW و PRQ، يحتفظ HNSW_PRQ بالبحث السريع القائم على الرسم البياني ل HNSW مع الاستفادة من الضغط متعدد المراحل ل PRQ. يبدو سير العمل كما يلي:

  1. ضغط البيانات: يتم تحويل كل متجه أولاً عن طريق PQ إلى تمثيل خشن، ثم يتم تكميم البقايا من خلال RQ لمزيد من التنقيح. والنتيجة هي مجموعة من الرموز المدمجة التي تمثل كل متجه.

  2. بناء الرسم البياني: تشكل المتجهات المضغوطة (بما في ذلك كل من رموز PQ وRQ) الأساس لبناء الرسم البياني HNSW. ولأن البيانات يتم تخزينها في شكل مضغوط، يتطلب الرسم البياني ذاكرة أقل، ويتم تسريع عملية التنقل من خلاله.

  3. استرجاع المرشح: أثناء البحث، يستخدم HNSW التمثيلات المضغوطة لاجتياز الرسم البياني واسترجاع مجموعة من المرشحين. وهذا يقلل بشكل كبير من عدد المتجهات التي تحتاج إلى النظر فيها.

  4. (اختياري) تنقيح النتائج: يمكن تنقيح النتائج الأولية المرشحة للحصول على دقة أفضل، بناءً على المعلمات التالية:

    • refine: يتحكم فيما إذا كانت خطوة التنقيح هذه مفعلة أم لا. عند ضبطها على true ، يقوم النظام بإعادة حساب المسافات باستخدام تمثيلات عالية الدقة أو غير مضغوطة.

    • refine_type: يحدد مستوى دقة البيانات المستخدمة أثناء التنقيح (على سبيل المثال، SQ6 أو SQ8 أو BF16). يمكن أن يؤدي الاختيار ذو الدقة الأعلى مثل FP32 إلى نتائج أكثر دقة ولكنه يتطلب المزيد من الذاكرة. يجب أن يتجاوز هذا دقة مجموعة البيانات المضغوطة الأصلية sq_type.

    • refine_k: يعمل كعامل تكبير. على سبيل المثال، إذا كان أعلى k هو 100 و refine_k هو 2، فإن النظام يعيد ترتيب أفضل 200 مرشح ويعيد أفضل 100 مرشح، مما يعزز الدقة الإجمالية.

للحصول على قائمة كاملة بالمعلمات والقيم الصالحة، راجع بارامز الفهرس.

إنشاء فهرس

لإنشاء فهرس HNSW_PRQ على حقل متجه في ميلفوس، استخدم طريقة add_index() ، مع تحديد index_type و metric_type ومعلمات إضافية للفهرس.

from pymilvus import MilvusClient

# Prepare index building params
index_params = MilvusClient.prepare_index_params()

index_params.add_index(
    field_name="your_vector_field_name", # Name of the vector field to be indexed
    index_type="HNSW_PRQ", # Type of the index to create
    index_name="vector_index", # Name of the index to create
    metric_type="L2", # Metric type used to measure similarity
    params={
        "M": 30, # Maximum number of neighbors each node can connect to in the graph
        "efConstruction": 360, # Number of candidate neighbors considered for connection during index construction
        "m": 384, 
        "nbits": 8,
        "nrq": 1,
        "refine": true, # Whether to enable the refinement step
        "refine_type": "SQ8" # Precision level of data used for refinement
    } # Index building params
)

في هذا التكوين

  • index_type: نوع الفهرس المراد إنشاؤه. في هذا المثال، اضبط القيمة على HNSW_PQ.

  • metric_type: الطريقة المستخدمة لحساب المسافة بين المتجهات. تتضمن القيم المدعومة COSINE و L2 و IP. لمزيد من التفاصيل، راجع أنواع المقاييس.

  • params: خيارات التكوين الإضافية لبناء الفهرس. لمزيد من التفاصيل، راجع بارامترات بناء الفهرس.

بمجرد تكوين معلمات الفهرس، يمكنك إنشاء الفهرس باستخدام الأسلوب create_index() مباشرةً أو تمرير بارامترات الفهرس في الأسلوب create_collection. لمزيد من التفاصيل، راجع إنشاء مجموعة.

البحث في الفهرس

بمجرد إنشاء الفهرس وإدراج الكيانات، يمكنك إجراء عمليات بحث عن التشابه على الفهرس.

search_params = {
    "params": {
        "ef": 10, # Parameter controlling query time/accuracy trade-off
        "refine_k": 1 # The magnification factor
    }
}

res = MilvusClient.search(
    collection_name="your_collection_name", # Collection name
    anns_field="vector_field",  # Vector field name
    data=[[0.1, 0.2, 0.3, 0.4, 0.5]],  # Query vector
    limit=3,  # TopK results to return
    search_params=search_params
)

في هذا التكوين

باراميز الفهرس

يقدم هذا القسم نظرة عامة على المعلمات المستخدمة لبناء الفهرس وإجراء عمليات البحث على الفهرس.

معلمات بناء الفهرس

يسرد الجدول التالي المعلمات التي يمكن تكوينها في params عند إنشاء فهرس.

المعلمة

الوصف

نطاق القيمة

اقتراح الضبط

HNSW

M

الحد الأقصى لعدد الوصلات (أو الحواف) التي يمكن أن تحتويها كل عقدة في الرسم البياني، بما في ذلك الحواف الصادرة والواردة. تؤثر هذه المعلمة بشكل مباشر على كل من بناء الفهرس والبحث.

النوع: عدد صحيح المدى: [2, 2048]

القيمة الافتراضية: 30 (حتى 30 حافة صادرة و30 حافة واردة لكل عقدة)

يؤدي وجود M أكبر بشكل عام إلى دقة أعلى ولكنه يزيد من عبء الذاكرة ويبطئ بناء الفهرس والبحث. ضع في اعتبارك زيادة M لمجموعات البيانات ذات الأبعاد العالية أو عندما يكون الاستدعاء العالي أمرًا بالغ الأهمية.

ضع في اعتبارك تقليل M عندما يكون استخدام الذاكرة وسرعة البحث من الاهتمامات الأساسية.

في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [5, 100].

efConstruction

عدد الجيران المرشحين الذين تم أخذهم في الاعتبار للاتصال أثناء إنشاء الفهرس. يتم تقييم مجموعة أكبر من المرشحين لكل عنصر جديد، ولكن يظل الحد الأقصى لعدد الاتصالات التي تم إنشاؤها بالفعل محدودًا بـ M.

النوع: عدد صحيح المدى: [1، int_max]

القيمة الافتراضية: 360

يؤدي ارتفاع efConstruction عادةً إلى فهرس أكثر دقة، حيث يتم استكشاف المزيد من الاتصالات المحتملة. ومع ذلك، فإن هذا يؤدي أيضًا إلى وقت فهرسة أطول وزيادة استخدام الذاكرة أثناء الإنشاء. ضع في اعتبارك زيادة efConstruction لتحسين الدقة، خاصة في السيناريوهات التي يكون فيها وقت الفهرسة أقل أهمية.

فكر في تقليل efConstruction لتسريع بناء الفهرس عندما تكون قيود الموارد مصدر قلق.

في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [50, 500].

PRQ

m

عدد المتجهات الفرعية (المستخدمة في التكميم) لتقسيم كل متجه عالي الأبعاد إلى متجهات عالية الأبعاد أثناء عملية التكميم.

النوع: عدد صحيح المدى: [1, 65536]

القيمة الافتراضية: لا يوجد

يمكن لقيمة m الأعلى أن تحسن الدقة، لكنها تزيد أيضًا من التعقيد الحسابي واستخدام الذاكرة. m يجب أن تكون القيمة قاسماً على بُعد المتجه(D) لضمان التحلل الصحيح. القيمة الموصى بها عادةً هي m = D/2.

في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [D/8، D].

nbits

عدد البتات المستخدمة لتمثيل فهرس مركزية كل متجه فرعي في النموذج المضغوط. وهو يحدد مباشرةً حجم كل دفتر شفرات. سيحتوي كل دفتر شفرات على 2 بت من النقطتين المركزيتين. على سبيل المثال، إذا تم ضبط nbits على 8، فسيتم تمثيل كل متجه فرعي بفهرس مركزية مكون من 8 بت. وهذا يسمح بوجود28 (256) مركزاً محتملاً في دفتر الرموز لهذا المتجه الفرعي.

النوع: عدد صحيح المدى: [1, 24]

القيمة الافتراضية: 8

تسمح القيمة الأعلى nbits بوجود دفاتر رموز أكبر، مما قد يؤدي إلى تمثيل أكثر دقة للمتجهات الأصلية. ومع ذلك، فإن ذلك يعني أيضًا استخدام المزيد من البتات لتخزين كل فهرس، مما يؤدي إلى ضغط أقل. في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [1, 16].

nrq

يتحكم في عدد المعادلات الفرعية المتبقية المستخدمة في مرحلة RQ. من المحتمل أن يحقق المزيد من المعادلات الفرعية ضغطًا أكبر ولكن قد يؤدي إلى فقدان المزيد من المعلومات.

النوع: عدد صحيح المدى: [1, 16]

القيمة الافتراضية: 2

تسمح القيمة الأعلى nrq بخطوات تكنيز فرعي إضافية متبقية، مما قد يؤدي إلى إعادة بناء أكثر دقة للمتجهات الأصلية. ومع ذلك، فإن ذلك يعني أيضًا تخزين وحساب المزيد من التكافؤات الفرعية مما يؤدي إلى حجم فهرس أكبر ونفقات حسابية أكبر.

refine

علامة منطقية تتحكم فيما إذا كان يتم تطبيق خطوة تنقيح أثناء البحث. تتضمن عملية التنقيح إعادة ترتيب النتائج الأولية عن طريق حساب المسافات الدقيقة بين متجه الاستعلام والمرشحين.

النوع: نطاق منطقي: [true ، false]

القيمة الافتراضية: false

اضبط على true إذا كانت الدقة العالية ضرورية ويمكنك تحمل أوقات بحث أبطأ قليلاً. استخدم false إذا كانت السرعة أولوية وكان التنازل البسيط في الدقة مقبولاً.

refine_type

يحدد دقة البيانات المستخدمة أثناء عملية التنقيح. يجب أن تكون هذه الدقة أعلى من دقة المتجهات المضغوطة (كما تم تعيينها بواسطة المعلمات m و nbits ).

النوع: سلسلة النطاق: [ SQ6 ، SQ8 ، ، BF16 ، FP16 ، FP32 ]

القيمة الافتراضية: لا يوجد

استخدم FP32 للحصول على أقصى قدر من الدقة بتكلفة ذاكرة أعلى، أو SQ6/SQ8 للحصول على ضغط أفضل. BF16 و FP16 يقدمان بديلاً متوازنًا.

بارامترات البحث الخاصة بالفهرس

يسرد الجدول التالي المعلمات التي يمكن تكوينها في search_params.params عند البحث في الفهرس.

المعلمة

الوصف

نطاق القيمة

اقتراح الضبط

HNSW

ef

يتحكم في اتساع نطاق البحث أثناء استرجاع أقرب جار. وهي تحدد عدد العقد التي تتم زيارتها وتقييمها كأقرب جيران محتملين. تؤثر هذه المعلمة على عملية البحث فقط وتطبق حصرياً على الطبقة السفلية من الرسم البياني.

النوع: عدد صحيح المدى: [1، int_max]

القيمة الافتراضية: الحد (أقرب عدد من الجيران الأقرب إلى أقرب جيران للإرجاع)

يؤدي وجود ef أكبر بشكل عام إلى دقة بحث أعلى حيث يتم النظر في المزيد من الجيران المحتملين. ومع ذلك، فإن هذا يزيد أيضًا من وقت البحث. ضع في اعتبارك زيادة ef عندما يكون تحقيق استرجاع عالٍ أمرًا بالغ الأهمية وتكون سرعة البحث أقل أهمية.

ضع في اعتبارك تقليل ef لإعطاء الأولوية لعمليات البحث الأسرع، خاصةً في السيناريوهات التي يكون فيها الانخفاض الطفيف في الدقة مقبولاً.

في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [K, 10K].

PRQ

refine_k

عامل التكبير الذي يتحكم في عدد المرشحين الإضافيين الذين يتم فحصهم أثناء مرحلة التنقيح (إعادة الترتيب)، بالنسبة لأعلى النتائج K المطلوبة.

النوع: عائم المدى: [1, float_max)

القيمة الافتراضية: 1

يمكن أن تؤدي القيم الأعلى ل refine_k إلى تحسين الاستدعاء والدقة ولكنها ستزيد أيضًا من وقت البحث واستخدام الموارد. تعني القيمة 1 أن عملية التنقيح تأخذ في الاعتبار أفضل النتائج الأولية K فقط.

جرب Managed Milvus مجاناً

Zilliz Cloud خالي من المتاعب، ويعمل بواسطة Milvus ويعمل بسرعة 10 أضعاف.

ابدأ
التعليقات

هل كانت هذه الصفحة مفيدة؟