حقل النصCompatible with Milvus 3.0.x

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

يوفر Milvus نوع الحقل القياسي « TEXT » لتخزين النص المصدر الطويل مباشرةً مع الكيانات. وتشمل القيم النموذجية مقاطع نصية، ووثائق طويلة، ونصوص المقالات، والتذاكر، والسجلات. وعلى عكس « VARCHAR » الذي يتطلب « max_length » ثابتًا، لا يتطلب « TEXT » تعيين الحد الأقصى لطول البايت في مخطط المجموعة.

لتعريف حقل « TEXT »، قم بتعيين datatype إلى DataType.TEXT.

تتطلب هذه الميزة Storage V3. للاطلاع على إرشادات التمكين واعتبارات التوافق، راجع Storage V3.

common.storage.useLoonFFI القيمة الافتراضية هي false ، مما يعني أن Storage V3 معطّل افتراضيًا. قبل إنشاء مجموعة تحتوي على حقل TEXT ، اضبط هذه المعلمة على true ؛ وإلا، سيرفض Milvus مخطط المجموعة.

schema.add_field(
    field_name="content",
    datatype=DataType.TEXT,
)

بعد تعريف الحقل، يمكن لكل كيان تضمين قيمة سلسلة في هذا الحقل. يمكنك إدراج قيم TEXT مثل الحقول القياسية الأخرى واسترجاعها من نتائج الاستعلام أو البحث عن طريق إدراج الحقل في output_fields.

TEXT تدعم الحقول القيم الفارغة. لتمكين هذه الميزة، اضبط nullable على True. لمزيد من التفاصيل، راجع «الحقل القابل للفراغ» (Nullable Field).

القيود

  • لا يمكن أن يكون حقل TEXT حقلًا أساسيًا أو مفتاح تقسيم أو مفتاح تجميع.
  • TEXT لا يمكن استخدام كنوع عنصر لحقل ARRAY ، بما في ذلك حقل فرعي قياسي في StructArray.
  • في Milvus 3.0.0، لا تدعم الحقول ذات القيم القابلة للفراغ ( TEXT ) القيم الافتراضية.
  • في Milvus 3.0.0، لا يتم دعم حقول TEXT في المجموعات الخارجية.
  • لا يمكن للمستخدمين إنشاء فهرس سكالي على حقل TEXT. عند استخدام enable_match=True ، يقوم Milvus بإنشاء فهرس نصي يديره النظام لمطابقة النصوص. هذا الفهرس الداخلي ليس فهرسًا سكاليًا أنشأه المستخدم.
  • لا يمكن تطبيق عوامل التصفية القياسية العامة مباشرةً على حقل TEXT. وتشمل هذه عوامل المقارنة مثل == و != ، وعوامل النطاق مثل > و >= و < و <= ، بالإضافة إلى IN و LIKE وعوامل التعبير النمطي (=~ و !~) و IS NULL أو IS NOT NULL. للتصفية حسب المصطلحات التي تم تحليلها، قم بتعريف الحقل باستخدام enable_analyzer=True و enable_match=True ، واستخدم TEXT_MATCH أو TEXT_MATCH_FUZZY. لاسترجاع النص الكامل مرتبًا حسب الصلة، استخدم BM25.
  • في Milvus 3.0.0، يجب تعريف دالة BM25 أو MinHash التي تستخدم حقل TEXT كمدخلات عند إنشاء المجموعة. ولا يمكن إضافتها لاحقًا عبر add_function_field أو AlterCollectionSchema ، حتى لو كانت المجموعة الحالية فارغة، لأن Milvus لا يمكنه ملء ناتج الدالة من قيم TEXT المخزنة. لإضافة مثل هذه الوظيفة إلى مجموعة موجودة، استخدم حقل الإدخال « VARCHAR »، أو أعد إنشاء المجموعة مع تضمين الوظيفة في مخططها. للحصول على تفاصيل حول إضافة وظيفة وحقل المتجه الناتج عنها، راجع «Alter Collection Schema».
  • يجب أيضًا تعريف وظائف تضمين النص عند إنشاء المجموعة. لا يدعم Milvus 3.0.0 إضافتها أثناء وقت التشغيل.

اختر TEXT أو VARCHAR

TEXT و VARCHAR ، وكلاهما يخزنان قيمًا نصية، لكنهما يدعمان احتياجات تطبيقات مختلفة. استخدم « VARCHAR » للبيانات الوصفية القصيرة والمحدودة التي تحدد الكيانات أو تصنفها أو ترشحها. استخدم « TEXT » للمحتوى المصدر الأطول الذي يوفر لنموذج اللغة الكبير (LLM) أو الوكيل سياقًا كافيًا للقراءة أو الاقتباس أو التلخيص أو إنشاء موجه.

الجانبVARCHARTEXT
الأفضل لـالبيانات الوصفية القصيرة المستخدمة لتحديد الكيانات أو تصنيفها أو تصفيتها، مثل title أو tag أو category أو external_id.محتوى مصدر أطول تستخدمه نماذج اللغة الكبيرة (LLM) أو سير عمل الوكلاء، مثل content أو passage أو article_body أو log_message.
إعداد الطوليتطلب max_length ، الذي يحدد الحد الأقصى لعدد البايتات التي يمكن للحقل تخزينها. القيمة القصوى هي 65,535 بايت. إذا كانت القيمة قد تتجاوز هذا الحد، فاستخدم TEXT.لا يتطلب max_length ، لذا لا يحتاج المخطط إلى حد ثابت للبايتات لقيمة النص.
سلوك التخزينيخزن كل قيمة ضمن نطاق التخزين المحدد ( max_length) للحقل.يستخدم التحديد التلقائي للتخزين للقيم النصية الأكبر حجمًا. لمزيد من التفاصيل، راجع كيفية تخزين Milvus للقيم النصية الكبيرة.
دعم الحقل الأساسييمكن استخدامه كحقل أساسي.لا يمكن استخدامه كحقل أساسي.
التصفيةيُستخدم للبيانات الوصفية ذات السلاسل القصيرة التي يجب أن تظهر في تعبيرات التصفية، مثل category == "news" أو tag in ["ai", "database"].لا يدعم عوامل التصفية القياسية العامة. استخدم عوامل النص التي تدعم المطابقة لتصفية المصطلحات التي تم تحليلها، أو BM25 لاسترجاع النص الكامل مرتبًا حسب الصلة.

للحصول على تفاصيل حول حقول VARCHAR ، راجع حقل VarChar.

كيف يخزن Milvus قيم TEXT الكبيرة

قم بالتوسيع لمعرفة كيفية عملها

عند إدراج كيان، فإن السلسلة التي تقدمها لحقل TEXT هي قيمة TEXT. يقارن Milvus حجم تلك القيمة بـ dataNode.text.inlineThreshold، الذي يبلغ 65,536 بايت افتراضيًا، ثم يختار أحد مساري التخزين الداخليين.

Large text storage تخزين النصوص الكبيرة

  • التخزين المضمن: إذا كانت قيمة TEXT أصغر من dataNode.text.inlineThreshold ، يقوم Milvus بتخزين قيمة النص الأصلية مباشرةً في بيانات حقل TEXT.
  • تخزين LOB: إذا كانت قيمة TEXT أكبر من أو تساوي dataNode.text.inlineThreshold ، فإن Milvus تعامل القيمة ككائن كبير وتخزن النص الأصلي بشكل منفصل في تخزين الكائنات، مثل MinIO. تخزن بيانات حقل TEXT مرجعًا داخليًا للنص المخزن بشكل منفصل. عند طلب حقل TEXT في نتائج الاستعلام أو البحث، يستخدم Milvus المرجع لاسترداد النص الأصلي وإرجاعه.

يُعد اختيار التخزين هذا داخليًّا. يمكنك إدراج الحقل TEXT والاستعلام عنه والبحث فيه بنفس الطريقة بغض النظر عن مسار التخزين الذي يستخدمه Milvus. لضبط العتبة أو سلوك التخزين والضغط وإزالة البيانات غير الضرورية ذات الصلة، راجع التكوينات المتعلقة بـ dataNode والتكوينات المتعلقة بـ dataCoord.

إذا كان النشر الخاص بك يستخدم تخزين الكائنات، فقد تظهر قيم TEXT الكبيرة ككائنات تديرها Milvus ضمن مسارات مثل lobs/.... هذه الكائنات هي تفاصيل تنفيذية ولا يجب نقلها أو نسخها أو حذفها يدويًّا. بعد حذف الكيانات أو إزالة الأقسام أو ضغط البيانات، قد ينخفض استخدام تخزين الكائنات فقط بعد أن تقوم عملية جمع القمامة في Milvus بإزالة بيانات الكائنات الكبيرة غير المشار إليها بعد انتهاء فترة الأمان الخاصة بها.

يُعد البحث عن النص الكامل باستخدام BM25 أحد الاستخدامات الشائعة لـ TEXT. في هذا النمط، يخزن الحقل TEXT المحتوى الأصلي للمصدر، ويقوم BM25 بتحليل النص وإنشاء متجهات متفرقة لترتيب التطابقات المستندة إلى الكلمات الرئيسية. يمكن لنتائج البحث بعد ذلك إرجاع قيمة TEXT المطابقة كسياق لسير عمل LLM أو الوكيل. يوضح المثال التالي كيفية استخدام حقل « TEXT » كحقل إدخال لـ BM25. لمعرفة المزيد عن مفاهيم البحث عن النص الكامل وخيارات الاستعلام، راجع «البحث عن النص الكامل».

الخطوة 1: إنشاء مجموعة تحتوي على حقل TEXT

يُنشئ المثال التالي مجموعة تحتوي على حقل TEXT للمحتوى المصدر وحقل متجه متفرق للمتجهات المتفرقة التي تم إنشاؤها بواسطة BM25. تقوم دالة BM25 بتحويل النص المُقسَّم إلى رموز من content إلى متجهات متفرقة مخزنة في sparse.

لإجراء بحث النص الكامل باستخدام BM25، يجب تعيين حقل TEXT المدخل على enable_analyzer=True.

from pymilvus import DataType, Function, FunctionType, MilvusClient

client = MilvusClient(uri="http://localhost:19530")
COLLECTION_NAME = "text_bm25_collection"

if client.has_collection(COLLECTION_NAME):
    client.drop_collection(COLLECTION_NAME)

schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(
    field_name="content",
    datatype=DataType.TEXT,
    enable_analyzer=True,
)
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)

bm25_function = Function(
    name="content_bm25",
    input_field_names=["content"],
    output_field_names=["sparse"],
    function_type=FunctionType.BM25,
)
schema.add_function(bm25_function)

الخطوة 2: إنشاء فهرس للمتجهات المتفرقة

قم بإنشاء فهرس على حقل المتجهات المتفرقة الذي تم إنشاؤه بواسطة دالة BM25. يجب تعيين نوع المقياس إلى BM25.

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="sparse",
    index_type="SPARSE_INVERTED_INDEX",
    metric_type="BM25",
    params={
        "inverted_index_algo": "DAAT_MAXSCORE",
        "bm25_k1": 1.2,
        "bm25_b": 0.75,
    },
)

client.create_collection(
    collection_name=COLLECTION_NAME,
    schema=schema,
    index_params=index_params,
)

الخطوة 3: إدراج بيانات النص

أدخل النص مباشرةً في حقل TEXT. لا تقم بتوفير قيم لحقل sparse. يقوم Milvus بإنشاء المتجهات المتفرقة داخليًّا من خلال تطبيق دالة BM25 على content.

data = [
    {
        "id": 1,
        "content": "Milvus stores vector embeddings and scalar fields in collections. It supports vector search, full text search, and metadata filtering for retrieval applications.",
    },
    {
        "id": 2,
        "content": "Long documents are often split into passages before embedding. Store each passage in a TEXT field so search results can return the source text.",
    },
    {
        "id": 3,
        "content": "Operational logs and support tickets often contain long natural-language text. TEXT fields can store these values without a fixed max_length setting.",
    },
]

client.insert(collection_name=COLLECTION_NAME, data=data)
client.load_collection(collection_name=COLLECTION_NAME)

استخدم نص الاستعلام الخام كبيانات البحث وقم بالبحث في حقل المتجهات المتفرقة. يقوم Milvus بتحويل نص الاستعلام إلى متجه متفرق، وترتيب النتائج المطابقة باستخدام BM25، وإرجاع حقل TEXT المطلوب في output_fields.

results = client.search(
    collection_name=COLLECTION_NAME,
    data=["how does Milvus store source text for retrieval"],
    anns_field="sparse",
    limit=2,
    output_fields=["content"],
)

الخطوة 5: قراءة قيم TEXT التي تم إرجاعها

تتضمن كل نتيجة بحث درجة BM25 والقيمة الأصلية لـ TEXT.

for hit in results[0]:
    print(f"id: {hit['id']}, score: {hit['distance']}")
    print(hit["entity"]["content"])

لمزيد من المعلومات حول وظائف BM25، وفهارس المتجهات المتفرقة، وصيغة الاستعلام للبحث عن النص الكامل، راجع «البحث عن النص الكامل».