Open In Colab GitHub Repository

تصفية البيانات الوصفية باستخدام LlamaIndex و Milvus

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

بحلول نهاية هذا الدفتر، ستفهم كيفية استخدام ميزات التصفية في Milvus لتضييق نطاق نتائج البحث بناءً على البيانات الوصفية للمستند.

المتطلبات الأساسية

تثبيت التبعيات

قبل البدء، تأكد من تثبيت التبعيات التالية:

$ pip install llama-index-vector-stores-milvus llama-index

إذا كنت تستخدم Google Colab، فقد تحتاج إلى إعادة تشغيل وقت التشغيل (انتقل إلى قائمة "وقت التشغيل" في أعلى الواجهة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

إعداد الحسابات

يستخدم هذا البرنامج التعليمي OpenAI لتضمين النص وتوليد الإجابات. تحتاج إلى إعداد مفتاح OpenAI API.

import openai

openai.api_key = "sk-"

لاستخدام مخزن ناقلات Milvus، حدد خادم Milvus الخاص بك URI (واختيارياً مع TOKEN). لبدء تشغيل خادم Milvus، يمكنك إعداد خادم Milvus باتباع دليل تثبيت Milvus أو ببساطة تجربة Zilliz Cloud مجانًا.

URI = "./milvus_filter_demo.db"  # Use Milvus-Lite for demo purpose
# TOKEN = ""

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

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

from llama_index.core.schema import TextNode

nodes = [
    TextNode(
        text="Life: A User's Manual",
        metadata={
            "author": "Georges Perec",
            "genre": "Postmodern Fiction",
            "year": 1978,
        },
    ),
    TextNode(
        text="Life and Fate",
        metadata={
            "author": "Vasily Grossman",
            "genre": "Historical Fiction",
            "year": 1980,
        },
    ),
    TextNode(
        text="Life",
        metadata={
            "author": "Keith Richards",
            "genre": "Memoir",
            "year": 2010,
        },
    ),
    TextNode(
        text="The Life",
        metadata={
            "author": "Malcolm Knox",
            "genre": "Literary Fiction",
            "year": 2011,
        },
    ),
]

بناء الفهرس

في هذا القسم، سنقوم بتخزين بيانات العينة في Milvus باستخدام نموذج التضمين الافتراضي (OpenAI's text-embedding-ada-002). سيتم تحويل العناوين إلى تضمينات نصية وتخزينها في حقل تضمين كثيف، بينما سيتم تخزين جميع البيانات الوصفية في حقول قياسية.

from llama_index.vector_stores.milvus import MilvusVectorStore
from llama_index.core import StorageContext, VectorStoreIndex


vector_store = MilvusVectorStore(
    uri=URI,
    # token=TOKEN,
    collection_name="test_filter_collection",  # Change collection name here
    dim=1536,  # Vector dimension depends on the embedding model
    overwrite=True,  # Drop collection if exists
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex(nodes, storage_context=storage_context)
2025-04-22 08:31:09,871 [DEBUG][_create_connection]: Created new connection using: 19675caa8f894772b3db175b65d0063a (async_milvus_client.py:547)

مرشحات البيانات الوصفية

في هذا القسم، سنقوم بتطبيق فلاتر وشروط البيانات الوصفية المضمنة في LlamaIndex على بحث Milvus.

تحديد مرشحات البيانات الوصفية

from llama_index.core.vector_stores import (
    MetadataFilter,
    MetadataFilters,
    FilterOperator,
)

filters = MetadataFilters(
    filters=[
        MetadataFilter(
            key="year", value=2000, operator=FilterOperator.GT
        )  # year > 2000
    ]
)

استرجاع من مخزن المتجهات باستخدام المرشحات

retriever = index.as_retriever(filters=filters, similarity_top_k=5)
result_nodes = retriever.retrieve("Books about life")
for node in result_nodes:
    print(node.text)
    print(node.metadata)
    print("\n")
The Life
{'author': 'Malcolm Knox', 'genre': 'Literary Fiction', 'year': 2011}


Life
{'author': 'Keith Richards', 'genre': 'Memoir', 'year': 2010}

مرشحات بيانات وصفية متعددة

يمكنك أيضًا الجمع بين مرشحات بيانات وصفية متعددة لإنشاء استعلامات أكثر تعقيدًا. يدعم LlamaIndex كلاً من AND و OR شروط للجمع بين المرشحات. وهذا يسمح باسترجاع أكثر دقة ومرونة للمستندات بناءً على سمات البيانات الوصفية الخاصة بها.

الشرط AND

جرّب مثالاً لتصفية الكتب المنشورة بين عامي 1979 و2010 (تحديدًا، حيث 1979 < السنة ≤ 2010):

from llama_index.core.vector_stores import FilterCondition

filters = MetadataFilters(
    filters=[
        MetadataFilter(
            key="year", value=1979, operator=FilterOperator.GT
        ),  # year > 1979
        MetadataFilter(
            key="year", value=2010, operator=FilterOperator.LTE
        ),  # year <= 2010
    ],
    condition=FilterCondition.AND,
)

retriever = index.as_retriever(filters=filters, similarity_top_k=5)
result_nodes = retriever.retrieve("Books about life")
for node in result_nodes:
    print(node.text)
    print(node.metadata)
    print("\n")
Life and Fate
{'author': 'Vasily Grossman', 'genre': 'Historical Fiction', 'year': 1980}


Life
{'author': 'Keith Richards', 'genre': 'Memoir', 'year': 2010}

الحالة OR

جرّب مثالاً آخر يقوم بتصفية الكتب التي كتبها إما جورج بيرك أو كيث ريتشاردز:

filters = MetadataFilters(
    filters=[
        MetadataFilter(
            key="author", value="Georges Perec", operator=FilterOperator.EQ
        ),  # author is Georges Perec
        MetadataFilter(
            key="author", value="Keith Richards", operator=FilterOperator.EQ
        ),  # author is Keith Richards
    ],
    condition=FilterCondition.OR,
)

retriever = index.as_retriever(filters=filters, similarity_top_k=5)
result_nodes = retriever.retrieve("Books about life")
for node in result_nodes:
    print(node.text)
    print(node.metadata)
    print("\n")
Life
{'author': 'Keith Richards', 'genre': 'Memoir', 'year': 2010}


Life: A User's Manual
{'author': 'Georges Perec', 'genre': 'Postmodern Fiction', 'year': 1978}

استخدم حجج الكلمات المفتاحية في ميلفوس

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

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

  • المشغلات الأساسية: عوامل المقارنة وعوامل تصفية النطاق والعوامل الحسابية والعوامل المنطقية
  • قوالب تعبيرات التصفية: أنماط محددة مسبقًا لسيناريوهات التصفية الشائعة
  • المشغِّلات المتخصصة: مشغلات خاصة بنوع البيانات لحقول JSON أو المصفوفات

للحصول على وثائق شاملة وأمثلة لتعبيرات تصفية ميلفوس وأمثلة لتعبيرات تصفية ميلفوس، راجع الوثائق الرسمية لتصفية ميلفوس.

retriever = index.as_retriever(
    vector_store_kwargs={
        "string_expr": "genre like '%Fiction'",
    },
    similarity_top_k=5,
)
result_nodes = retriever.retrieve("Books about life")
for node in result_nodes:
    print(node.text)
    print(node.metadata)
    print("\n")
The Life
{'author': 'Malcolm Knox', 'genre': 'Literary Fiction', 'year': 2011}


Life and Fate
{'author': 'Vasily Grossman', 'genre': 'Historical Fiction', 'year': 1980}


Life: A User's Manual
{'author': 'Georges Perec', 'genre': 'Postmodern Fiction', 'year': 1978}

جرب Managed Milvus مجاناً

Zilliz Cloud خالي من المتاعب، ويعمل بواسطة Milvus ويعمل بسرعة 10 أضعاف.

ابدأ
التعليقات

هل كانت هذه الصفحة مفيدة؟