بداية سريعة مع ميلفوس لايت
يمكن للمتجهات، وهي تنسيق بيانات المخرجات لنماذج الشبكات العصبية، ترميز المعلومات بفعالية وتؤدي دورًا محوريًا في تطبيقات الذكاء الاصطناعي مثل قاعدة المعرفة والبحث الدلالي والتوليد المعزز للاسترجاع (RAG) وغيرها.
Milvus هي قاعدة بيانات متجهة مفتوحة المصدر تناسب تطبيقات الذكاء الاصطناعي من كل الأحجام بدءًا من تشغيل روبوت دردشة تجريبي في دفتر ملاحظات Jupyter إلى بناء بحث على نطاق الويب يخدم مليارات المستخدمين. في هذا الدليل، سنرشدك في هذا الدليل إلى كيفية إعداد Milvus محليًا في غضون دقائق واستخدام مكتبة عميل Python لإنشاء المتجهات وتخزينها والبحث فيها.
تثبيت ميلفوس
في هذا الدليل نستخدم Milvus Lite، وهي مكتبة بايثون مضمنة في pymilvus
والتي يمكن تضمينها في تطبيق العميل. يدعم Milvus أيضًا النشر على Docker و Kubernetes لحالات استخدام الإنتاج.
قبل البدء، تأكد من توفر Python 3.8+ في البيئة المحلية. قم بتثبيت pymilvus
الذي يحتوي على مكتبة عميل بايثون وميلفوس لايت:
$ pip install -U pymilvus
إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل. (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، واختر "إعادة تشغيل الجلسة" من القائمة المنسدلة).
إعداد قاعدة بيانات المتجهات
لإنشاء قاعدة بيانات Milvus vector محلية، ما عليك سوى إنشاء MilvusClient
عن طريق تحديد اسم ملف لتخزين جميع البيانات، مثل "milvus_demo.db".
from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")
إنشاء مجموعة
في ميلفوس، نحتاج إلى مجموعة لتخزين المتجهات والبيانات الوصفية المرتبطة بها. يمكنك التفكير بها كجدول في قواعد بيانات SQL التقليدية. عند إنشاء مجموعة، يمكنك تحديد بارامترات المخطط والفهرس لتكوين مواصفات المتجهات مثل الأبعاد وأنواع الفهرس والمقاييس البعيدة. هناك أيضًا مفاهيم معقدة لتحسين الفهرس لأداء البحث المتجه. في الوقت الحالي، دعنا نركز فقط على الأساسيات واستخدام الافتراضي لكل شيء ممكن. كحد أدنى، ما عليك سوى تعيين اسم المجموعة وبُعد الحقل المتجه للمجموعة.
if client.has_collection(collection_name="demo_collection"):
client.drop_collection(collection_name="demo_collection")
client.create_collection(
collection_name="demo_collection",
dimension=768, # The vectors we will use in this demo has 768 dimensions
)
في الإعداد أعلاه,
- يستخدم حقلا المفتاح الأساسي والمتجه اسميهما الافتراضيين ("معرف" و"متجه").
- يتم تعيين نوع القياس (تعريف مسافة المتجه) إلى قيمته الافتراضية(COSINE).
- يقبل حقل المفتاح الأساسي الأعداد الصحيحة ولا يزيد تلقائيًا (أي لا يستخدم ميزة المعرف التلقائي) بدلاً من ذلك، يمكنك تحديد مخطط المجموعة رسميًا باتباع هذه التعليمات.
إعداد البيانات
في هذا الدليل، نستخدم المتجهات لإجراء بحث دلالي على النص. نحتاج إلى إنشاء متجهات للنص عن طريق تنزيل نماذج التضمين. يمكن القيام بذلك بسهولة باستخدام الدوال المساعدة من مكتبة pymilvus[model]
.
تمثيل النص باستخدام المتجهات
أولاً، قم بتثبيت مكتبة النماذج. تتضمن هذه الحزمة أدوات التعلم الآلي الأساسية مثل PyTorch. قد يستغرق تنزيل الحزمة بعض الوقت إذا لم يسبق لبيئتك المحلية تثبيت PyTorch.
$ pip install "pymilvus[model]"
توليد تضمينات المتجهات مع النموذج الافتراضي. يتوقع ميلفوس أن يتم إدراج البيانات منظمة كقائمة من القواميس، حيث يمثل كل قاموس سجل بيانات، ويطلق عليه اسم كيان.
from pymilvus import model
# If connection to https://huggingface.co/ failed, uncomment the following path
# import os
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
# This will download a small embedding model "paraphrase-albert-small-v2" (~50MB).
embedding_fn = model.DefaultEmbeddingFunction()
# Text strings to search from.
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
vectors = embedding_fn.encode_documents(docs)
# The output vector has 768 dimensions, matching the collection that we just created.
print("Dim:", embedding_fn.dim, vectors[0].shape) # Dim: 768 (768,)
# Each entity has id, vector representation, raw text, and a subject label that we use
# to demo metadata filtering later.
data = [
{"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
for i in range(len(vectors))
]
print("Data has", len(data), "entities, each with fields: ", data[0].keys())
print("Vector dim:", len(data[0]["vector"]))
Dim: 768 (768,)
Data has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])
Vector dim: 768
[بديل] استخدام تمثيل وهمي مع متجهات عشوائية
إذا لم تتمكن من تنزيل النموذج بسبب مشاكل في الشبكة، كحل بديل، يمكنك استخدام متجهات عشوائية لتمثيل النص مع الاستمرار في إنهاء المثال. فقط لاحظ أن نتيجة البحث لن تعكس التشابه الدلالي لأن المتجهات مزيفة.
import random
# Text strings to search from.
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
# Use fake representation with random vectors (768 dimension).
vectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]
data = [
{"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
for i in range(len(vectors))
]
print("Data has", len(data), "entities, each with fields: ", data[0].keys())
print("Vector dim:", len(data[0]["vector"]))
Data has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])
Vector dim: 768
إدراج البيانات
دعنا ندرج البيانات في المجموعة:
res = client.insert(collection_name="demo_collection", data=data)
print(res)
{'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}
البحث الدلالي
يمكننا الآن إجراء عمليات بحث دلالية من خلال تمثيل نص استعلام البحث كمتجه، وإجراء بحث تشابه المتجهات على ميلفوس.
البحث المتجه
يقبل Milvus طلب بحث متجه واحد أو عدة طلبات بحث متجه في نفس الوقت. قيمة متغير query_vectors هي قائمة من المتجهات، حيث يكون كل متجه عبارة عن مصفوفة من الأرقام العائمة.
query_vectors = embedding_fn.encode_queries(["Who is Alan Turing?"])
# If you don't have the embedding function you can use a fake vector to finish the demo:
# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]
res = client.search(
collection_name="demo_collection", # target collection
data=query_vectors, # query vectors
limit=2, # number of returned entities
output_fields=["text", "subject"], # specifies fields to be returned
)
print(res)
data: ["[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255615234375, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]"] , extra_info: {'cost': 0}
ويكون الناتج عبارة عن قائمة من النتائج، كل منها مخصص لاستعلام بحث متجه. يحتوي كل استعلام على قائمة بالنتائج، حيث تحتوي كل نتيجة على المفتاح الأساسي للكيان، والمسافة إلى متجه الاستعلام، وتفاصيل الكيان مع output_fields
.
البحث المتجه مع تصفية البيانات الوصفية
يمكنك أيضًا إجراء بحث متجه مع الأخذ في الاعتبار قيم البيانات الوصفية (تسمى حقول "قياسية" في ميلفوس، حيث تشير البيانات القياسية إلى بيانات غير متجهة). يتم ذلك باستخدام تعبير مرشح يحدد معايير معينة. لنرى كيفية البحث والتصفية باستخدام الحقل subject
في المثال التالي.
# Insert more docs in another subject.
docs = [
"Machine learning has been used for drug design.",
"Computational synthesis with AI algorithms predicts molecular properties.",
"DDR1 is involved in cancers and fibrosis.",
]
vectors = embedding_fn.encode_documents(docs)
data = [
{"id": 3 + i, "vector": vectors[i], "text": docs[i], "subject": "biology"}
for i in range(len(vectors))
]
client.insert(collection_name="demo_collection", data=data)
# This will exclude any text in "history" subject despite close to the query vector.
res = client.search(
collection_name="demo_collection",
data=embedding_fn.encode_queries(["tell me AI related information"]),
filter="subject == 'biology'",
limit=2,
output_fields=["text", "subject"],
)
print(res)
data: ["[{'id': 4, 'distance': 0.27030569314956665, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.16425910592079163, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]"] , extra_info: {'cost': 0}
بشكل افتراضي، لا تتم فهرسة الحقول العددية. إذا كنت بحاجة إلى إجراء بحث مفهرس للبيانات الوصفية في مجموعة بيانات كبيرة، يمكنك التفكير في استخدام مخطط ثابت وتشغيل الفهرس أيضًا لتحسين أداء البحث.
بالإضافة إلى البحث المتجه، يمكنك أيضًا إجراء أنواع أخرى من عمليات البحث:
الاستعلام
الاستعلام() هو عملية تسترجع جميع الكيانات المطابقة لمعيار ما، مثل تعبير مرشح أو مطابقة بعض المعرفات.
على سبيل المثال، استرداد جميع الكيانات التي يحتوي حقلها القياسي على قيمة معينة:
res = client.query(
collection_name="demo_collection",
filter="subject == 'history'",
output_fields=["text", "subject"],
)
استرداد الكيانات مباشرةً حسب المفتاح الأساسي:
res = client.query(
collection_name="demo_collection",
ids=[0, 2],
output_fields=["vector", "text", "subject"],
)
حذف الكيانات
إذا كنت ترغب في حذف البيانات، يمكنك حذف الكيانات التي تحدد المفتاح الأساسي أو حذف جميع الكيانات المطابقة لتعبير مرشح معين.
# Delete entities by primary key
res = client.delete(collection_name="demo_collection", ids=[0, 2])
print(res)
# Delete entities by a filter expression
res = client.delete(
collection_name="demo_collection",
filter="subject == 'biology'",
)
print(res)
[0, 2]
[3, 4, 5]
تحميل البيانات الموجودة
نظرًا لأن جميع بيانات Milvus Lite يتم تخزينها في ملف محلي، يمكنك تحميل جميع البيانات في الذاكرة حتى بعد انتهاء البرنامج، وذلك عن طريق إنشاء MilvusClient
بالملف الموجود. على سبيل المثال، سيؤدي ذلك إلى استرداد المجموعات من ملف "milvus_demo.db" ومتابعة كتابة البيانات فيه.
from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")
حذف المجموعة
إذا كنت ترغب في حذف جميع البيانات الموجودة في مجموعة، يمكنك إسقاط المجموعة باستخدام
# Drop collection
client.drop_collection(collection_name="demo_collection")
معرفة المزيد
يعتبر Milvus Lite رائعًا لبدء استخدام برنامج بايثون محلي. إذا كانت لديك بيانات على نطاق واسع أو ترغب في استخدام Milvus في الإنتاج، يمكنك التعرف على نشر Milvus على Docker و Kubernetes. تشترك جميع أنماط النشر في ميلفوس في نفس واجهة برمجة التطبيقات، لذلك لا تحتاج شيفرة جانب العميل إلى تغيير الكثير في حال الانتقال إلى وضع نشر آخر. ما عليك سوى تحديد URI والرمز المميز لخادم Milvus المنشور في أي مكان:
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
يوفر Milvus واجهة برمجة تطبيقات REST و gRPC، مع مكتبات العميل بلغات مثل Python و Java و Go و C# و Node.js.