الانتقال إلى المحتوى الرئيسي
تحتوي مجموعة بيانات Laion-400M على 400 مليون صورة مع تعليقات توضيحية للصور باللغة الإنجليزية. وتوفّر Laion اليوم مجموعة بيانات أكبر من ذلك، لكن العمل معها سيكون مشابهًا. تتضمن مجموعة البيانات عنوان URL للصورة، وتضمينات لكلٍّ من الصورة والتعليق التوضيحي للصورة، ودرجة تشابه بين الصورة والتعليق التوضيحي للصورة، بالإضافة إلى البيانات الوصفية، مثل عرض الصورة/ارتفاعها، والترخيص، وعلامة NSFW. ويمكننا استخدام مجموعة البيانات لتوضيح البحث التقريبي عن أقرب الجيران في ClickHouse.

إعداد البيانات

تُخزَّن التضمينات والبيانات الوصفية في ملفات منفصلة ضمن البيانات الخام. وتتضمن خطوة إعداد البيانات تنزيل هذه البيانات ودمج الملفات، ثم تحويلها إلى CSV واستيرادها إلى ClickHouse. يمكنك استخدام البرنامج النصي download.sh التالي لهذا الغرض:
تم تعريف النص البرمجي process.py كما يلي:
لبدء مسار إعداد البيانات، نفّذ:
مجموعة البيانات مُقسّمة إلى 410 ملفات، ويحتوي كل ملف على حوالي مليون صف. إذا كنت ترغب في العمل على مجموعة فرعية أصغر من البيانات، فما عليك سوى تعديل النطاقات، مثل seq 0 9 | .... (سكريبت Python أعلاه بطيء جدًا (~2-10 دقائق لكل ملف)، ويستهلك قدرًا كبيرًا من الذاكرة (41 GB لكل ملف)، كما أن ملفات CSV الناتجة كبيرة (10 GB لكل ملف)، لذا توخَّ الحذر. إذا كان لديك ما يكفي من RAM، فزِد قيمة -P1 للحصول على مزيد من التوازي. إذا ظل هذا بطيئًا جدًا، ففكّر في إيجاد آلية أفضل لإدخال البيانات — ربما عبر تحويل ملفات .npy إلى parquet، ثم تنفيذ بقية المعالجة باستخدام ClickHouse.)

إنشاء جدول

لإنشاء جدول في البداية من دون فهارس، شغّل:
لاستيراد ملفات CSV إلى ClickHouse:
لاحظ أن العمود id هو للتوضيح فقط، ويُعبِّئه البرنامج النصي بقيم غير فريدة. لتنفيذ بحث متجهي تقريبي بأسلوب الفحص الشامل، نفّذ:
target هو مصفوفة تضم 512 عنصرًا، وهو أيضًا معامل للعميل. وسنستعرض في نهاية المقال طريقة عملية للحصول على مصفوفات كهذه. أما الآن، فيمكننا استخدام تضمين لصورة عشوائية لمجموعة LEGO بوصفه target. النتيجة

أجرِ بحثًا تقريبيًا عن تشابه المتجهات باستخدام فهرس تشابه المتجهات

لنُعرِّف الآن فهرسَي تشابه متجهات على الجدول.
توضّح الوثائق المعلمات واعتبارات الأداء المتعلقة بإنشاء الفهرس والبحث. يحدّد تعريف الفهرس أعلاه فهرس HNSW يستخدم “مسافة جيب التمام” بوصفها مقياس المسافة، مع ضبط المعلمة “hnsw_max_connections_per_layer” على 64 والمعلمة “hnsw_candidate_list_size_for_construction” على 256. يستخدم الفهرس الأعداد العائمة بنصف الدقة (bfloat16) كتكميم لتحسين استخدام الذاكرة. لبناء الفهرس وتخزينه فعليًا، شغّل هذه العبارات:
قد يستغرق إنشاء الفهرس وحفظه بضع دقائق أو حتى ساعات، وذلك بحسب عدد الصفوف ومعلمات فهرس HNSW. لإجراء بحث في المتجهات، ما عليك سوى تنفيذ الاستعلام نفسه مرة أخرى:
النتيجة
انخفض زمن استجابة الاستعلام بشكل ملحوظ لأن أقرب الجيران استُرجعوا باستخدام الفهرس المتجهي. قد يُرجع البحث عن التشابه المتجهي باستخدام فهرس تشابه المتجهات نتائج تختلف اختلافًا طفيفًا عن نتائج الفحص الشامل. يمكن لفهرس HNSW أن يحقق قيمة استرجاع قريبة من 1 (بنفس دقة الفحص الشامل) مع اختيار معاملات HNSW بعناية وتقييم جودة الفهرس.

إنشاء التضمينات باستخدام UDFs

عادةً ما تكون الحاجة إلى إنشاء تضمينات لصور جديدة أو لتسميات توضيحية جديدة للصور، ثم البحث في البيانات عن أزواج متشابهة من الصور/التسميات التوضيحية للصور. ويمكننا استخدام UDF لإنشاء المتجه target من داخل العميل. ومن المهم استخدام النموذج نفسه لإنشاء البيانات والتضمينات الجديدة الخاصة بعمليات البحث. تستخدم البرامج النصية التالية النموذج ViT-B/32، وهو أيضًا النموذج الذي تستند إليه مجموعة البيانات.

تضمينات النص

أولاً، احفظ برنامج Python النصي التالي في الدليل user_scripts/ ضمن مسار بيانات ClickHouse، ومنحه صلاحية التنفيذ (chmod +x encode_text.py). encode_text.py:
ثم أنشئ encode_text_function.xml في مسار يُشار إليه بواسطة <user_defined_executable_functions_config>/path/to/*_function.xml</user_defined_executable_functions_config> ضمن ملف إعدادات خادم ClickHouse.
يمكنك الآن ببساطة أن تستخدم:
سيكون التشغيل الأول بطيئًا لأنه يحمّل النموذج، لكن مرات التشغيل اللاحقة ستكون سريعة. بعد ذلك، يمكننا نسخ الناتج إلى SET param_target=...، ومن ثم كتابة الاستعلامات بسهولة. وبدلًا من ذلك، يمكن استخدام الدالة encode_text() مباشرةً كوسيطة للدالة cosineDistance:
لاحظ أن UDF ‏encode_text() نفسه قد يستغرق بضع ثوانٍ لحساب متجه التضمين وإرجاعه.

تضمين الصور

يمكن إنشاء تضمين الصور بالطريقة نفسها، ونوفّر نصًا برمجيًا بلغة Python يمكنه إنشاء تضمين لصورة مخزّنة محليًا كملف. encode_image.py
encode_image_function.xml
حمّل صورةً تجريبية للبحث:
ثم شغّل هذا الاستعلام لإنشاء تضمين الصورة أعلاه:
استعلام البحث الكامل هو :
آخر تعديل في ٢ يوليو ٢٠٢٦