• نبذة عن ميلفوس
  • ابدأ الآن
  • المفاهيم
  • دليل المستخدم
  • استيراد البيانات
  • أدوات الذكاء الاصطناعي
  • دليل الإدارة
  • الأدوات
  • عمليات الدمج
  • البرامج التعليمية
  • الأسئلة الشائعة
  • API Reference

دالة MinHashCompatible with Milvus 3.0.x

تقوم دالة MinHash بتحويل النص الخام إلى متجهات ثنائية تقارب تشابه جاكارد بين المستندات. وتطبّق الدالة تجزئة النص ووظائف تجزئة متعددة لإنتاج متجهات توقيع ذات طول ثابت، مما يتيح الكشف السريع عن التكرار شبه المكرر وإلغاء تكرار المستندات على نطاق واسع.

وكدالة مدمجة، تعمل MinHash داخل Milvus ولا تتطلب استدلال نموذج خارجي أو معالجة مسبقة. يمكنك إدراج نص أولي، ويقوم Milvus بإنشاء متجهات توقيع MinHash تلقائيًا.

الحدود

  • يجب أن يكون حقل الإخراج BINARY_VECTOR ببعد يفي dim % 32 == 0 ، لأن كل توقيع MinHash عبارة عن قيمة تجزئة 32 بت.

  • يجب أن يكون dim لحقل المتجه الثنائي يساوي 32 * num_hashes. يؤدي عدم التطابق إلى حدوث خطأ.

  • عند استخدام فهرس MINHASH_LSH مع مخرجات دالة MinHash، يجب تعيين mh_element_bit_width على 32.

كيف تعمل MinHash

توسع لترى كيف تعمل

MinHash عبارة عن تقنية تجزئة حساسة للمكان تقدر تشابه جاكارد بين المجموعات. في Milvus، تتبع دالة MinHash في MinHash هذا المسار: أنت تقدم نصًا خامًا كمدخل، وينتج Milvus متجهًا ثنائيًا كمخرجات - مع التعامل مع جميع الخطوات الوسيطة داخليًا.

يتألف سير العمل الكلي من خط معالجة نص مشترك يستخدمه كل من استيعاب المستندات ومعالجة الاستعلام، تليها عمليات خاصة بمراحل التخزين والاسترجاع.

Iaqkbfeh8oqggsx6nsocfosondo Iaqkkbfefeh8oqggsx6nsocfosondo

خط أنابيب معالجة النصوص المشتركة

يمرر كل من استيعاب المستندات ومعالجة الاستعلام النص الخام من خلال نفس التحويل المكون من أربع مراحل:

  1. تحليل النص: تتم معالجة النص بواسطة محلل (عندما يكون token_level هو "word") أو يستخدم مباشرة (عندما يكون token_level هو "char"). يطبق الترميز على مستوى الكلمة المحلل الذي تم تكوينه على حقل الإدخال لتجزئة النص إلى مصطلحات - على سبيل المثال، "milvus is vector db" يصبح ["milvus", "is", "vector", "db"].

  2. التجزئة: يتم تقسيم الرموز إلى ن-غرامات متداخلة (shingles) بحجم shingle_size. على سبيل المثال، مع وجود 3 جرامات على مستوى الكلمة، تصبح الرموز ["information", "retrieval", "is", "a", "field"] رموزًا متداخلة مثل ["information retrieval is", "retrieval is a", "is a field"].

  3. توليد توقيع MinHash: يتم تطبيق دوال تجزئة متعددة (H1، H2، ...، Hn، حيث n = num_hashes) على مجموعة التجزئة. بالنسبة لكل دالة تجزئة، يتم تحديد الحد الأدنى لقيمة التجزئة عبر جميع التجزئات. وتشكل مجموعة هذه القيم الدنيا توقيع MinHash - وهو عبارة عن تمثيل ثابت الطول يقارب تشابه جاكارد للمستند الأصلي.

  4. ترميز المتجه الثنائي: كل قيمة توقيع هي عبارة عن تجزئة 32 بت، ويتم تعبئة التوقيع الكامل في BINARY_VECTOR ذات البعد 32 * num_hashes.

إدخال المستند

أثناء الإدراج، يتم تخزين المتجه الثنائي الناتج عن خط الأنابيب المشترك في فهرس MINHASH_LSH. ويحتفظ الفهرس بجدول LSH (التجزئة الحساسة للموقع) الذي يجمع التواقيع المتشابهة في نفس الدلاء، مما يتيح استرجاع سريع للمرشحين في وقت الاستعلام.

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

أثناء البحث، يمرّ نص الاستعلام عبر نفس خط الأنابيب المشترك لإنتاج متجه ثنائي. يُستخدم هذا المتجه لإجراء عملية بحث عن LSH في فهرس MINHASH_LSH ، والذي يحدد بسرعة الأزواج المرشحة التي من المحتمل أن تكون متشابهة. يتم بعد ذلك ترتيب المرشحين حسب تشابه جاكارد المقدر ويتم إرجاع أفضل النتائج.

نظرًا لأن كلا المسارين يشتركان في نفس منطق التحويل، فإن المستندين اللذين يتداخل محتواهما بشكل كبير ينتج عنهما توقيعات MinHash متشابهة. هذا يجعل الدالة فعّالة في العثور على التكرارات شبه المتشابهة حتى عندما تختلف المستندات في ترتيب الكلمات أو التنسيق أو الصياغة الثانوية.

قبل البدء

قبل استخدام الدالة MinHash، قم بتخطيط مخطط المجموعة الخاص بك ليشمل ما يلي:

  • حقل نصي للمحتوى الخام

    يجب أن تتضمن مجموعتك حقلاً VARCHAR لتخزين النص الخام. يعمل هذا الحقل كمدخل لدالة MinHash.

  • محلل لحقل النص (عند استخدام الترميز على مستوى الكلمات)

    إذا تم تعيين token_level على "word" (افتراضي)، يجب أن يحتوي حقل النص على محلل ممكّن. يحدد المُحلل كيفية ترميز النص قبل التجزئة. بشكل افتراضي، يستخدم ميلفوس محلل standard. لتكوين محلل مختلف، راجع اختيار المحلل المناسب لحالة الاستخدام الخاصة بك.

  • حقل ناقل ثنائي لإخراج MinHash

    يجب أن تتضمن مجموعتك حقل BINARY_VECTOR لتخزين المتجهات الثنائية التي تم إنشاؤها بواسطة دالة MinHash. يجب أن يساوي البعد 32 * num_hashes.

الخطوة 1: إنشاء مجموعة مع دالة MinHash MinHash

لاستخدام دالة MinHash، قم بتعريفها عند إنشاء المجموعة. تصبح الدالة جزءًا من مخطط المجموعة ويتم تطبيقها تلقائيًا أثناء إدراج البيانات والبحث عنها.

تحديد حقول المخطط

يجب أن يتضمن مخطط مجموعتك ثلاثة حقول على الأقل:

  • الحقل الأساسي: يحدد بشكل فريد كل كيان في المجموعة.

  • حقل نصي (VARCHAR): يخزن المستندات النصية الخام. قم بتعيين enable_analyzer=True حتى يتمكن Milvus من معالجة النص لإنشاء توقيع MinHash. بشكل افتراضي، يستخدم Milvus محلل standard لتحليل النص. لتكوين محلل مختلف، راجع اختيار المحلل المناسب لحالة الاستخدام الخاصة بك.

  • حقل المتجهات الثنائية (BINARY_VECTOR): يخزن المتجهات الثنائية التي يتم إنشاؤها تلقائيًا بواسطة دالة MinHash. يجب أن يساوي البعد 32 * num_hashes.

from pymilvus import MilvusClient, DataType, Function, FunctionType

client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")

schema = client.create_schema()

schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name="document_content", datatype=DataType.VARCHAR, max_length=9000, enable_analyzer=True)
schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=8192)
// java
// nodejs
// go
# restful

تعريف دالة MinHash MinHash

تقوم الدالة MinHash بتحويل النص الذي تم تحليله إلى متجهات ثنائية تقارب تشابه جاكارد بين المستندات.

عرّف الدالة وأضفها إلى مخططك:

minhash_function = Function(
    name="minhash_function",
    input_field_names=["document_content"], # Name of the VARCHAR field containing raw text
    output_field_names=["binary_vector"], # Name of the BINARY_VECTOR field for generated signatures
    function_type=FunctionType.MINHASH,
    params={
        "num_hashes": 256, # Number of hash functions; produces dim = 32 * 256 = 8192
        "shingle_size": 3, # N-gram size for shingling
    }
)

schema.add_function(minhash_function)
// java
// nodejs
// go
# restful

خيارات التكوين

يقبل قاموس params الخاص بدالة MinHash المعلمات التالية. جميع أسماء المعلمات غير حساسة لحالة الأحرف.

المعلمة

النوع

افتراضي

الوصف

num_hashes

int

مشتق من dim / 32

عدد دوال التجزئة لإنشاء التوقيع. بُعد المتجه الثنائي الناتج يساوي 32 * num_hashes. تقلل القيم الأعلى من التباين في تقدير التشابه ولكنها تزيد من الحساب. موصى به: 256 (البعد = 8192).

shingle_size

int

3

حجم N-غرام للتبديل. مستوى الكلمة: 1-3 نموذجي. مستوى الحرف: 2-6 نموذجي.

hash_function

ش

"xxhash"

دالة التجزئة المراد استخدامها. خيارات:

  • "xxhash" (سريع)

  • "sha1" (أبطأ، مقاومة أعلى للتصادم).

token_level

ش

"word"

مستوى الترميز. خيارات:

  • "word":: يستخدم محلل الحقل لترميز الرموز، ثم يطبق التظليل على الرموز.

  • "char" / "character": يطبّق تبديل ن-غرام مباشرةً على الأحرف الخام (بدون محلل).

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

seed

int

1234

بذرة عشوائية لتهيئة دالة MinHash.

تكوين الفهرس

نوع الفهرس الموصى به لمتجهات MinHash الثنائية هو MINHASH_LSH ، مع نوع القياس MHJACCARD.

index_params = client.prepare_index_params()

index_params.add_index(
    field_name="binary_vector",
    index_type="MINHASH_LSH",
    metric_type="MHJACCARD",
    params={
        "mh_lsh_band": 128,
        "mh_element_bit_width": 32,
        "with_raw_data": True,
    },
)
// java
// nodejs
// go
# restful

إنشاء المجموعة

قم بإنشاء المجموعة باستخدام المخطط ومعلمات الفهرس المحددة أعلاه:

client.create_collection(
    collection_name="dedup_collection",
    schema=schema,
    index_params=index_params,
)
// java
// nodejs
// go
# restful

الخطوة 2: إدراج المستندات

بعد إعداد مجموعتك، أدخل بيانات نصية. تحتاج فقط إلى توفير النص الخام - تقوم الدالة MinHash تلقائيًا بإنشاء المتجه الثنائي لكل مستند.

client.insert(
    "dedup_collection",
    [
        {"document_content": "information retrieval is a field of study that helps users find relevant information in large datasets"},
        {"document_content": "information retrieval is a research field focused on helping users find relevant data in large collections"},
        {"document_content": "information retrieval is a field of research helping users search for relevant information in large datasets"},
    ],
)
// java
// nodejs
// go
# restful

الخطوة 3: البحث باستخدام MinHash

بمجرد إدخال البيانات، ابحث عن المستندات شبه المكررة من خلال توفير استعلامات نصية أولية. يقوم Milvus تلقائيًا بتحويل نص الاستعلام الخاص بك إلى متجه ثنائي MinHash ويسترجع المستندات الأكثر تشابهًا باستخدام تشابه Jaccard المقدر.

search_params = {
    "metric_type": "MHJACCARD",
    "params": {},
}

results = client.search(
    collection_name="dedup_collection",
    data=["information retrieval is a research field focused on helping users find relevant data in large collections"],
    anns_field="binary_vector",
    limit=3,
    output_fields=["document_content"],
    search_params=search_params,
)

for hits in results:
    for hit in hits:
        print(f"ID: {hit['id']}, Distance: {hit['distance']}")
        print(f"Document: {hit['entity']['document_content']}")
// java
// nodejs
// go
# restful

ما التالي