بناء خط أنابيب RAG: تحميل البيانات من S3 إلى ميلفوس
يرشدك هذا البرنامج التعليمي خلال عملية بناء خط أنابيب الاسترجاع-التوليد المعزز (RAG) باستخدام Milvus وAmazon S3. ستتعلم كيفية تحميل المستندات من دلو S3 بكفاءة، وتقسيمها إلى أجزاء يمكن التحكم فيها، وتخزين تضميناتها المتجهة في Milvus لاسترجاع سريع وقابل للتطوير. لتبسيط هذه العملية، سنستخدم أداة LangChain كأداة لتحميل البيانات من S3 وتسهيل تخزينها في Milvus.
التحضير
التبعيات والبيئة
$ pip install --upgrade --quiet pymilvus milvus-lite openai requests tqdm boto3 langchain langchain-core langchain-community langchain-text-splitters langchain-milvus langchain-openai bs4
إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).
سنستخدم OpenAI باعتباره LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.
import os
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
تكوين S3
لتحميل المستندات من S3، تحتاج إلى ما يلي:
- مفتاح وصول AWS والمفتاح السري: قم بتخزينها كمتغيرات بيئة للوصول الآمن إلى دلو S3 الخاص بك:
os.environ["AWS_ACCESS_KEY_ID"] = "your-aws-access-key-id"
os.environ["AWS_SECRET_ACCESS_KEY"] = "your-aws-secret-access-key"
- دلو S3 والمستند: حدد اسم الدلو واسم المستند كوسيطين لفئة
S3FileLoader.
from langchain_community.document_loaders import S3FileLoader
loader = S3FileLoader(
bucket="milvus-s3-example", # Replace with your S3 bucket name
key="WhatIsMilvus.docx", # Replace with your document file name
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
)
- تحميل المستندات: بمجرد التهيئة، يمكنك تحميل المستند من S3 إلى خط الأنابيب الخاص بك:
documents = loader.load()
تضمن هذه الخطوة تحميل مستنداتك بنجاح من S3 وجاهزة للمعالجة في خط أنابيب RAG.
تقسيم المستندات إلى أجزاء
بعد تحميل المستند، استخدم RecursiveCharacterTextSplitter الخاص بـ LangChain لتقسيم المحتوى إلى أجزاء يمكن التحكم فيها:
from langchain_text_splitters import RecursiveCharacterTextSplitter
# Initialize a RecursiveCharacterTextSplitter for splitting text into chunks
text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
# Split the documents into chunks using the text_splitter
docs = text_splitter.split_documents(documents)
# Let's take a look at the first document
docs[1]
Document(metadata={'source': 's3://milvus-s3-example/WhatIsMilvus.docx'}, page_content='Milvus offers three deployment modes, covering a wide range of data scales—from local prototyping in Jupyter Notebooks to massive Kubernetes clusters managing tens of billions of vectors: \n\nMilvus Lite is a Python library that can be easily integrated into your applications. As a lightweight version of Milvus, it’s ideal for quick prototyping in Jupyter Notebooks or running on edge devices with limited resources. Learn more.\nMilvus Standalone is a single-machine server deployment, with all components bundled into a single Docker image for convenient deployment. Learn more.\nMilvus Distributed can be deployed on Kubernetes clusters, featuring a cloud-native architecture designed for billion-scale or even larger scenarios. This architecture ensures redundancy in critical components. Learn more. \n\nWhat Makes Milvus so Fast\U0010fc00 \n\nMilvus was designed from day one to be a highly efficient vector database system. In most cases, Milvus outperforms other vector databases by 2-5x (see the VectorDBBench results). This high performance is the result of several key design decisions: \n\nHardware-aware Optimization: To accommodate Milvus in various hardware environments, we have optimized its performance specifically for many hardware architectures and platforms, including AVX512, SIMD, GPUs, and NVMe SSD. \n\nAdvanced Search Algorithms: Milvus supports a wide range of in-memory and on-disk indexing/search algorithms, including IVF, HNSW, DiskANN, and more, all of which have been deeply optimized. Compared to popular implementations like FAISS and HNSWLib, Milvus delivers 30%-70% better performance.')
في هذه المرحلة، يتم تحميل مستنداتك من S3 وتقسيمها إلى أجزاء أصغر وجاهزة لمزيد من المعالجة في خط أنابيب الاسترجاع والتوليد المعزز (RAG).
بناء سلسلة RAG مع مخزن Milvus Vector Store
سنقوم بتهيئة مخزن متجهات Milvus مع المستندات، والتي تقوم بتحميل المستندات إلى مخزن متجهات Milvus وإنشاء فهرس تحت الغطاء.
from langchain_milvus import Milvus
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectorstore = Milvus.from_documents(
documents=docs,
embedding=embeddings,
connection_args={
"uri": "./milvus_demo.db",
},
drop_old=False, # Drop the old Milvus collection if it exists
)
لـ connection_args:
تعيين
uriكملف محلي، على سبيل المثال./milvus.db، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا ملف Milvus Lite لتخزين جميع البيانات في هذا الملف.إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثال
http://localhost:19530، كـuri.إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، يرجى ضبط
uriوtoken، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
ابحث في المستندات في مخزن ميلفوس المتجه باستخدام سؤال استعلام اختباري. دعنا نلقي نظرة على أعلى 1 مستند.
query = "How can Milvus be deployed"
vectorstore.similarity_search(query, k=1)
[Document(metadata={'pk': 455631712233193487, 'source': 's3://milvus-s3-example/WhatIsMilvus.docx'}, page_content='Milvus offers three deployment modes, covering a wide range of data scales—from local prototyping in Jupyter Notebooks to massive Kubernetes clusters managing tens of billions of vectors: \n\nMilvus Lite is a Python library that can be easily integrated into your applications. As a lightweight version of Milvus, it’s ideal for quick prototyping in Jupyter Notebooks or running on edge devices with limited resources. Learn more.\nMilvus Standalone is a single-machine server deployment, with all components bundled into a single Docker image for convenient deployment. Learn more.\nMilvus Distributed can be deployed on Kubernetes clusters, featuring a cloud-native architecture designed for billion-scale or even larger scenarios. This architecture ensures redundancy in critical components. Learn more. \n\nWhat Makes Milvus so Fast\U0010fc00 \n\nMilvus was designed from day one to be a highly efficient vector database system. In most cases, Milvus outperforms other vector databases by 2-5x (see the VectorDBBench results). This high performance is the result of several key design decisions: \n\nHardware-aware Optimization: To accommodate Milvus in various hardware environments, we have optimized its performance specifically for many hardware architectures and platforms, including AVX512, SIMD, GPUs, and NVMe SSD. \n\nAdvanced Search Algorithms: Milvus supports a wide range of in-memory and on-disk indexing/search algorithms, including IVF, HNSW, DiskANN, and more, all of which have been deeply optimized. Compared to popular implementations like FAISS and HNSWLib, Milvus delivers 30%-70% better performance.')]
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
# Initialize the OpenAI language model for response generation
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# Define the prompt template for generating AI responses
PROMPT_TEMPLATE = """
Human: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.
Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
<context>
{context}
</context>
<question>
{question}
</question>
The response should be specific and use statistics or numbers when possible.
Assistant:"""
# Create a PromptTemplate instance with the defined template and input variables
prompt = PromptTemplate(
template=PROMPT_TEMPLATE, input_variables=["context", "question"]
)
# Convert the vector store to a retriever
retriever = vectorstore.as_retriever()
# Define a function to format the retrieved documents
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
استخدم LCEL (لغة تعبير سلسلة اللغات) لبناء سلسلة RAG.
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
res = rag_chain.invoke(query)
res
'Milvus can be deployed in three different modes: Milvus Lite for local prototyping and edge devices, Milvus Standalone for single-machine server deployment, and Milvus Distributed for deployment on Kubernetes clusters. These deployment modes cover a wide range of data scales, from small-scale prototyping to massive clusters managing tens of billions of vectors.'