بناء RAG مع Milvus و Lepton AI
يمكّنليبتون للذكاء الاصطناعي المطورين والمؤسسات من تشغيل تطبيقات الذكاء الاصطناعي بكفاءة في دقائق، وعلى نطاق جاهز للإنتاج. يتيح لك ليبتون للذكاء الاصطناعي بناء النماذج بطريقة بايثون الأصلية، وتصحيح واختبار النماذج محلياً، ونشرها على السحابة بأمر واحد، واستهلاك النماذج في أي تطبيق باستخدام واجهة برمجة تطبيقات بسيطة ومرنة. يوفر بيئة شاملة لنشر نماذج الذكاء الاصطناعي المختلفة، بما في ذلك النماذج اللغوية الكبيرة (LLMs) ونماذج الانتشار، دون الحاجة إلى إعداد بنية تحتية واسعة النطاق.
في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط أنابيب RAG (التوليد المعزز للاسترجاع) باستخدام Milvus و Lepton AI.
الإعداد
التبعيات والبيئة
$ pip install --upgrade pymilvus[model] openai requests tqdm
إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، فقد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).
يُمكّن Lepton واجهة برمجة التطبيقات على غرار OpenAI. يمكنك تسجيل الدخول إلى موقعه الرسمي وإعداد مفتاح واجهة برمجة التطبيقات LEPTONAI_TOKEN
كمتغير بيئة.
import os
os.environ["LEPTONAI_TOKEN"] = "***********"
إعداد البيانات
نستخدم صفحات الأسئلة الشائعة من وثائق ميلفوس 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.
قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs
.
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq
. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.
from glob import glob
text_lines = []
for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
with open(file_path, "r") as file:
file_text = file.read()
text_lines += file_text.split("# ")
إعداد LLM ونموذج التضمين
يمكّن Lepton واجهة برمجة التطبيقات على غرار OpenAI، ويمكنك استخدام واجهة برمجة التطبيقات نفسها مع تعديلات طفيفة لاستدعاء LLM.
from openai import OpenAI
lepton_client = OpenAI(
api_key=os.environ["LEPTONAI_TOKEN"],
base_url="https://mistral-7b.lepton.run/api/v1/",
)
حدد نموذج تضمين لتوليد تضمينات نصية باستخدام milvus_model
. نستخدم نموذج DefaultEmbeddingFunction
كمثال، وهو نموذج تضمين خفيف الوزن ومدرب مسبقًا.
from pymilvus import model as milvus_model
embedding_model = milvus_model.DefaultEmbeddingFunction()
توليد تضمين اختباري وطباعة أبعاده والعناصر القليلة الأولى.
test_embedding = embedding_model.encode_queries(["This is a test"])[0]
embedding_dim = len(test_embedding)
print(embedding_dim)
print(test_embedding[:10])
768
[-0.04836066 0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
-0.03041712 -0.02269499 -0.02317863 -0.00426028]
تحميل البيانات في ميلفوس
إنشاء المجموعة
from pymilvus import MilvusClient
milvus_client = MilvusClient(uri="./milvus_demo.db")
collection_name = "my_rag_collection"
بالنسبة لحجة MilvusClient
:
- تعيين
uri
كملف محلي، على سبيل المثال./milvus.db
، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف. - إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثال
http://localhost:19530
، كـuri
. - إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط
uri
وtoken
، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.
if milvus_client.has_collection(collection_name):
milvus_client.drop_collection(collection_name)
قم بإنشاء مجموعة جديدة بمعلمات محددة.
إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id
للمفتاح الأساسي، وحقل vector
لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل النظام الأساسي وقيمها.
milvus_client.create_collection(
collection_name=collection_name,
dimension=embedding_dim,
metric_type="IP", # Inner product distance
consistency_level="Strong", # Strong consistency level
)
إدراج البيانات
قم بتكرار الأسطر النصية وإنشاء التضمينات، ثم أدخل البيانات في ميلفوس.
هنا حقل جديد text
، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.
from tqdm import tqdm
data = []
doc_embeddings = embedding_model.encode_documents(text_lines)
for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
data.append({"id": i, "vector": doc_embeddings[i], "text": line})
milvus_client.insert(collection_name=collection_name, data=data)
Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 1090216.20it/s]
{'insert_count': 72,
'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
'cost': 0}
بناء RAG
استرجاع البيانات لاستعلام
لنحدد سؤالًا متكررًا عن ميلفوس.
question = "How is data stored in milvus?"
ابحث عن السؤال في المجموعة واسترجع أفضل 3 مطابقات دلالية.
search_res = milvus_client.search(
collection_name=collection_name,
data=embedding_model.encode_queries(
[question]
), # Convert the question to an embedding vector
limit=3, # Return top 3 results
search_params={"metric_type": "IP", "params": {}}, # Inner product distance
output_fields=["text"], # Return the text field
)
دعونا نلقي نظرة على نتائج البحث عن الاستعلام
import json
retrieved_lines_with_distances = [
(res["entity"]["text"], res["distance"]) for res in search_res[0]
]
print(json.dumps(retrieved_lines_with_distances, indent=4))
[
[
" Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
0.6572665572166443
],
[
"How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
0.6312146186828613
],
[
"How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
0.6115777492523193
]
]
استخدم LLM للحصول على استجابة RAG
تحويل المستندات المسترجعة إلى تنسيق سلسلة.
context = "\n".join(
[line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
)
تحديد مطالبات النظام والمستخدم لنموذج لاناج. يتم تجميع هذه المطالبة مع المستندات المسترجعة من ملفوس.
SYSTEM_PROMPT = """
Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
"""
USER_PROMPT = f"""
Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
<context>
{context}
</context>
<question>
{question}
</question>
"""
استخدم نموذج mistral-7b
المقدم من ليبتون للذكاء الاصطناعي لإنشاء استجابة بناءً على المطالبات.
response = lepton_client.chat.completions.create(
model="mistral-7b",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": USER_PROMPT},
],
)
print(response.choices[0].message.content)
Inserted data in Milvus, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental logs. Milvus supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS). Metadata are generated within Milvus and stored in etcd.
عظيم! لقد نجحنا في بناء خط أنابيب RAG مع Milvus و Lepton AI.