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

ينطبق على: 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] 
} 

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

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

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

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

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

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

// 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" إلى ارتفاع تكلفة وحدة الطلب وزمن الانتقال لإدراج المتجهات.

هام

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

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

بمجرد إنشاء حاوية مع نهج المتجه المطلوب، وإدراج بيانات المتجهات في الحاوية، يمكنك إجراء بحث متجه باستخدام دالة نظام مسافة المتجه في استعلام. لنفترض أنك تريد البحث عن كتب حول وصفات الطعام من خلال النظر إلى الوصف، تحتاج أولا إلى الحصول على تضمينات لنص الاستعلام الخاص بك. في هذه الحالة، قد تحتاج إلى إنشاء تضمينات لنص الاستعلام - "وصفة الطعام". بمجرد تضمين استعلام البحث، يمكنك استخدامه في الدالة 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()));
  }

الخطوات التالية