🚀 Coba Zilliz Cloud, Milvus yang sepenuhnya terkelola, secara gratis—rasakan performa 10x lebih cepat! Coba Sekarang>>

milvus-logo
LFAI
Beranda
  • Integrasi

Open In Colab GitHub Repository

Memulai dengan Dynamiq dan Milvus

Dynamiq adalah kerangka kerja Gen AI yang kuat yang menyederhanakan pengembangan aplikasi bertenaga AI. Dengan dukungan yang kuat untuk retrieval-augmented generation (RAG) dan agen model bahasa besar (LLM), Dynamiq memberdayakan para pengembang untuk membuat sistem yang cerdas dan dinamis dengan mudah dan efisien.

Dalam tutorial ini, kita akan mengeksplorasi cara menggunakan Dynamiq dengan Milvus, basis data vektor berkinerja tinggi yang dibuat khusus untuk alur kerja RAG. Milvus unggul dalam penyimpanan, pengindeksan, dan pengambilan embedding vektor yang efisien, menjadikannya komponen yang sangat diperlukan untuk sistem AI yang menuntut akses data kontekstual yang cepat dan tepat.

Panduan langkah demi langkah ini akan membahas dua alur kerja inti RAG:

  • Alur Pengindeksan Dokumen: Mempelajari cara memproses file input (mis., PDF), mengubah kontennya menjadi embedding vektor, dan menyimpannya di Milvus. Memanfaatkan kemampuan pengindeksan berkinerja tinggi dari Milvus akan memastikan data Anda siap untuk diambil dengan cepat.

  • Alur Pengambilan Dokumen: Temukan cara meminta Milvus untuk mendapatkan sematan dokumen yang relevan dan menggunakannya untuk menghasilkan respons yang berwawasan luas dan sesuai konteks dengan agen LLM Dynamiq, sehingga menciptakan pengalaman pengguna yang didukung oleh AI yang mulus.

Di akhir tutorial ini, Anda akan mendapatkan pemahaman yang kuat tentang bagaimana Milvus dan Dynamiq bekerja sama untuk membangun sistem AI yang dapat diskalakan dan sadar konteks yang disesuaikan dengan kebutuhan Anda.

Persiapan

Unduh pustaka yang diperlukan

$ pip install dynamiq pymilvus

Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

Mengonfigurasi agen LLM

Kita akan menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

import os

os.environ["OPENAI_API_KEY"] = "sk-***********"

RAG - Alur Pengindeksan Dokumen

Tutorial ini mendemonstrasikan alur kerja Retrieval-Augmented Generation (RAG) untuk mengindeks dokumen dengan Milvus sebagai basis data vektor. Alur kerja ini mengambil file PDF masukan, memprosesnya menjadi potongan-potongan yang lebih kecil, menghasilkan penyematan vektor menggunakan model penyematan OpenAI, dan menyimpan penyematan dalam koleksi Milvus untuk pengambilan yang efisien.

Pada akhir alur kerja ini, Anda akan memiliki sistem pengindeksan dokumen yang terukur dan efisien yang mendukung tugas-tugas RAG di masa mendatang seperti pencarian semantik dan menjawab pertanyaan.

Mengimpor Pustaka yang Diperlukan dan Menginisialisasi Alur Kerja

# 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()

Tentukan Node Pengonversi 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)

Tentukan Node Pemisah Dokumen

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

Tentukan Node Penyisipan

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

Tentukan Node Penyimpanan Vektor Milvus

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 menawarkan dua jenis penerapan, yang melayani berbagai kasus penggunaan:

  1. MilvusDeploymentType.FILE
  • Ideal untuk pembuatan prototipe lokal atau penyimpanan data berskala kecil.
  • Atur uri ke jalur file lokal (misalnya, ./milvus.db) untuk memanfaatkan Milvus Lite, yang secara otomatis menyimpan semua data dalam file yang ditentukan.
  • Ini adalah opsi yang nyaman untuk pengaturan dan eksperimen cepat.
  1. MilvusDeploymentType.HOST
  • Dirancang untuk skenario data berskala besar, seperti mengelola lebih dari satu juta vektor.

    Server yang Diinangi Sendiri

    • Menerapkan server Milvus berkinerja tinggi menggunakan Docker atau Kubernetes.
    • Konfigurasikan alamat dan port server sebagai uri (mis., http://localhost:19530).
    • Jika autentikasi diaktifkan:
    • Berikan <your_username>:<your_password> sebagai token.
    • Jika autentikasi dinonaktifkan:
    • Biarkan token tidak disetel.

    Zilliz Cloud (Layanan Terkelola)

Tentukan Data Masukan dan Jalankan Alur Kerja

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.

Melalui alur kerja ini, kami telah berhasil mengimplementasikan pipeline pengindeksan dokumen menggunakan Milvus sebagai basis data vektor dan model penyematan OpenAI untuk representasi semantik. Pengaturan ini memungkinkan pengambilan berbasis vektor yang cepat dan akurat, membentuk fondasi untuk alur kerja RAG seperti pencarian semantik, pengambilan dokumen, dan interaksi berbasis AI kontekstual.

Dengan kemampuan penyimpanan yang dapat diskalakan dari Milvus dan orkestrasi Dynamiq, solusi ini siap untuk pembuatan prototipe dan penerapan produksi berskala besar. Anda sekarang dapat memperluas pipeline ini untuk menyertakan tugas tambahan seperti menjawab pertanyaan berbasis pengambilan atau pembuatan konten berbasis AI.

Alur Pengambilan Dokumen RAG

Dalam tutorial ini, kami mengimplementasikan alur kerja pengambilan dokumen Retrieval-Augmented Generation (RAG). Alur kerja ini mengambil kueri pengguna, menghasilkan penyematan vektor untuk kueri tersebut, mengambil dokumen yang paling relevan dari basis data vektor Milvus, dan menggunakan model bahasa besar (LLM) untuk menghasilkan jawaban yang terperinci dan sesuai konteks berdasarkan dokumen yang diambil.

Dengan mengikuti alur kerja ini, Anda akan membuat solusi end-to-end untuk pencarian semantik dan menjawab pertanyaan, yang menggabungkan kekuatan pengambilan dokumen berbasis vektor dengan kemampuan LLM canggih OpenAI. Pendekatan ini memungkinkan respons yang efisien dan cerdas terhadap pertanyaan pengguna dengan memanfaatkan pengetahuan yang tersimpan dalam database dokumen Anda.

Impor Pustaka yang Diperlukan dan Inisialisasi Alur Kerja

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()

Tentukan Koneksi OpenAI dan Penyemat Teks

# 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)

Tentukan Milvus Document Retriever

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.

Tentukan Templat Prompt

# 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")])

Tentukan Generator Jawaban

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)

Jalankan Alur Kerja

# 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.

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?