متجهات الفهرس والاستعلام في Azure Cosmos DB ل NoSQL في Python.

ينطبق على: NoSQL

البحث عن المتجهات في Azure Cosmos DB ل NoSQL هو حاليا ميزة معاينة. يطلب منك التسجيل للمعاينة قبل الاستخدام. تتناول هذه المقالة الخطوات التالية:

  1. التسجيل لمعاينة Vector Search في Azure Cosmos DB ل NoSQL
  2. إعداد حاوية Azure Cosmos DB للبحث عن المتجهات
  3. نهج تضمين متجه التأليف
  4. إضافة فهارس متجهة إلى نهج فهرسة الحاوية
  5. إنشاء حاوية مع فهارس متجهة ونهج تضمين المتجهات
  6. إجراء بحث متجه على البيانات المخزنة.
  7. يستعرض هذا الدليل عملية إنشاء بيانات المتجهات، وفهرسة البيانات، ثم الاستعلام عن البيانات في حاوية.

المتطلبات الأساسية

التسجيل للمعاينة

يتطلب البحث المتجه عن Azure Cosmos DB ل NoSQL تسجيل ميزة المعاينة. اتبع الخطوات التالية للتسجيل:

  1. انتقل إلى صفحة مورد Azure Cosmos DB for NoSQL.

  2. حدد جزء "الميزات" ضمن عنصر القائمة "الإعدادات".

  3. حدد ل "Vector Search in Azure Cosmos DB for NoSQL".

  4. اقرأ وصف الميزة لتأكيد رغبتك في التسجيل في المعاينة.

  5. حدد "Enable" للتسجيل في المعاينة.

إشعار

سيتم الموافقة التلقائية على طلب التسجيل، ولكن قد يستغرق سريانه عدة دقائق.

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

لنأخذ مثالا على إنشاء قاعدة بيانات لمكتبة مستندة إلى الإنترنت وأنت تخزن العنوان والكاتب و ISBN والوصف لكل كتاب. سنحدد أيضا خاصيتين لاحتواء تضمينات المتجهات. الأولى هي الخاصية "contentVector"، التي تحتوي على تضمينات نصية تم إنشاؤها من محتوى النص للكتاب (على سبيل المثال، تسلسل خصائص "author" "author" "isbn" و"description" قبل إنشاء التضمين). والثاني هو "coverImageVector"، الذي يتم إنشاؤه من صور غلاف الكتاب.

  1. قم بإنشاء وتخزين تضمينات المتجهات للحقل التي تريد إجراء بحث متجه عليها.
  2. حدد مسارات تضمين المتجه في نهج تضمين المتجه.
  3. قم بتضمين أي فهارس متجهة مطلوبة في نهج الفهرسة للحاوية.

بالنسبة للأقسام اللاحقة من هذه المقالة، نعتبر البنية أدناه للعناصر المخزنة في حاويتنا:

{
"title": "book-title", 
"author": "book-author", 
"isbn": "book-isbn", 
"description": "book-description", 
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1], 
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78] 
} 

إنشاء نهج تضمين متجه للحاوية الخاصة بك.

بعد ذلك، تحتاج إلى تعريف نهج متجه الحاوية. يوفر هذا النهج المعلومات المستخدمة لإبلاغ محرك استعلام Azure Cosmos DB بكيفية معالجة خصائص المتجهات في وظائف نظام VectorDistance. هذا أيضا يعلم نهج فهرسة المتجه بالمعلومات الضرورية، إذا اخترت تحديد واحد. يتم تضمين المعلومات التالية في نهج المتجه المضمن:

  • "path": مسار الخاصية الذي يحتوي على متجهات
  • "نوع البيانات": نوع عناصر المتجه (الافتراضي Float32)
  • "الأبعاد": طول كل متجه في المسار (الافتراضي 1536)
  • "distanceFunction": المقياس المستخدم لحساب المسافة/التشابه (جيب التمام الافتراضي)

على سبيل المثال مع تفاصيل الكتاب، قد يبدو نهج المتجه مثل مثال JSON:

vector_embedding_policy = { 
    "vectorEmbeddings": [ 
        { 
            "path": "/coverImageVector", 
            "dataType": "float32", 
            "distanceFunction": "dotproduct", 
            "dimensions": 8 
        }, 
        { 
            "path": "/contentVector", 
            "dataType": "float32", 
            "distanceFunction": "cosine", 
            "dimensions": 10 
        } 
    ]    
} 

إنشاء فهرس متجه في نهج الفهرسة

بمجرد تحديد مسارات تضمين المتجه، يجب إضافة فهارس المتجهات إلى نهج الفهرسة. على سبيل المثال، قد يبدو نهج الفهرسة كما يلي:

indexing_policy = { 
    "includedPaths": [ 
        { 
            "path": "/*" 
        } 
    ], 
    "excludedPaths": [ 
        { 
            "path": "/\"_etag\"/?",
            "path": "/coverImageVector/*",
            "path": "/contentVector/*"
            
        } 
    ], 
    "vectorIndexes": [ 
        {"path": "/coverImageVector", 
         "type": "quantizedFlat" 
        }, 
        {"path": "/contentVector", 
         "type": "quantizedFlat" 
        } 
    ] 
} 

هام

تمت إضافة مسار المتجه إلى قسم "excludedPaths" في نهج الفهرسة لضمان الأداء الأمثل للإدراج. سيؤدي عدم إضافة مسار المتجه إلى "excludedPaths" إلى ارتفاع تكلفة وحدة الطلب وزمن الانتقال لإدراج المتجهات.

هام

البحث عن المتجهات حاليا في Azure Cosmos DB ل NoSQL مدعوم على حاويات جديدة فقط. تحتاج إلى تعيين كل من نهج متجه الحاوية وأي نهج فهرسة متجه أثناء وقت إنشاء الحاوية حيث لا يمكن تعديله لاحقا. سيكون كلا النهجين قابلين للتعديل في تحسين مستقبلي لميزة المعاينة.

إنشاء حاوية باستخدام نهج المتجه

حاليا يتم دعم ميزة البحث عن المتجهات ل Azure Cosmos DB ل NoSQL فقط على حاويات جديدة لذلك تحتاج إلى تطبيق نهج المتجه أثناء وقت إنشاء الحاوية ولا يمكن تعديلها لاحقا.

try:     
    container = db.create_container_if_not_exists( 
                    id=CONTAINER_NAME, 
                    partition_key=PartitionKey(path='/id'), 
                    indexing_policy=indexing_policy, 
                    vector_embedding_policy=vector_embedding_policy) 
    print('Container with id \'{0}\' created'.format(id)) 

except exceptions.CosmosHttpResponseError: 
        raise 

تشغيل استعلام البحث عن تشابه المتجهات

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

SELECT c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])   

يسترد هذا الاستعلام عناوين الكتاب جنبا إلى جنب مع درجات التشابه فيما يتعلق بالاستعلام الخاص بك. فيما يلي مثال في Python:

query_embedding = [1,2,3,4,5,6,7,8,9,10] 
# Query for items 
for item in container.query_items( 
            query='SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)', 
            parameters=[ 
                {"name": "@embedding", "value": query_embedding} 
            ], 
            enable_cross_partition_query=True): 
    print(json.dumps(item, indent=True))