🚀 جرب Zilliz Cloud، الـ Milvus المدارة بالكامل، مجاناً — تجربة أداء أسرع بـ 10 أضعاف! جرب الآن>>

milvus-logo
LFAI
الصفحة الرئيسية
  • عمليات الدمج
  • Home
  • Docs
  • عمليات الدمج

  • تضمين النماذج

  • محولات الجمل

البحث عن الأفلام باستخدام Milvus و SentenceTransformers

في هذا المثال، سنبحث في هذا المثال عن ملخصات حبكة الفيلم باستخدام Milvus ومكتبة SentenceTransformers. مجموعة البيانات التي سنستخدمها هي مؤامرات أفلام ويكيبيديا مع ملخصات مستضافة على HuggingFace.

لنبدأ!

المكتبات المطلوبة

في هذا المثال، سنستخدم في هذا المثال pymilvus للاتصال لاستخدام ميلفوس، و sentence-transformers لتوليد تضمينات المتجهات، و datasets لتنزيل مجموعة بيانات المثال.

pip install pymilvus sentence-transformers datasets tqdm
from datasets import load_dataset
from pymilvus import MilvusClient
from pymilvus import FieldSchema, CollectionSchema, DataType
from sentence_transformers import SentenceTransformer
from tqdm import tqdm

سنحدد بعض المعلمات العامة,

embedding_dim = 384
collection_name = "movie_embeddings"

تنزيل مجموعة البيانات وفتحها

في سطر واحد، يتيح لنا datasets تنزيل مجموعة بيانات وفتحها. ستقوم المكتبة بتخزين مجموعة البيانات مؤقتًا محليًا واستخدام تلك النسخة في المرة التالية التي يتم تشغيلها فيها. يحتوي كل صف على تفاصيل فيلم يحتوي على مقالة ويكيبيديا مصاحبة له. نستفيد من الأعمدة Title و PlotSummary و Release Year و Origin/Ethnicity.

ds = load_dataset("vishnupriyavr/wiki-movie-plots-with-summaries", split="train")
print(ds)

الاتصال بقاعدة البيانات

في هذه المرحلة، سنبدأ في إعداد ميلفوس. الخطوات كالتالي:

  1. إنشاء قاعدة بيانات ميلفوس لايت في ملف محلي. (استبدل عنوان URI هذا بعنوان الخادم الخاص بـ Milvus Standalone و Milvus Distributed).
client = MilvusClient(uri="./sentence_transformers_example.db")
  1. إنشاء مخطط البيانات. هذا يحدد الحقول التي تشكل العنصر بما في ذلك بُعد تضمين المتجه.
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    FieldSchema(name="year", dtype=DataType.INT64),
    FieldSchema(name="origin", dtype=DataType.VARCHAR, max_length=64),
]

schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
client.create_collection(collection_name=collection_name, schema=schema)
  1. تحديد خوارزمية فهرسة البحث المتجه. يدعم Milvus Lite نوع الفهرس المسطح، في حين أن Milvus Standalone وMilvus Distributed ينفذان مجموعة متنوعة من الأساليب مثل IVF وHNSW وDiskANN. بالنسبة للنطاق الصغير للبيانات في هذا العرض التوضيحي، يكفي أي نوع فهرس بحث، لذا نستخدم أبسط نوع FLAT هنا.
index_params = client.prepare_index_params()
index_params.add_index(field_name="embedding", index_type="FLAT", metric_type="IP")
client.create_index(collection_name, index_params)

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

إدراج البيانات

في هذا المثال، سنستخدم في هذا المثال نموذج SentenceTransformers miniLM لإنشاء تضمينات لنص المؤامرة. يُرجع هذا النموذج تضمينات ذات 384 بُعدًا.

model = SentenceTransformer("all-MiniLM-L12-v2")

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

for batch in tqdm(ds.batch(batch_size=512)):
    embeddings = model.encode(batch["PlotSummary"])
    data = [
        {"title": title, "embedding": embedding, "year": year, "origin": origin}
        for title, embedding, year, origin in zip(
            batch["Title"], embeddings, batch["Release Year"], batch["Origin/Ethnicity"]
        )
    ]
    res = client.insert(collection_name=collection_name, data=data)

تستغرق العملية المذكورة أعلاه وقتًا طويلًا نسبيًا لأن التضمين يستغرق وقتًا. تستغرق هذه الخطوة حوالي دقيقتين باستخدام وحدة المعالجة المركزية على جهاز MacBook Pro 2023 وستكون أسرع بكثير مع وحدات معالجة الرسومات المخصصة. خذ استراحة واستمتع بفنجان قهوة!

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

queries = [
    'A shark terrorizes an LA beach.',
    'An archaeologist searches for ancient artifacts while fighting Nazis.',
    'Teenagers in detention learn about themselves.',
    'A teenager fakes illness to get off school and have adventures with two friends.',
    'A young couple with a kid look after a hotel during winter and the husband goes insane.',
    'Four turtles fight bad guys.'
    ]

# Search the database based on input text
def embed_query(data):
    vectors = model.encode(data)
    return [x for x in vectors]


query_vectors = embed_query(queries)

res = client.search(
    collection_name=collection_name,
    data=query_vectors,
    filter='origin == "American" and year > 1945 and year < 2000',
    anns_field="embedding",
    limit=3,
    output_fields=["title"],
)

for idx, hits in enumerate(res):
    print("Query:", queries[idx])
    print("Results:")
    for hit in hits:
        print(hit["entity"].get("title"), "(", round(hit["distance"], 2), ")")
    print()

النتائج هي

Query: An archaeologist searches for ancient artifacts while fighting Nazis.
Results:
Love Slaves of the Amazons ( 0.4 )
A Time to Love and a Time to Die ( 0.39 )
The Fifth Element ( 0.39 )

Query: Teenagers in detention learn about themselves.
Results:
The Breakfast Club ( 0.54 )
Up the Academy ( 0.46 )
Fame ( 0.43 )

Query: A teenager fakes illness to get off school and have adventures with two friends.
Results:
Ferris Bueller's Day Off ( 0.48 )
Fever Lake ( 0.47 )
Losin' It ( 0.39 )

Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
Results:
The Shining ( 0.48 )
The Four Seasons ( 0.42 )
Highball ( 0.41 )

Query: Four turtles fight bad guys.
Results:
Teenage Mutant Ninja Turtles II: The Secret of the Ooze ( 0.47 )
Devil May Hare ( 0.43 )
Attack of the Giant Leeches ( 0.42 )

جرب Managed Milvus مجاناً

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

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

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