تكوين التكميم المتجه والتخزين المنخفض للخطوط المتجهة الأصغر في Azure الذكاء الاصطناعي Search

هام

هذه الميزات في المعاينة العامة ضمن شروط الاستخدام التكميلية. توفر واجهة برمجة تطبيقات REST 2024-03-01-Preview أنواع البيانات الجديدة وخصائص ضغط المتجهات والخاصية stored .

توضح هذه المقالة التكميم المتجه والتقنيات الأخرى لضغط فهارس المتجهات في Azure الذكاء الاصطناعي Search.

تقييم الخيارات

كخطوة أولى، راجع الخيارات الثلاثة لتقليل كمية التخزين المستخدمة من قبل حقول المتجهات. هذه الخيارات ليست حصرية بشكل متبادل.

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

النهج لماذا تستخدم هذا الخيار
تعيين أنواع بيانات بدائية أصغر لحقول المتجهات تستهلك أنواع البيانات الضيقة، مثل Float16و Int16و و Int8مساحة أقل في الذاكرة وعلى القرص، ولكن يجب أن يكون لديك نموذج تضمين يقوم بإخراج المتجهات بتنسيق بيانات ضيق. أو، يجب أن يكون لديك منطق تحديد كمي مخصص يقوم إخراج بيانات صغيرة. حالة استخدام ثالثة تتطلب جهدا أقل هي إعادة صياغة التضمينات الأصلية Float32 التي تنتجها معظم النماذج إلى Float16.
إزالة التخزين الاختياري للخطوط المتجهة القابلة للاسترداد يتم تخزين المتجهات التي يتم إرجاعها في استجابة استعلام بشكل منفصل عن المتجهات المستخدمة أثناء تنفيذ الاستعلام. إذا لم تكن بحاجة إلى إرجاع المتجهات، يمكنك إيقاف تشغيل التخزين القابل للاسترداد، ما يقلل إجمالي تخزين القرص لكل حقل بنسبة تصل إلى 50 بالمائة.
إضافة التكميم العددي استخدم التكميم العددي المضمن لضغط التضمينات الأصلية Float32 إلى Int8. يقلل هذا الخيار من التخزين في الذاكرة وعلى القرص دون أي تدهور في أداء الاستعلام. تنتج أنواع البيانات الأصغر مثل Int8 فهارس المتجهات الأقل ثراء من تلك التي تحتوي Float32 على تضمينات. لإزاحة فقدان المعلومات، يتضمن الضغط المضمن خيارات لمعالجة ما بعد الاستعلام باستخدام عمليات التضمين غير المضغوطة والطوابع الزائدة لإرجاع نتائج أكثر صلة. تعد إعادة النشر والطوابع الزائدة ميزات محددة للتكميم Float32 العددي المضمن للحولات أو ولا Float16 يمكن استخدامها في التضمينات التي تخضع لتكميم مخصص.

يتم تعريف كل هذه الخيارات على فهرس فارغ. لتنفيذ أي منها، استخدم مدخل Microsoft Azure أو واجهات برمجة تطبيقات REST 2024-03-01-preview أو حزمة Azure SDK بيتا.

بعد تعريف الفهرس، يمكنك تحميل المستندات وفهرستها كخطوة منفصلة.

الخيار 1: تعيين أنواع بيانات ضيقة لحقول المتجهات

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

باستخدام واجهات برمجة التطبيقات المعاينة، يمكنك تعيين أنواع بيانات بدائية ضيقة لتقليل متطلبات التخزين لحقول المتجهات.

  1. راجع أنواع البيانات لحقول المتجهات:

    • Collection(Edm.Single) نقطة عائمة 32 بت (افتراضي)
    • Collection(Edm.Half) نقطة عائمة 16 بت
    • Collection(Edm.Int16) عدد صحيح موقع 16 بت
    • Collection(Edm.SByte) عدد صحيح موقع 8 بت

    إشعار

    أنواع البيانات الثنائية غير مدعومة حاليا.

  2. اختر نوع بيانات صالحا لإخراج نموذج التضمين، أو للخطوط المتجهة التي تخضع لتكميم مخصص.

    تقوم معظم نماذج التضمين بإخراج أرقام النقطة العائمة 32 بت، ولكن إذا قمت بتطبيق التكميم المخصص، فقد يكون Int16 الإخراج الخاص بك أو Int8. يمكنك الآن تعريف حقول المتجهات التي تقبل التنسيق الأصغر.

    تحتوي نماذج تضمين النص على تنسيق إخراج أصلي من Float32، والذي يتم تعيينه إلى Collection(Edm.Single) في Azure الذكاء الاصطناعي Search. لا يمكنك تعيين هذا الإخراج إلى Int8 لأن التحويل من float إلى int محظور. ومع ذلك، يمكنك التحويل من Float32 إلى Float16 (أو Collection(Edm.Half))، وهذه طريقة سهلة لاستخدام أنواع البيانات الضيقة دون عمل إضافي.

    يوفر الجدول التالي ارتباطات إلى العديد من نماذج التضمين التي تستخدم أنواع البيانات الضيقة.

    نموذج التضمين الإخراج الأصلي أنواع صالحة في Azure الذكاء الاصطناعي Search
    text-embedding-ada-002 Float32 Collection(Edm.Single) أو Collection(Edm.Half)
    text-embedding-3-small Float32 Collection(Edm.Single) أو Collection(Edm.Half)
    تضمين نص-3-كبير Float32 Collection(Edm.Single) أو Collection(Edm.Half)
    تضمين نماذج Cohere V3 مع int8 embedding_type Int8 Collection(Edm.SByte)
  3. تأكد من فهم المقايضات لنوع بيانات ضيق. Collection(Edm.Half) يحتوي على معلومات أقل، ما يؤدي إلى دقة أقل. إذا كانت بياناتك متجانسة أو كثيفة، فقد يؤدي فقدان تفاصيل إضافية أو الفروق الدقيقة إلى نتائج غير مقبولة في وقت الاستعلام لأن هناك تفاصيل أقل يمكن استخدامها لتمييز الخطوط المتجهة القريبة عن بعضها البعض.

  4. حدد الفهرس وأنشئه. يمكنك استخدام مدخل Microsoft Azure أو معاينة 2024-03-01 أو حزمة Azure SDK بيتا لهذه الخطوة.

  5. تحقق من النتائج. بافتراض وضع علامة على الحقل المتجه على أنه قابل للاسترداد، استخدم مستكشف البحث أو واجهة برمجة تطبيقات REST للتحقق من تطابق محتوى الحقل مع نوع البيانات. تأكد من استخدام إصدار API الصحيح 2024-03-01-preview للاستعلام، وإلا فلن تظهر الخصائص الجديدة.

للتحقق من حجم فهرس المتجه، استخدم مدخل Microsoft Azure أو معاينة 2024-03-01.

إشعار

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

الخيار 2: تعيين الخاصية لإزالة stored التخزين القابل للاسترداد

stored الخاصية هي قيمة منطقية جديدة على تعريف حقل متجه يحدد ما إذا كان يتم تخصيص التخزين لمحتوى حقل المتجه القابل للاسترداد. إذا لم تكن بحاجة إلى محتوى متجه في استجابة استعلام، يمكنك حفظ مساحة تخزين تصل إلى 50 بالمائة لكل حقل عن طريق الإعداد stored إلى خطأ.

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

يوضح المثال التالي مجموعة الحقول الخاصة بفهرس البحث. اضبط stored على false لإزالة التخزين القابل للاسترداد لحقل المتجه بشكل دائم.

PUT https://[service-name].search.windows.net/indexes/[index-name]?api-version=2024-03-01-preview  
   Content-Type: application/json  
   api-key: [admin key]  
 
     { 
       "name": "myindex", 
       "fields": [ 
         { 
           "name": "myvector", 
           "type": "Collection(Edm.Single)", 
           "retrievable": false, 
           "stored": false, 
           "dimensions": 1536, 
           "vectorSearchProfile": "vectorProfile" 
         } 
       ] 
     } 

النقاط الرئيسية:

  • ينطبق على حقول المتجهات فقط.

  • يؤثر على التخزين على القرص، وليس الذاكرة، وليس له أي تأثير على الاستعلامات. يستخدم تنفيذ الاستعلام فهرس متجه منفصل لا تتأثر به الخاصية stored .

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

  • يتم stored تعيين الإعدادات الافتراضية إلى true وتعيينها retrievable إلى false. في التكوين الافتراضي، يتم تخزين نسخة قابلة للاسترداد، ولكن لا يتم إرجاعها تلقائيا في النتائج. عندما stored يكون صحيحا، يمكنك التبديل retrievable بين صواب وخطأ في أي وقت دون الحاجة إلى إعادة إنشاء فهرس. عندما stored يكون خطأ، retrievable يجب أن يكون خطأ ولا يمكن تغييره.

الخيار 3: تكوين التكميم العددي

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

لاستخدام ضغط المتجهات المضمن:

  • إضافة vectorSearch.compressions إلى فهرس بحث. خوارزمية الضغط المدعومة في هذه المعاينة هي التكميم العددي.
  • تعيين خصائص اختيارية للتخفيف من تأثيرات الفهرسة الضياع. يوفر كل من rerankWithOriginalVectors و defaultOversampling تحسينات أثناء تنفيذ الاستعلام.
  • إضافة vectorSearch.profiles.compression إلى ملف تعريف متجه جديد.
  • تعيين ملف تعريف المتجه الجديد إلى حقل متجه جديد.

إضافة إعدادات الضغط وتعيين خصائص اختيارية

في تعريف فهرس تم إنشاؤه باستخدام واجهة برمجة تطبيقات REST 2024-03-01-preview، أضف قسما compressions . استخدم JSON التالي كقالب.

"compressions": [

      {  
        "name": "my-scalar-quantization",  
        "kind": "scalarQuantization",  
        "rerankWithOriginalVectors": true,  (optional)
        "defaultOversampling": 10.0,  (optional)
        "scalarQuantizationParameters": {  (optional)
             "quantizedDataType": "int8",  (optional)
        }
      }  
   ]

النقاط الرئيسية:

  • kind يجب تعيين إلى scalarQuantization. هذا هو أسلوب التكميم الوحيد المعتمد في هذا الوقت.

  • rerankWithOriginalVectors يستخدم المتجهات الأصلية غير المضغوطة لإعادة حساب التشابه وإعادة ترتيب أفضل النتائج التي تم إرجاعها بواسطة استعلام البحث الأولي. توجد المتجهات غير المضغوطة في فهرس البحث حتى لو كانت stored خاطئة. هذه الخاصية اختيارية. الوضع الافتراضي صحيح.

  • defaultOversampling النظر في مجموعة أوسع من النتائج المحتملة لإزاحة الانخفاض في المعلومات من التكميم. تتكون صيغة النتائج المحتملة من k في الاستعلام، مع مضاعف طوابع زائدة. على سبيل المثال، إذا حدد k الاستعلام 5، وكان الطابع الزائد هو 20، فسيطلب الاستعلام بشكل فعال 100 مستند للاستخدام في إعادة النسخ، باستخدام المتجه الأصلي غير المضغوط لهذا الغرض. يتم إرجاع النتائج العليا k التي تمت إعادة ترتيبها فقط. هذه الخاصية اختيارية. الافتراضي هو 4.

  • quantizedDataType يجب تعيين إلى int8. هذا هو نوع البيانات البدائي الوحيد المدعوم في هذا الوقت. هذه الخاصية اختيارية. القيمة الافتراضية هي int8.

إضافة إعداد ضغط إلى ملف تعريف متجه

يتم تحديد التكميم العددي كخاصية في ملف تعريف متجه جديد. إنشاء ملف تعريف متجه جديد ضروري لإنشاء فهارس مضغوطة في الذاكرة.

ضمن ملف التعريف، يجب استخدام خوارزمية العوام الصغيرة القابلة للتنقل الهرمية (HNSW). التكميم المدمج غير مدعوم مع KNN الشامل.

  1. إنشاء ملف تعريف متجه جديد وإضافة خاصية ضغط.

    "profiles": [
       {
          "name": "my-vector-profile",
          "compression": "my-scalar-quantization", 
          "algorithm": "my-hnsw-vector-config-1",
          "vectorizer": null
       }
     ]
    
  2. تعيين ملف تعريف متجه إلى حقل متجه جديد . يقلل التكميم العددي المحتوى إلى Int8، لذا تأكد من أن المحتوى الخاص بك إما Float32 أو Float16.

    في Azure الذكاء الاصطناعي Search، تكون مكافئات نموذج بيانات الكيان (EDM) والأنواع Float32Float16 و Collection(Edm.Single) ، Collection(Edm.Half)على التوالي.

    {
       "name": "DescriptionVector",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "my-vector-profile"
    }
    
  3. قم بتحميل الفهرس باستخدام المفهرسات لفهرسة نموذج السحب، أو واجهات برمجة التطبيقات لفهرسة نموذج الدفع.

يقلل التكميم العددي من دقة كل رقم داخل تضمين كل متجه. بدلا من وصف كل رقم على أنه رقم نقطة عائمة 32 بت، فإنه يستخدم عددا صحيحا 8 بت. وهو يحدد نطاق من الأرقام (عادة ما يكون 99 في المئة الحد الأدنى والحد الأقصى) ويقسمها إلى عدد محدود من المستويات أو سلة، وتعيين معرف لكل سلة. في التكميم العددي 8 بت، هناك 2^8 أو 256 سلة محتملة.

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

مثال على الفهرس مع vectorCompression وأنواع البيانات والخاصية المخزنة

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

  • يوفر "HotelNameVector" مثالا على نوع البيانات الضيق، مع إعادة صياغة القيم الأصلية Float32 إلى Float16، يتم التعبير عنها كما هو الحال Collection(Edm.Half) في فهرس البحث.
  • تم stored تعيين "HotelNameVector" أيضا إلى false. لا يتم تخزين التضمينات الإضافية المستخدمة في استجابة استعلام. عندما stored يكون خطأ، retrievable يجب أن يكون خطأ أيضا.
  • يوفر "DescriptionVector" مثالا على ضغط المتجهات. يتم تعريف ضغط المتجهات في الفهرس، ويشار إليه في ملف تعريف، ثم يتم تعيينه إلى حقل متجه. تم stored تعيين "DescriptionVector" أيضا إلى false.
### Create a new index
POST {{baseUrl}}/indexes?api-version=2024-03-01-preview  HTTP/1.1
    Content-Type: application/json
    api-key: {{apiKey}}

{
    "name": "hotels-vector-quickstart",
    "fields": [
        {
            "name": "HotelId", 
            "type": "Edm.String",
            "searchable": false, 
            "filterable": true, 
            "retrievable": true, 
            "sortable": false, 
            "facetable": false,
            "key": true
        },
        {
            "name": "HotelName", 
            "type": "Edm.String",
            "searchable": true, 
            "filterable": false, 
            "retrievable": true, 
            "sortable": true, 
            "facetable": false
        },
        {
            "name": "HotelNameVector",
            "type": "Collection(Edm.Half)",
            "searchable": true,
            "retrievable": false,
            "dimensions": 1536,
            "stored": false,
            "vectorSearchProfile": "my-vector-profile-no-compression"
        },
        {
            "name": "Description", 
            "type": "Edm.String",
            "searchable": true, 
            "filterable": false, 
            "retrievable": false, 
            "sortable": false, 
            "facetable": false
        },
        {
            "name": "DescriptionVector",
            "type": "Collection(Edm.Single)",
            "searchable": true,
            "retrievable": false,
            "dimensions": 1536,
            "stored": false,
            "vectorSearchProfile": "my-vector-profile-with-compression"
        },
        {
            "name": "Category", 
            "type": "Edm.String",
            "searchable": true, 
            "filterable": true, 
            "retrievable": true, 
            "sortable": true, 
            "facetable": true
        },
        {
            "name": "Tags",
            "type": "Collection(Edm.String)",
            "searchable": true,
            "filterable": true,
            "retrievable": true,
            "sortable": false,
            "facetable": true
        },
        {
            "name": "Address", 
            "type": "Edm.ComplexType",
            "fields": [
                {
                    "name": "City", "type": "Edm.String",
                    "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                },
                {
                    "name": "StateProvince", "type": "Edm.String",
                    "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                }
            ]
        },
        {
            "name": "Location",
            "type": "Edm.GeographyPoint",
            "searchable": false, 
            "filterable": true, 
            "retrievable": true, 
            "sortable": true, 
            "facetable": false
        }
    ],
"vectorSearch": {
    "compressions": [
        {
            "name": "my-scalar-quantization",
            "kind": "scalarQuantization",
            "rerankWithOriginalVectors": true,
            "defaultOversampling": 10.0,
                "scalarQuantizationParameters": {
                    "quantizedDataType": "int8"
                }
        }
    ],
    "algorithms": [
        {
            "name": "my-hnsw-vector-config-1",
            "kind": "hnsw",
            "hnswParameters": 
            {
                "m": 4,
                "efConstruction": 400,
                "efSearch": 500,
                "metric": "cosine"
            }
        },
        {
            "name": "my-hnsw-vector-config-2",
            "kind": "hnsw",
            "hnswParameters": 
            {
                "m": 4,
                "metric": "euclidean"
            }
        },
        {
            "name": "my-eknn-vector-config",
            "kind": "exhaustiveKnn",
            "exhaustiveKnnParameters": 
            {
                "metric": "cosine"
            }
        }
    ],
    "profiles": [      
        {
            "name": "my-vector-profile-with-compression",
            "compression": "my-scalar-quantization",
            "algorithm": "my-hnsw-vector-config-1",
            "vectorizer": null
        },
        {
            "name": "my-vector-profile-no-compression",
            "compression": null,
            "algorithm": "my-eknn-vector-config",
            "vectorizer": null
        }
    ]
},
    "semantic": {
        "configurations": [
            {
                "name": "my-semantic-config",
                "prioritizedFields": {
                    "titleField": {
                        "fieldName": "HotelName"
                    },
                    "prioritizedContentFields": [
                        { "fieldName": "Description" }
                    ],
                    "prioritizedKeywordsFields": [
                        { "fieldName": "Tags" }
                    ]
                }
            }
        ]
    }
}

الاستعلام عن حقل متجه كمي باستخدام الطابع الزائد

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

في الاستعلام، يمكنك تجاوز القيمة الافتراضية للطوابع الزائدة. على سبيل المثال، إذا كان defaultOversampling هو 10.0، يمكنك تغييره إلى شيء آخر في طلب الاستعلام.

يمكنك تعيين المعلمة oversampling حتى إذا لم يكن الفهرس يحتوي صراحة على rerankWithOriginalVectors تعريف أو defaultOversampling . يؤدي توفير oversampling في وقت الاستعلام إلى تجاوز إعدادات الفهرس لهذا الاستعلام وتنفيذ الاستعلام بفاعلية rerankWithOriginalVectors كما هو صحيح.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-03-01-Preview   
  Content-Type: application/json   
  api-key: [admin key]   

    {    
       "vectorQueries": [
            {    
                "kind": "vector",    
                "vector": [8, 2, 3, 4, 3, 5, 2, 1],    
                "fields": "myvector",
                "oversampling": 12.0,
                "k": 5   
            }
      ]    
    }

النقاط الرئيسية:

  • ينطبق على حقول المتجهات التي تخضع لضغط المتجهات، لكل تعيين ملف تعريف متجه.

  • يتجاوز defaultOversampling القيمة أو يقدم طابعا زائدا في وقت الاستعلام، حتى إذا لم يحدد تكوين ضغط الفهرس خيارات الطابع الزائد أو إعادة تعيينها.

(راجع أيضًا )