توصيات الأفلام مع ميلفوس
في هذا الدفتر، سنستكشف في هذا الدفتر كيفية إنشاء تضمينات لأوصاف الأفلام باستخدام OpenAI والاستفادة من تلك التضمينات داخل Milvus للتوصية بالأفلام التي تتوافق مع تفضيلاتك. لتحسين نتائج البحث، سنستخدم التصفية لإجراء عمليات البحث عن البيانات الوصفية. يتم الحصول على مجموعة البيانات المستخدمة في هذا المثال من مجموعات بيانات HuggingFace وتحتوي على أكثر من 8000 مدخل فيلم، مما يوفر مجموعة غنية من الخيارات لتوصيات الأفلام.
التبعيات والبيئة
يمكنك تثبيت التبعيات عن طريق تشغيل الأمر التالي:
$ pip install openai pymilvus datasets tqdm
إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).
سنستخدم OpenAI باعتباره LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY
كمتغير بيئة.
import os
os.environ["OPENAI_API_KEY"] = "sk-***********"
تهيئة عميل OpenAI و Milvus
قم بتهيئة عميل OpenAI.
from openai import OpenAI
openai_client = OpenAI()
قم بتعيين اسم المجموعة والبعد للتضمينات.
COLLECTION_NAME = "movie_search"
DIMENSION = 1536
BATCH_SIZE = 1000
الاتصال بـ Milvus.
from pymilvus import MilvusClient
# Connect to Milvus Database
client = MilvusClient("./milvus_demo.db")
بالنسبة لحجة url
و token
:
- يعد تعيين
uri
كملف محلي، على سبيل المثال./milvus.db
، الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف. - إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام عنوان الخادم والمنفذ كـ uri، على سبيل المثال
http://localhost:19530
. إذا قمت بتمكين ميزة المصادقة على Milvus، فاستخدم "<your_username>: <your_password>" كرمز مميز، وإلا فلا تقم بتعيين الرمز المميز. - إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط
uri
وtoken
، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
# Remove collection if it already exists
if client.has_collection(COLLECTION_NAME):
client.drop_collection(COLLECTION_NAME)
حدد الحقول الخاصة بالمجموعة، والتي تتضمن المعرف والعنوان والنوع وسنة الإصدار والتصنيف والوصف.
from pymilvus import DataType
# Create collection which includes the id, title, and embedding.
# 1. Create schema
schema = MilvusClient.create_schema(
auto_id=True,
enable_dynamic_field=False,
)
# 2. Add fields to schema
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=64000)
schema.add_field(field_name="type", datatype=DataType.VARCHAR, max_length=64000)
schema.add_field(field_name="release_year", datatype=DataType.INT64)
schema.add_field(field_name="rating", datatype=DataType.VARCHAR, max_length=64000)
schema.add_field(field_name="description", datatype=DataType.VARCHAR, max_length=64000)
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
# 3. Create collection with the schema
client.create_collection(collection_name=COLLECTION_NAME, schema=schema)
إنشاء الفهرس على المجموعة وتحميله.
# Create the index on the collection and load it.
# 1. Prepare index parameters
index_params = client.prepare_index_params()
# 2. Add an index on the embedding field
index_params.add_index(
field_name="embedding", metric_type="IP", index_type="AUTOINDEX", params={}
)
# 3. Create index
client.create_index(collection_name=COLLECTION_NAME, index_params=index_params)
# 4. Load collection
client.load_collection(collection_name=COLLECTION_NAME, replica_number=1)
مجموعة البيانات
مع تشغيل Milvus، يمكننا البدء في الحصول على بياناتنا. Hugging Face Datasets
هو مركز يحتوي على العديد من مجموعات بيانات المستخدمين المختلفة، وفي هذا المثال نستخدم في هذا المثال مجموعة بيانات netflix-shows الخاصة بـ Netflix-shows. تحتوي مجموعة البيانات هذه على أفلام وأزواج بياناتها الوصفية لأكثر من 8 آلاف فيلم. سنقوم بتضمين كل وصف وتخزينه داخل Milvus مع عنوانه ونوعه وسنة_الإصدار والتقييم.
from datasets import load_dataset
dataset = load_dataset("hugginglearners/netflix-shows", split="train")
إدراج البيانات
الآن بعد أن أصبح لدينا بياناتنا على جهازنا يمكننا البدء في تضمينها وإدراجها في Milvus. تأخذ دالة التضمين في النص وتعيد التضمينات بتنسيق قائمة.
def emb_texts(texts):
res = openai_client.embeddings.create(input=texts, model="text-embedding-3-small")
return [res_data.embedding for res_data in res.data]
هذه الخطوة التالية تقوم بالإدراج الفعلي. نقوم بتكرار جميع الإدخالات وإنشاء دفعات نقوم بإدراجها بمجرد أن نصل إلى حجم الدفعة المحدد. بعد انتهاء الحلقة نقوم بإدراج آخر دفعة متبقية إذا كانت موجودة.
from tqdm import tqdm
# batch (data to be inserted) is a list of dictionaries
batch = []
# Embed and insert in batches
for i in tqdm(range(0, len(dataset))):
batch.append(
{
"title": dataset[i]["title"] or "",
"type": dataset[i]["type"] or "",
"release_year": dataset[i]["release_year"] or -1,
"rating": dataset[i]["rating"] or "",
"description": dataset[i]["description"] or "",
}
)
if len(batch) % BATCH_SIZE == 0 or i == len(dataset) - 1:
embeddings = emb_texts([item["description"] for item in batch])
for item, emb in zip(batch, embeddings):
item["embedding"] = emb
client.insert(collection_name=COLLECTION_NAME, data=batch)
batch = []
الاستعلام عن قاعدة البيانات
بعد إدراج بياناتنا بأمان في ميلفوس، يمكننا الآن إجراء استعلام. يأخذ الاستعلام مجموعة من وصف الفيلم الذي تبحث عنه والمرشح الذي ستستخدمه. يمكن العثور على مزيد من المعلومات حول الفلتر هنا. يطبع البحث أولاً الوصف وتعبير المرشح. بعد ذلك لكل نتيجة نقوم بطباعة النتيجة والعنوان والنوع وسنة الإصدار والتقييم ووصف الأفلام الناتجة.
import textwrap
def query(query, top_k=5):
text, expr = query
res = client.search(
collection_name=COLLECTION_NAME,
data=emb_texts(text),
filter=expr,
limit=top_k,
output_fields=["title", "type", "release_year", "rating", "description"],
search_params={
"metric_type": "IP",
"params": {},
},
)
print("Description:", text, "Expression:", expr)
for hit_group in res:
print("Results:")
for rank, hit in enumerate(hit_group, start=1):
entity = hit["entity"]
print(
f"\tRank: {rank} Score: {hit['distance']:} Title: {entity.get('title', '')}"
)
print(
f"\t\tType: {entity.get('type', '')} "
f"Release Year: {entity.get('release_year', '')} "
f"Rating: {entity.get('rating', '')}"
)
description = entity.get("description", "")
print(textwrap.fill(description, width=88))
print()
my_query = ("movie about a fluffly animal", 'release_year < 2019 and rating like "PG%"')
query(my_query)
Description: movie about a fluffly animal Expression: release_year < 2019 and rating like "PG%"
Results:
Rank: 1 Score: 0.42213767766952515 Title: The Adventures of Tintin
Type: Movie Release Year: 2011 Rating: PG
This 3-D motion capture adapts Georges Remi's classic comic strip about the adventures
of fearless young journalist Tintin and his trusty dog, Snowy.
Rank: 2 Score: 0.4041026830673218 Title: Hedgehogs
Type: Movie Release Year: 2016 Rating: PG
When a hedgehog suffering from memory loss forgets his identity, he ends up on a big
city journey with a pigeon to save his habitat from a human threat.
Rank: 3 Score: 0.3980264663696289 Title: Osmosis Jones
Type: Movie Release Year: 2001 Rating: PG
Peter and Bobby Farrelly outdo themselves with this partially animated tale about an
out-of-shape 40-year-old man who's the host to various organisms.
Rank: 4 Score: 0.39479154348373413 Title: The Lamb
Type: Movie Release Year: 2017 Rating: PG
A big-dreaming donkey escapes his menial existence and befriends some free-spirited
animal pals in this imaginative retelling of the Nativity Story.
Rank: 5 Score: 0.39370301365852356 Title: Open Season 2
Type: Movie Release Year: 2008 Rating: PG
Elliot the buck and his forest-dwelling cohorts must rescue their dachshund pal from
some spoiled pets bent on returning him to domesticity.