Dynamiq and Zilliz Cloud Integration
Dynamiq and Zilliz Cloud integrate to power fast, secure, and context-aware AI agents, combining Dynamiq's enterprise agentic AI platform with visual workflow builder and Python SDK alongside Zilliz Cloud's high-performance vector storage for scalable RAG retrieval.
무료로 이 통합 기능 사용하기Dynamiq란 무엇인가요
Dynamiq는 에이전트형 AI를 위한 엔터프라이즈 운영 플랫폼입니다. 팀이 여러 개의 별도 도구를 통합하지 않고도 프로덕션급 AI 에이전트와 RAG 워크플로를 구축, 조정 및 구현할 수 있도록 지원합니다. 시각적 드래그 앤 드롭 빌더와 오픈 소스 Python SDK를 모두 제공하여 개발자와 비즈니스 사용자가 SaaS, 프라이빗 클라우드 또는 완전한 에어 갭 환경에서 에이전트형 애플리케이션을 유연하게 확장할 수 있게 해줍니다.
Zilliz Cloud(완전 관리형 Milvus)와 통합함으로써 Dynamiq는 에이전트형 RAG 워크플로를 구동하는 고성능 벡터 저장 및 검색 기능에 액세스할 수 있으며, Zilliz의 확장 가능한 벡터 인프라와 Dynamiq의 오케스트레이션 계층을 결합하여 엔터프라이즈 지식 베이스 전반에서 작동하는 반응형 컨텍스트 인식 에이전트를 구현합니다.
Dynamiq + Zilliz Cloud 통합의 이점
- 확장 가능한 에이전트형 RAG 워크플로: Dynamiq의 오케스트레이션 계층과 Zilliz Cloud의 고성능 벡터 스토리지가 결합되어, 대규모 엔터프라이즈 지식 기반에서 실시간으로 컨텍스트를 검색할 수 있는 프로덕션급 AI 에이전트를 구현합니다.
- 이중 빌더 유연성: 팀은 Dynamiq의 시각적 드래그 앤 드롭 빌더 또는 오픈 소스 Python SDK를 사용해 RAG 워크플로를 구축할 수 있으며, 어느 접근 방식에서도 Zilliz Cloud가 벡터 스토리지를 원활하게 처리합니다.
- 안전한 엔터프라이즈 배포: 이 통합은 SaaS, 프라이빗 클라우드, 완전한 에어갭 환경을 지원하며, LLM 호출과 벡터 사용에 대한 완전한 관측 가능성과 가드레일을 제공합니다.
- 효율적인 문서 인덱싱 및 검색: Dynamiq의 Writer Node는 문서를 Zilliz Cloud로 수집하고 인덱싱하며, Retriever Node는 에이전트를 Milvus 기반 지식 베이스에 연결해 실시간 컨텍스트 검색을 지원합니다.
통합 작동 방식
Dynamiq는 오케스트레이션 플랫폼으로서, 시각적 워크플로 빌더, Python SDK, LLM 에이전트 기능을 갖춘 agentic AI 프레임워크를 제공합니다. 모듈식 노드 기반 아키텍처를 통해 문서 처리, 워크플로 오케스트레이션, 프롬프트 관리, 응답 생성을 처리합니다.
Zilliz Cloud는 벡터 데이터베이스 계층으로서, Dynamiq의 MilvusDocumentWriter 노드를 통해 문서 임베딩을 저장하고 인덱싱하며, MilvusDocumentRetriever 노드를 통해 빠른 유사도 검색을 제공합니다. 이를 통해 대규모 지식 베이스에서 관련 컨텍스트를 효율적으로 검색할 수 있습니다.
Together, Dynamiq와 Zilliz Cloud는 엔드투엔드 agentic RAG 솔루션을 만듭니다. 문서는 Dynamiq의 인덱싱 워크플로를 통해 처리, 임베딩되어 Zilliz Cloud에 저장됩니다. 사용자가 AI 에이전트와 상호작용할 때, Dynamiq의 검색 워크플로는 관련 문서 임베딩을 찾기 위해 Zilliz Cloud에 쿼리하고, 상세하고 컨텍스트를 인식하는 응답을 생성하도록 해당 컨텍스트를 LLM에 전달합니다 — 이 모든 과정은 커스텀 코드나 인프라 설정 없이 이루어집니다.
단계별 가이드
1. 필요한 라이브러리 설치
$ pip install dynamiq pymilvus2. LLM Agent 구성
이 예제에서는 OpenAI를 LLM으로 사용합니다. API 키를 환경 변수로 준비하세요:
import os os.environ["OPENAI_API_KEY"] = "sk-***********"3. 문서 인덱싱 플로우 — 라이브러리 가져오기 및 워크플로 초기화
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()4. 인덱싱 파이프라인 노드 정의
PDF 변환기, 문서 분할기, 임베딩, Milvus 벡터 스토어 노드를 정의합니다:
# PDF Converter converter = PyPDFConverter(document_creation_mode="one-doc-per-page") converter_added = rag_wf.flow.add_nodes(converter) # Document Splitter document_splitter = DocumentSplitter( split_by="sentence", split_length=10, split_overlap=1, input_transformer=InputTransformer( selector={ "documents": f"${[converter.id]}.output.documents", }, ), ).depends_on(converter) splitter_added = rag_wf.flow.add_nodes(document_splitter) # Embedding Node 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) document_embedder_added = rag_wf.flow.add_nodes(embedder) # Milvus Vector Store 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) .depends_on(embedder) ) milvus_writer_added = rag_wf.flow.add_nodes(vector_store)Milvus는 두 가지 배포 유형을 제공합니다: MilvusDeploymentType.FILE은 로컬 프로토타이핑 또는 소규모 데이터 저장에 이상적이며, Milvus Lite를 활용하기 위해
uri를 로컬 파일 경로(예:./milvus.db)로 설정합니다. MilvusDeploymentType.HOST는 대규모 데이터 시나리오를 위해 설계되었습니다. Docker 또는 Kubernetes를 사용하여 Milvus 서버를 배포하거나, Zilliz Cloud에서 Public Endpoint 및 API Key로uri와token을 설정하여 Zilliz Cloud를 사용할 수 있습니다.5. 인덱싱 워크플로 실행
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], } inserted_data = rag_wf.run(input_data=input_data)6. 문서 검색 플로우 — 노드 초기화 및 정의
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 connection and text embedder openai_connection = OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"]) embedder = OpenAITextEmbedder( connection=openai_connection, model="text-embedding-3-small", ) 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) .depends_on(embedder) ) milvus_retriever_added = retrieval_wf.flow.add_nodes(document_retriever)7. 프롬프트 및 답변 생성기 정의
prompt_template = """ Please answer the question based on the provided context. Question: {{ query }} Context: {% for document in documents %} - {{ document.content }} {% endfor %} """ 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]) ) answer_generator_added = retrieval_wf.flow.add_nodes(answer_generator)8. 검색 워크플로 실행
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)자세히 알아보기
- Dynamiq 및 Milvus 시작하기 — Dynamiq로 RAG를 구축하기 위한 공식 Milvus 튜토리얼
- Dynamiq 문서 — 공식 Dynamiq 문서
- Dynamiq GitHub 저장소 — Dynamiq 오픈 소스 SDK
- Zilliz Cloud 문서 — 관리형 Milvus를 위한 Zilliz Cloud 문서
- Milvus로 AI 앱 구축하기: 튜토리얼 및 노트북 — Milvus 튜토리얼 및 노트북에 대한 Zilliz 컬렉션


