الشروع في العمل مع Dynamiq وMilvus
Dynamiq هو إطار عمل قوي للذكاء الاصطناعي العام يعمل على تبسيط عملية تطوير التطبيقات المدعومة بالذكاء الاصطناعي. وبفضل الدعم القوي للجيل المعزز للاسترجاع (RAG) وعوامل النموذج اللغوي الكبير (LLM)، يمكّن Dynamiq المطورين من إنشاء أنظمة ذكية وديناميكية بسهولة وكفاءة.
في هذا البرنامج التعليمي، سنستكشف كيفية استخدام Dynamiq بسلاسة مع Milvus، قاعدة البيانات المتجهة عالية الأداء المصممة خصيصًا لسير عمل RAG. يتفوق Milvus في تخزين وفهرسة واسترجاع التضمينات المتجهة بكفاءة، مما يجعله مكونًا لا غنى عنه لأنظمة الذكاء الاصطناعي التي تتطلب وصولًا سريعًا ودقيقًا للبيانات السياقية.
سيغطي هذا الدليل المفصّل خطوة بخطوة مسارين أساسيين لسير عمل RAG:
تدفق فهرسة المستندات: تعرف على كيفية معالجة ملفات الإدخال (مثل ملفات PDF)، وتحويل محتواها إلى تضمينات متجهة، وتخزينها في Milvus. تضمن الاستفادة من قدرات الفهرسة عالية الأداء في Milvus أن تكون بياناتك جاهزة للاسترجاع السريع.
تدفق استرجاع المستندات: اكتشف كيفية الاستعلام عن تضمينات مستندات Milvus ذات الصلة واستخدامها لإنشاء استجابات ثاقبة مدركة للسياق مع وكلاء LLM من Dynamiq، مما يخلق تجربة مستخدم سلسة مدعومة بالذكاء الاصطناعي.
بنهاية هذا البرنامج التعليمي، ستكتسب فهمًا قويًا لكيفية عمل Milvus وDynamiq معًا لبناء أنظمة ذكاء اصطناعي قابلة للتطوير ومدركة للسياق ومصممة خصيصًا لتلبية احتياجاتك.
التحضير
قم بتنزيل المكتبات المطلوبة
$ pip install dynamiq pymilvus
إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).
تكوين وكيل LLM
سنستخدم OpenAI كعامل LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY
كمتغير بيئة.
import os
os.environ["OPENAI_API_KEY"] = "sk-***********"
RAG - تدفق فهرسة المستندات
يوضّح هذا البرنامج التعليمي سير عمل استرجاع - توليد معزز (RAG) لفهرسة المستندات باستخدام Milvus كقاعدة بيانات المتجهات. يأخذ سير العمل ملفات PDF المدخلة، ويعالجها إلى أجزاء أصغر، ويُنشئ تضمينات متجهة باستخدام نموذج تضمين OpenAI، ويخزن التضمينات في مجموعة Milvus لاسترجاعها بكفاءة.
بحلول نهاية سير العمل هذا، سيكون لديك نظام فهرسة مستندات قابل للتطوير وفعال يدعم مهام RAG المستقبلية مثل البحث الدلالي والإجابة عن الأسئلة.
استيراد المكتبات المطلوبة وتهيئة سير العمل
# Importing necessary libraries for the workflow
from io import BytesIO
from dynamiq import Workflow
from dynamiq.nodes import InputTransformer
from dynamiq.connections import (
OpenAI as OpenAIConnection,
Milvus as MilvusConnection,
MilvusDeploymentType,
)
from dynamiq.nodes.converters import PyPDFConverter
from dynamiq.nodes.splitters.document import DocumentSplitter
from dynamiq.nodes.embedders import OpenAIDocumentEmbedder
from dynamiq.nodes.writers import MilvusDocumentWriter
# Initialize the workflow
rag_wf = Workflow()
تعريف عقدة محول PDF
converter = PyPDFConverter(document_creation_mode="one-doc-per-page")
converter_added = rag_wf.flow.add_nodes(
converter
) # Add node to the DAG (Directed Acyclic Graph)
تعريف عقدة تقسيم المستند
document_splitter = DocumentSplitter(
split_by="sentence", # Splits documents into sentences
split_length=10,
split_overlap=1,
input_transformer=InputTransformer(
selector={
"documents": f"${[converter.id]}.output.documents",
},
),
).depends_on(
converter
) # Set dependency on the PDF converter
splitter_added = rag_wf.flow.add_nodes(document_splitter) # Add to the DAG
تعريف عقدة التضمين
embedder = OpenAIDocumentEmbedder(
connection=OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"]),
input_transformer=InputTransformer(
selector={
"documents": f"${[document_splitter.id]}.output.documents",
},
),
).depends_on(
document_splitter
) # Set dependency on the splitter
document_embedder_added = rag_wf.flow.add_nodes(embedder) # Add to the DAG
تعريف عقدة مخزن متجه ميلفوس الناقل
vector_store = (
MilvusDocumentWriter(
connection=MilvusConnection(
deployment_type=MilvusDeploymentType.FILE, uri="./milvus.db"
),
index_name="my_milvus_collection",
dimension=1536,
create_if_not_exist=True,
metric_type="COSINE",
)
.inputs(documents=embedder.outputs.documents) # Connect to embedder output
.depends_on(embedder) # Set dependency on the embedder
)
milvus_writer_added = rag_wf.flow.add_nodes(vector_store) # Add to the DAG
2024-11-19 22:14:03 - WARNING - Environment variable 'MILVUS_API_TOKEN' not found
2024-11-19 22:14:03 - INFO - Pass in the local path ./milvus.db, and run it using milvus-lite
2024-11-19 22:14:04 - DEBUG - Created new connection using: 0bef2849fdb1458a85df8bb9dd27f51d
2024-11-19 22:14:04 - INFO - Collection my_milvus_collection does not exist. Creating a new collection.
2024-11-19 22:14:04 - DEBUG - Successfully created collection: my_milvus_collection
2024-11-19 22:14:05 - DEBUG - Successfully created an index on collection: my_milvus_collection
2024-11-19 22:14:05 - DEBUG - Successfully created an index on collection: my_milvus_collection
يقدم Milvus نوعين من النشر، يلبيان حالات استخدام مختلفة:
- نوع النشر MilvusDeploymentType.FILE
- مثالي للنماذج الأولية المحلية أو تخزين البيانات على نطاق صغير.
- قم بتعيين
uri
إلى مسار ملف محلي (على سبيل المثال،./milvus.db
) للاستفادة من Milvus Lite، والذي يقوم تلقائيًا بتخزين جميع البيانات في الملف المحدد. - هذا خيار مناسب للإعداد والتجريب السريع.
- MilvusDeploymentType.HOST
مصمم لسيناريوهات البيانات واسعة النطاق، مثل إدارة أكثر من مليون ناقل.
خادم مستضاف ذاتياً
- نشر خادم Milvus عالي الأداء باستخدام Docker أو Kubernetes.
- قم بتكوين عنوان الخادم والمنفذ كعنوان
uri
(على سبيل المثال،http://localhost:19530
). - إذا تم تمكين المصادقة:
- قم بتوفير
<your_username>:<your_password>
كـtoken
. - إذا تم تعطيل المصادقة:
- اترك
token
غير مضبوط.
زيليز كلاود (خدمة مُدارة)
- للحصول على تجربة Milvus مُدارة بالكامل ومستندة إلى السحابة، استخدم Zilliz Cloud.
- قم بتعيين
uri
وtoken
وفقًا لنقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات المتوفرة في وحدة تحكم Zilliz Cloud.
تحديد بيانات الإدخال وتشغيل سير العمل
file_paths = ["./pdf_files/WhatisMilvus.pdf"]
input_data = {
"files": [BytesIO(open(path, "rb").read()) for path in file_paths],
"metadata": [{"filename": path} for path in file_paths],
}
# Run the workflow with the prepared input data
inserted_data = rag_wf.run(input_data=input_data)
/var/folders/09/d0hx80nj35sb5hxb5cpc1q180000gn/T/ipykernel_31319/3145804345.py:4: ResourceWarning: unclosed file <_io.BufferedReader name='./pdf_files/WhatisMilvus.pdf'>
BytesIO(open(path, "rb").read()) for path in file_paths
ResourceWarning: Enable tracemalloc to get the object allocation traceback
2024-11-19 22:14:09 - INFO - Workflow 87878444-6a3d-43f3-ae32-0127564a959f: execution started.
2024-11-19 22:14:09 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution started.
2024-11-19 22:14:09 - INFO - Node PyPDF File Converter - 6eb42b1f-7637-407b-a3ac-4167bcf3b5c4: execution started.
2024-11-19 22:14:09 - INFO - Node PyPDF File Converter - 6eb42b1f-7637-407b-a3ac-4167bcf3b5c4: execution succeeded in 58ms.
2024-11-19 22:14:09 - INFO - Node DocumentSplitter - 5baed580-6de0-4dcd-bace-d7d947ab6c7f: execution started.
/Users/jinhonglin/anaconda3/envs/myenv/lib/python3.11/site-packages/websockets/legacy/__init__.py:6: DeprecationWarning: websockets.legacy is deprecated; see https://websockets.readthedocs.io/en/stable/howto/upgrade.html for upgrade instructions
warnings.warn( # deprecated in 14.0 - 2024-11-09
/Users/jinhonglin/anaconda3/envs/myenv/lib/python3.11/site-packages/pydantic/fields.py:804: PydanticDeprecatedSince20: Using extra keyword arguments on `Field` is deprecated and will be removed. Use `json_schema_extra` instead. (Extra keys: 'is_accessible_to_agent'). Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.7/migration/
warn(
2024-11-19 22:14:09 - INFO - Node DocumentSplitter - 5baed580-6de0-4dcd-bace-d7d947ab6c7f: execution succeeded in 104ms.
2024-11-19 22:14:09 - INFO - Node OpenAIDocumentEmbedder - 91928f67-a00f-48f6-a864-f6e21672ec7e: execution started.
2024-11-19 22:14:09 - INFO - Node OpenAIDocumentEmbedder - d30a4cdc-0fab-4aff-b2e5-6161a62cb6fd: execution started.
2024-11-19 22:14:10 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
2024-11-19 22:14:10 - INFO - Node OpenAIDocumentEmbedder - d30a4cdc-0fab-4aff-b2e5-6161a62cb6fd: execution succeeded in 724ms.
2024-11-19 22:14:10 - INFO - Node MilvusDocumentWriter - dddab4cc-1dae-4e7e-9101-1ec353f530da: execution started.
2024-11-19 22:14:10 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
2024-11-19 22:14:10 - INFO - Node MilvusDocumentWriter - dddab4cc-1dae-4e7e-9101-1ec353f530da: execution succeeded in 66ms.
2024-11-19 22:14:10 - INFO - Node OpenAIDocumentEmbedder - 91928f67-a00f-48f6-a864-f6e21672ec7e: execution succeeded in 961ms.
2024-11-19 22:14:10 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution succeeded in 1.3s.
2024-11-19 22:14:10 - INFO - Workflow 87878444-6a3d-43f3-ae32-0127564a959f: execution succeeded in 1.3s.
من خلال سير العمل هذا، قمنا بنجاح بتنفيذ خط أنابيب لفهرسة المستندات باستخدام Milvus كقاعدة بيانات المتجهات ونموذج التضمين OpenAI للتمثيل الدلالي. يتيح هذا الإعداد استرجاعًا سريعًا ودقيقًا قائمًا على المتجهات، مما يشكل الأساس لسير عمل RAG مثل البحث الدلالي واسترجاع المستندات والتفاعلات السياقية القائمة على الذكاء الاصطناعي.
بفضل إمكانات التخزين القابلة للتطوير في Milvus وتنسيق Dynamiq، أصبح هذا الحل جاهزًا لكل من النماذج الأولية وعمليات النشر على نطاق واسع. يمكنك الآن توسيع خط الأنابيب هذا ليشمل مهام إضافية مثل الإجابة عن الأسئلة المستندة إلى الاسترجاع أو إنشاء محتوى يعتمد على الذكاء الاصطناعي.
تدفق استرجاع مستندات RAG
في هذا البرنامج التعليمي، ننفذ في هذا البرنامج التعليمي سير عمل استرجاع المستندات المعزز للاسترجاع (RAG). يأخذ سير العمل هذا استعلام المستخدم، ويُنشئ تضمينًا متجهًا له، ويسترجع المستندات الأكثر صلة من قاعدة بيانات Milvus vector، ويستخدم نموذجًا لغويًا كبيرًا (LLM) لإنشاء إجابة مفصلة ومدركة للسياق استنادًا إلى المستندات المسترجعة.
من خلال اتباع سير العمل هذا، ستنشئ حلاً متكاملاً للبحث الدلالي والإجابة عن الأسئلة، يجمع بين قوة استرجاع المستندات المستند إلى المتجهات وإمكانيات نماذج اللغة الكبيرة (LLM) المتقدمة من OpenAI. يتيح هذا النهج استجابات فعالة وذكية لاستعلامات المستخدم من خلال الاستفادة من المعرفة المخزنة في قاعدة بيانات المستندات.
استيراد المكتبات المطلوبة وتهيئة سير العمل
from dynamiq import Workflow
from dynamiq.connections import (
OpenAI as OpenAIConnection,
Milvus as MilvusConnection,
MilvusDeploymentType,
)
from dynamiq.nodes.embedders import OpenAITextEmbedder
from dynamiq.nodes.retrievers import MilvusDocumentRetriever
from dynamiq.nodes.llms import OpenAI
from dynamiq.prompts import Message, Prompt
# Initialize the workflow
retrieval_wf = Workflow()
تعريف اتصال OpenAI وتضمين النص
# Establish OpenAI connection
openai_connection = OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"])
# Define the text embedder node
embedder = OpenAITextEmbedder(
connection=openai_connection,
model="text-embedding-3-small",
)
# Add the embedder node to the workflow
embedder_added = retrieval_wf.flow.add_nodes(embedder)
تعريف مسترجع مستندات Milvus
document_retriever = (
MilvusDocumentRetriever(
connection=MilvusConnection(
deployment_type=MilvusDeploymentType.FILE, uri="./milvus.db"
),
index_name="my_milvus_collection",
dimension=1536,
top_k=5,
)
.inputs(embedding=embedder.outputs.embedding) # Connect to embedder output
.depends_on(embedder) # Dependency on the embedder node
)
# Add the retriever node to the workflow
milvus_retriever_added = retrieval_wf.flow.add_nodes(document_retriever)
2024-11-19 22:14:19 - WARNING - Environment variable 'MILVUS_API_TOKEN' not found
2024-11-19 22:14:19 - INFO - Pass in the local path ./milvus.db, and run it using milvus-lite
2024-11-19 22:14:19 - DEBUG - Created new connection using: 98d1132773af4298a894ad5925845fd2
2024-11-19 22:14:19 - INFO - Collection my_milvus_collection already exists. Skipping creation.
تعريف قالب الموجه
# Define the prompt template for the LLM
prompt_template = """
Please answer the question based on the provided context.
Question: {{ query }}
Context:
{% for document in documents %}
- {{ document.content }}
{% endfor %}
"""
# Create the prompt object
prompt = Prompt(messages=[Message(content=prompt_template, role="user")])
تعريف مولد الإجابة
answer_generator = (
OpenAI(
connection=openai_connection,
model="gpt-4o",
prompt=prompt,
)
.inputs(
documents=document_retriever.outputs.documents,
query=embedder.outputs.query,
)
.depends_on(
[document_retriever, embedder]
) # Dependencies on retriever and embedder
)
# Add the answer generator node to the workflow
answer_generator_added = retrieval_wf.flow.add_nodes(answer_generator)
تشغيل سير العمل
# Run the workflow with a sample query
sample_query = "What is the Advanced Search Algorithms in Milvus?"
result = retrieval_wf.run(input_data={"query": sample_query})
answer = result.output.get(answer_generator.id).get("output", {}).get("content")
print(answer)
2024-11-19 22:14:22 - INFO - Workflow f4a073fb-dfb6-499c-8cac-5710a7ad6d47: execution started.
2024-11-19 22:14:22 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution started.
2024-11-19 22:14:22 - INFO - Node OpenAITextEmbedder - 47afb0bc-cf96-429d-b58f-11b6c935fec3: execution started.
2024-11-19 22:14:23 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
2024-11-19 22:14:23 - INFO - Node OpenAITextEmbedder - 47afb0bc-cf96-429d-b58f-11b6c935fec3: execution succeeded in 474ms.
2024-11-19 22:14:23 - INFO - Node MilvusDocumentRetriever - 51c8311b-4837-411f-ba42-21e28239a2ee: execution started.
2024-11-19 22:14:23 - INFO - Node MilvusDocumentRetriever - 51c8311b-4837-411f-ba42-21e28239a2ee: execution succeeded in 23ms.
2024-11-19 22:14:23 - INFO - Node LLM - ac722325-bece-453f-a2ed-135b0749ee7a: execution started.
2024-11-19 22:14:24 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2024-11-19 22:14:24 - INFO - Node LLM - ac722325-bece-453f-a2ed-135b0749ee7a: execution succeeded in 1.8s.
2024-11-19 22:14:25 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution succeeded in 2.4s.
2024-11-19 22:14:25 - INFO - Workflow f4a073fb-dfb6-499c-8cac-5710a7ad6d47: execution succeeded in 2.4s.
The advanced search algorithms in Milvus include a variety of in-memory and on-disk indexing/search algorithms such as IVF (Inverted File), HNSW (Hierarchical Navigable Small World), and DiskANN. These algorithms have been deeply optimized to enhance performance, delivering 30%-70% better performance compared to popular implementations like FAISS and HNSWLib. These optimizations are part of Milvus's design to ensure high efficiency and scalability in handling vector data.