مشاركة عبر


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

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

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

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

تمكين الميزة

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

  1. انتقل إلى صفحة مورد Azure Cosmos DB for NoSQL.
  2. في الجزء الأيمن، ضمن Settings، حدد Features.
  3. حدد البحث المتجه عن NoSQL API.
  4. اقرأ وصف الميزة للتأكد من رغبتك في تمكينها.
  5. حدد تمكين لتشغيل البحث عن المتجهات في Azure Cosmos DB ل NoSQL.

تلميح

بدلا من ذلك، استخدم Azure CLI لتحديث قدرات حسابك لدعم Azure Cosmos DB للبحث عن متجه NoSQL.

az cosmosdb update \
     --resource-group <resource-group-name> \
     --name <account-name> \
     --capabilities EnableNoSQLVectorSearch

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

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

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

  • contentVector تحتوي الخاصية على تضمينات نصية يتم إنشاؤها من محتوى النص للكتاب. على سبيل المثال، يمكنك تسلسل titleauthorالخصائص و 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] 
} 

أولا، قم بإنشاء CosmosContainerProperties الكائن.

CosmosContainerProperties collectionDefinition = new CosmosContainerProperties(UUID.randomUUID().toString(), "Partition_Key_Def");

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

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

يتم تضمين المعلومات التالية في نهج متجه الحاوية:

المعلمه وصف
path مسار الخاصية الذي يحتوي على خطوط متجهة.
datatype نوع عناصر المتجه. الإعداد الافتراضي هو Float32.
dimensions طول كل متجه في المسار. الإعداد الافتراضي هو 1536.
distanceFunction المقياس المستخدم لحساب المسافة/التشابه. الإعداد الافتراضي هو Cosine.

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

// Creating vector embedding policy
CosmosVectorEmbeddingPolicy cosmosVectorEmbeddingPolicy = new CosmosVectorEmbeddingPolicy();

CosmosVectorEmbedding embedding1 = new CosmosVectorEmbedding();
embedding1.setPath("/coverImageVector");
embedding1.setDataType(CosmosVectorDataType.FLOAT32);
embedding1.setDimensions(8L);
embedding1.setDistanceFunction(CosmosVectorDistanceFunction.COSINE);

CosmosVectorEmbedding embedding2 = new CosmosVectorEmbedding();
embedding2.setPath("/contentVector");
embedding2.setDataType(CosmosVectorDataType.FLOAT32);
embedding2.setDimensions(10L);
embedding2.setDistanceFunction(CosmosVectorDistanceFunction.DOT_PRODUCT);

cosmosVectorEmbeddingPolicy.setCosmosVectorEmbeddings(Arrays.asList(embedding1, embedding2, embedding3));

collectionDefinition.setVectorEmbeddingPolicy(cosmosVectorEmbeddingPolicy);

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

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

IndexingPolicy indexingPolicy = new IndexingPolicy();
indexingPolicy.setIndexingMode(IndexingMode.CONSISTENT);
ExcludedPath excludedPath1 = new ExcludedPath("/coverImageVector/*");
ExcludedPath excludedPath2 = new ExcludedPath("/contentVector/*");
indexingPolicy.setExcludedPaths(ImmutableList.of(excludedPath1, excludedPath2));

IncludedPath includedPath1 = new IncludedPath("/*");
indexingPolicy.setIncludedPaths(Collections.singletonList(includedPath1));

// Creating vector indexes
CosmosVectorIndexSpec cosmosVectorIndexSpec1 = new CosmosVectorIndexSpec();
cosmosVectorIndexSpec1.setPath("/coverImageVector");
cosmosVectorIndexSpec1.setType(CosmosVectorIndexType.QUANTIZED_FLAT.toString());

CosmosVectorIndexSpec cosmosVectorIndexSpec2 = new CosmosVectorIndexSpec();
cosmosVectorIndexSpec2.setPath("/contentVector");
cosmosVectorIndexSpec2.setType(CosmosVectorIndexType.DISK_ANN.toString());

indexingPolicy.setVectorIndexes(Arrays.asList(cosmosVectorIndexSpec1, cosmosVectorIndexSpec2, cosmosVectorIndexSpec3));

collectionDefinition.setIndexingPolicy(indexingPolicy);

وأخيرا، قم بإنشاء الحاوية باستخدام نهج فهرس الحاوية ونهج فهرس المتجه.

database.createContainer(collectionDefinition).block();

مهم

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

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

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

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

SELECT TOP 10 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])   

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

float[] embedding = new float[10];
for (int i = 0; i < 10; i++) {
    array[i] = i + 1;
}
ArrayList<SqlParameter> paramList = new ArrayList<SqlParameter>();
  paramList.add(new SqlParameter("@embedding", embedding));
  SqlQuerySpec querySpec = new SqlQuerySpec("SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore  FROM c ORDER BY VectorDistance(c.contentVector,@embedding)", paramList);
  CosmosPagedIterable<Family> filteredFamilies = container.queryItems(querySpec, new CosmosQueryRequestOptions(), Family.class);

  if (filteredFamilies.iterator().hasNext()) {
      Family family = filteredFamilies.iterator().next();
      logger.info(String.format("First query result: Family with (/id, partition key) = (%s,%s)",family.getId(),family.getLastName()));
  }