إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
ترشدك هذه المقالة خلال عملية كيفية إنشاء بيانات متجه، وفهرسة البيانات، ثم الاستعلام عن البيانات في حاوية.
قبل استخدام فهرسة المتجه والبحث، يجب أولا تمكين البحث عن المتجهات في Azure Cosmos DB ل NoSQL. بعد إعداد حاوية Azure Cosmos DB للبحث في المتجهات، يمكنك إنشاء نهج تضمين متجه. بعد ذلك، يمكنك إضافة فهارس متجهة إلى نهج فهرسة الحاوية. ثم تقوم بإنشاء حاوية مع فهارس متجهة ونهج تضمين متجه. وأخيرا، يمكنك إجراء بحث متجه على البيانات المخزنة.
المتطلبات الأساسية
- حساب Azure Cosmos DB ل NoSQL موجود.
- إذا لم يكن لديك اشتراك Azure، فجرب Azure Cosmos DB ل NoSQL مجانا.
- إذا كان لديك اشتراك Azure موجود، فبادر بإنشاء حساب Azure Cosmos DB جديد ل NoSQL.
- أحدث إصدار من Azure Cosmos DB .NET SDK (الإصدار: 3.45.0 أو أحدث، معاينة: 3.46.0-preview.0 أو أحدث).
تمكين الميزة
لتمكين البحث المتجه عن Azure Cosmos DB ل NoSQL، اتبع الخطوات التالية:
- انتقل إلى صفحة مورد Azure Cosmos DB for NoSQL.
- في الجزء الأيمن، ضمن Settings، حدد Features.
- حدد Vector Search في Azure Cosmos DB ل NoSQL.
- اقرأ وصف الميزة للتأكد من رغبتك في تمكينها.
- حدد تمكين لتشغيل البحث عن المتجهات في 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يتم إنشاء الخاصية من صور غلاف الكتاب.
لإجراء بحث متجه، يمكنك:
- قم بإنشاء وتخزين تضمينات المتجهات للحقل التي تريد إجراء بحث متجه عليها.
- حدد مسارات تضمين المتجه في نهج تضمين المتجه.
- قم بتضمين أي فهارس متجهة تريدها في نهج الفهرسة للحاوية.
بالنسبة للأقسام اللاحقة من هذه المقالة، ضع في اعتبارك البنية التالية للعناصر المخزنة في الحاوية الخاصة بك:
{
"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 |
مسار الخاصية الذي يحتوي على خطوط متجهة. |
datatype |
نوع عناصر المتجه. (الافتراضي هو Float32.) |
dimensions |
طول كل متجه في المسار. (الافتراضي هو 1536.) |
distanceFunction |
المقياس المستخدم لحساب المسافة/التشابه. (الافتراضي هو Cosine.) |
على سبيل المثال مع تفاصيل الكتاب، قد يبدو نهج المتجه مثل المثال التالي:
Database db = await client.CreateDatabaseIfNotExistsAsync("vector-benchmarking");
List<Embedding> embeddings = new List<Embedding>()
{
new Embedding()
{
Path = "/coverImageVector",
DataType = VectorDataType.Float32,
DistanceFunction = DistanceFunction.Cosine,
Dimensions = 8,
},
new Embedding()
{
Path = "/contentVector",
DataType = VectorDataType.Float32,
DistanceFunction = DistanceFunction.Cosine,
Dimensions = 10,
}
};
إنشاء فهرس متجه في نهج الفهرسة
بعد أن تقرر مسارات تضمين المتجه، يجب إضافة فهارس المتجهات إلى نهج الفهرسة. حاليا، يتم دعم ميزة البحث المتجه ل Azure Cosmos DB ل NoSQL فقط على حاويات جديدة. عند إنشاء الحاوية، يمكنك تطبيق نهج المتجه. لا يمكنك تعديل النهج لاحقا. يبدو نهج الفهرسة مشابها للمثال التالي:
Collection<Embedding> collection = new Collection<Embedding>(embeddings);
ContainerProperties properties = new ContainerProperties(id: "vector-container", partitionKeyPath: "/id")
{
VectorEmbeddingPolicy = new(collection),
IndexingPolicy = new IndexingPolicy()
{
VectorIndexes = new()
{
new VectorIndexPath()
{
Path = "/vector",
Type = VectorIndexType.QuantizedFlat,
}
}
},
};
properties.IndexingPolicy.IncludedPaths.Add(new IncludedPath { Path = "/*" });
properties.IndexingPolicy.ExcludedPaths.Add(new ExcludedPath { Path = "/vector/*" });
مهم
تتم إضافة مسار المتجه إلى 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])
يسترد هذا الاستعلام عناوين الكتاب جنبا إلى جنب مع درجات التشابه فيما يتعلق بالاستعلام الخاص بك. فيما يلي مثال في .NET:
float[] embedding = {1f,2f,3f,4f,5f,6f,7f,8f,9f,10f};
var queryDef = new QueryDefinition(
query: $"SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)"
).WithParameter("@embedding", embedding);
using FeedIterator<Object> feed = container.GetItemQueryIterator<Object>(
queryDefinition: queryDef
);
while (feed.HasMoreResults)
{
FeedResponse<Object> response = await feed.ReadNextAsync();
foreach ( Object item in response)
{
Console.WriteLine($"Found item:\t{item}");
}
}